CPU使用率
概念
将CPU的时间划分为时间片,轮流执行任务,就达到了多任务同时运行的效果。CPU时间通过节拍率和节拍数来维护。节拍率单位是HZ,分为内核节拍率和用户节拍率,其中用户节拍率的值是固定的100(即1/100秒,10ms),每秒钟触发100次时间中断,没发生一次时间中断,节拍数加1
通过/proc虚拟文件系统,用户可以查看系统内部状态的信息,其中/proc/stat,可以查看系统CPU和任务统计信息,下面我们看一下CPU的:
$ cat /proc/stat | grep ^cpu
cpu 29246472 436 7061293 1189010031 844048 0 460919 0 0 0
cpu0 14567277 219 3544818 594761835 380172 0 228573 0 0 0
cpu1 14679194 217 3516475 594248196 463875 0 232346 0 0 0
其中,第一行表示总体情况。二三行分别是单个CPU的情况。从第2列到第11列表示不同场景下CPU的累计节拍数。
第一列表示CPU,剩余各列含义如下:
- user (us) 代表用户态CPU时间,不包括nice时间
- nice (ni) 好心值,表示低优先级的用户态CPU时间,可取范围是-20~19,数值越大,优先级越低
- system (sys),内核态CPU时间
- idle (id),空闲时间,不包括I/O时间
- iowait (wa) 等待I/O的CPU时间
- irq (hi) 处理硬件中断的CPU时间
- softirq (si) 处理软件中断的CPU时间
- steal (st) 偷走的时间,运行虚拟机时被占用的CPU时间
- guest (guest) 运行虚拟机的CPU时间
- guest_nice (gnice) 低优先级运行虚拟机的时间
通常所说的CPU使用率,就是CPU非空闲时间占总时间的百分比即:(CPU总时间 - CPU空闲时间) / CPU总时间
,各种性能工具基本也是这么计算的,不过它们取的是一段时间的平均值。比如,top命令采用每3秒间隔的平均值,而ps采用进程的整个生命周期。
如何查看CPU使用率
常用的命令:
- top 显示系统整体的CPU和内存使用情况,以及各个进程的资源使用情况
- top 结果默认显示所有CPU的平均值,按1,即可分别显示各CPU的值
- ps 只显示每个进程的资源使用情况
top - 18:39:24 up 74 days, 55 min, 6 users, load average: 0.01, 0.24, 0.32
Tasks: 166 total, 2 running, 164 sleeping, 0 stopped, 0 zombie
%Cpu0 : 1.3 us, 0.7 sy, 0.0 ni, 98.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 1.0 us, 0.3 sy, 0.0 ni, 98.3 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st
KiB Mem : 3881688 total, 376992 free, 3028316 used, 476380 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 592924 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7145 systemd+ 20 0 74048 17504 616 S 0.7 0.5 76:41.16 redis-server
1286 root 20 0 2516200 70764 2280 S 0.3 1.8 506:00.57 java
18684 root 20 0 436544 94692 1380 S 0.3 2.4 0:06.54 celery
...
top命令