浅谈Linux下CPU利用率和CPU负载
来源:互联网 发布:淘宝返利哪里取消? 编辑:程序博客网 时间:2024/06/05 06:06
在Linux的内核中,有一个全局变量:Jiffies。 Jiffies代表时间。它的单位随硬件平台的不同而不同,系统里定义了一个常数HZ----代表每秒种最小时间间隔的数目。这样jiffies的单位就是1/HZ。Intel平台jiffies的单位是1/100秒,这就是系统所能分辨的最小时间间隔了。每个CPU时间片,Jiffies都要加1。 CPU的利用率就是用执行用户态+系统态的Jiffies除以总的Jifffies来表示。
*** 1.00 表示刚好是在这座桥的承受范围内。 这种情况不算糟糕,只是车流会有些堵,不过这种情况可能会造成交通越来越慢。
*** 超过 1.00,那么说明这座桥已经超出负荷,交通严重的拥堵。 那么情况有多糟糕? 例如 2.00 的情况说明车流已经超出了桥所能承受的一倍,那么将有多余过桥一倍的车辆正在焦急的等待。3.00 的话情况就更不妙了,说明这座桥基本上已经快承受不了,还有超出桥负载两倍多的车辆正在等待。
和收过桥费的管理员一样,你当然希望你的汽车(操作)不会被焦急的等待。所以,理想状态 下,都希望负载平均值小于 1.00 。当然不排除部分峰值会超过 1.00,但长此以往保持这 个状态,就说明会有问题,这时候你应该会很焦急。
所以,单处理器已经在负载的情况下,双处理器的负载满额的情况是 2.00,它还有一倍的资源可以利用。
- long@long-Ubuntu:~$ top
- top - 20:12:45 up 3:05, 6 users, load average: 1.16, 1.27, 1.14
- Tasks: 208 total, 1 running, 206 sleeping, 0 stopped, 1 zombie
- %Cpu(s): 11.8 us, 3.7 sy, 0.0 ni, 84.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
- KiB Mem: 2067372 total, 1998832 used, 68540 free, 54104 buffers
- KiB Swap: 2095100 total, 25540 used, 2069560 free, 449612 cached
- PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
- 6635 long 20 0 435m 79m 32m S 7.3 3.9 11:31.39 rhythmbox
- 4523 root 20 0 110m 61m 4804 S 5.3 3.0 8:34.14 Xorg
- 5316 long 9 -11 162m 5084 4088 S 4.3 0.2 6:01.53 pulseaudio
- 5793 long 20 0 114m 22m 13m S 4.3 1.1 0:23.38 gnome-terminal
- ……
使用“uptime”命令,效果也是类似:
- long@long-Ubuntu:~$ uptime
- 20:15:01 up 3:07, 6 users, load average: 0.43, 0.97, 1.05
负载均值与CPU利用率在两个方面有很大的区别:
第三节 如何计算CPU利用率
- long@long-Ubuntu:~$ cat /proc/stat
- cpu 426215 701 115732 2023866 27329 4 557 0 0 0
- cpu0 218177 117 57458 1013633 8620 0 6 0 0 0
- cpu1 208038 584 58274 1010233 18709 4 550 0 0 0
- intr 21217894 119 18974 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 146350 0 647836 370 86696 3 146156 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- ctxt 38682044
- btime 1362301653
- processes 10118
- procs_running 1
- procs_blocked 0
- softirq 11177991 0 6708342 2178 148765 86792 0 14537 1507468 29072 2680837
输出解释:
参数解释user (426215) 从系统启动开始累计到当前时刻,用户态的CPU时间(单位:jiffies) ,不包含 nice值为负进程。1jiffies=0.01秒nice (701)从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间(单位:jiffies)system (115732)从系统启动开始累计到当前时刻,核心时间(单位:jiffies)idle (2023866)从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间(单位:jiffies)iowait (27329)从系统启动开始累计到当前时刻,硬盘IO等待时间(单位:jiffies) ,irq (4)从系统启动开始累计到当前时刻,硬中断时间(单位:jiffies)softirq (557) 从系统启动开始累计到当前时刻,软中断时间(单位:jiffies)
CPU时间=user+system+nice+idle+iowait+irq+softirq
“intr”这行给出中断的信息,第一个为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数。
“ctxt”给出了自系统启动以来CPU发生的上下文交换的次数。
“btime”给出了从系统启动到现在为止的时间,单位为秒。
那么CPU利用率可以使用以下两个方法。先取两个采样点,然后计算其差值:
cpu usage=[(user_2 +sys_2+nice_2) - (user_1 + sys_1+nice_1)]/(total_2 - total_1)*100
第四节 对第一节中的puzzle进行解释
实际上,这些问题感觉很诡异,但是经过我一番学习之后,发现,答案其实很简单。
首先,为啥a.out和b.out显示的CPU利用率不一样?在我问我们老师Nicholas Mc Guire的邮件上,他回复“cpu utilization is a per cpu value of how much time the CPU is spending with process X” 也就是说CPU利用率是一个程序占用一个CPU处理器多少时间的百分比值!(他说的是某个进程占有的CPU利用率,如top上显示的!而我想要算的是总的的CPU利用率,但是他提到了process X !也就是说,如上面的双处理器的负载满额的情况是 2.00,我的机器是双核,所以,这里a.out和b.out算得分别是两个CPU核心上的利用率!)
而经过一段时间后,a.out和b.out显示的值都会很接近!因为,双核的计算任务不可能相差很大的!
如某一时间,a.out显示如下:
- [15:50.31] dbg: Average CPU time is 13.2
- [15:50.33] dbg: Average CPU time is 13.2
- [15:50.31] dbg: Average CPU time is 13.0
- [15:50.33] dbg: Average CPU time is 13.0
- long@long-Ubuntu:~$ top
- top - 15:40:31 up 7:01, 6 users, load average: 2.20, 2.40, 2.31
- Tasks: 208 total, 1 running, 206 sleeping, 0 stopped, 1 zombie
- %Cpu(s): 4.0 us, 1.2 sy, 94.9 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
- KiB Mem: 2067372 total, 1970184 used, 97188 free, 20812 buffers
- KiB Swap: 2095100 total, 72400 used, 2022700 free, 449896 cached
- PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
- 14944 long 39 19 19668 520 432 S 91.3 0.0 34:07.64 a.out
- 14952 long 39 19 19668 516 432 S 90.7 0.0 33:54.69 b.out
- 4597 root 20 0 99396 35m 5620 S 3.3 1.8 27:26.09 Xorg
这个观点可以通过如下方法论证:
如果我把a.out再拷贝两个副本分别叫c.out和d.out,那么top命令下,显示如下所示,a.out和b.out原来分别占90%左右,现在a.out、b.out、c.out和d.out则分别占40%左右,我们可以理解成,原先a.out占用cpu0的90%空闲时间(上文已经提到:因为我们的程序就是设置了极低的优先级,如果有任何计算任务都会打断,而如果没有计算任务,我们的程序就会占用cpu时间,所以占用的都是空间时间),而b.out占用cpu1的90%空闲时间,而现在c.out和a.out平分了cpu0的这90%空闲时间,d.out和b.out平分了cpu1的这90%空闲时间,所以,a.out、b.out、c.out和d.out此时的CPU利用率则分别占40%左右。
- long@long-Ubuntu:~$ top
- top - 15:53:44 up 7:14, 8 users, load average: 3.76, 3.01, 2.65
- Tasks: 213 total, 1 running, 211 sleeping, 0 stopped, 1 zombie
- %Cpu(s): 21.7 us, 9.5 sy, 68.8 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
- KiB Mem: 2067372 total, 1981532 used, 85840 free, 18416 buffers
- KiB Swap: 2095100 total, 75832 used, 2019268 free, 415140 cached
- PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
- 14944 long 39 19 19668 520 432 S 37.5 0.0 45:04.77 a.out
- 15856 long 39 19 19668 516 432 S 33.2 0.0 0:23.74 d.out
- 14952 long 39 19 19668 516 432 S 32.8 0.0 44:52.23 b.out
- 15803 long 39 19 19668 516 432 S 31.5 0.0 0:25.49 c.out
- 5297 long 20 0 251m 75m 20m S 20.2 3.7 15:53.31 compiz
第五节 Linux提供的一些查看系统信息的工具
4.1 老当益壮的top命令
使用top命令可以动态的查看CPU使用率。它会显示当前内核管理着的任务信息,它还会显示上线时间、负载均值、物理和交换内存使用状况。使用如下:
按Q键推出top。
- long@long-Ubuntu:~$ top
- top - 14:52:24 up 6:13, 5 users, load average: 1.06, 1.02, 1.24
- Tasks: 203 total, 1 running, 201 sleeping, 0 stopped, 1 zombie
- %Cpu(s): 27.5 us, 5.9 sy, 0.0 ni, 66.2 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
- KiB Mem: 2067372 total, 1808288 used, 259084 free, 41020 buffers
- KiB Swap: 2095100 total, 55040 used, 2040060 free, 539728 cached
- PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
- 5740 long 20 0 110m 27m 14m S 15.2 1.4 3:13.91 gnome-terminal
- 4597 root 20 0 95000 31m 4848 S 13.9 1.6 25:29.79 Xorg
- 5297 long 20 0 246m 70m 19m S 10.3 3.5 14:09.52 compiz
4.2 使用"mpstat"命令
使用这个命令,你需要先安装sysstat工具,对于Debian或Ubuntu用户,可以通过apt-get直接安装:
$ apt-get install sysstat
使用如下命令查看CPU使用率信息:
$ mpstat
- long@long-Ubuntu:~$ mpstat
- Linux 3.7.1 (long-Ubuntu) 2013年03月04日 _i686_ (2 CPU)
- 14时53分16秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
- 14时53分16秒 all 18.91 4.92 5.15 1.00 0.00 0.04 0.00 0.00 69.99
$ mpstat -P ALL
- long@long-Ubuntu:~$ mpstat -P ALL
- Linux 3.7.1 (long-Ubuntu) 2013年03月04日 _i686_ (2 CPU)
- 14时53分53秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
- 14时53分53秒 all 18.91 4.91 5.15 0.99 0.00 0.04 0.00 0.00 70.01
- 14时53分53秒 0 19.02 4.25 5.19 0.66 0.00 0.00 0.00 0.00 70.88
- 14时53分53秒 1 18.79 5.57 5.10 1.33 0.00 0.07 0.00 0.00 69.13
4.3 使用"sar"命令
使用sar命令显示CPU使用率的语法如下:
$ sar -u 2 5 ( sar [ 选项 ] [ <时间间隔> [ <次数> ] ])
这条命令会显示2秒内的CPU使用率,总共显示5次。
- long@long-Ubuntu:~$ sar -u 2 5
- Linux 3.7.1 (long-Ubuntu) 2013年03月04日 _i686_ (2 CPU)
- 14时54分22秒 CPU %user %nice %system %iowait %steal %idle
- 14时54分24秒 all 5.51 0.00 1.50 1.00 0.00 91.98
- 14时54分26秒 all 4.52 0.00 1.26 0.00 0.00 94.22
- 14时54分28秒 all 4.02 0.00 1.76 0.00 0.00 94.22
- 14时54分30秒 all 4.77 0.00 1.51 3.77 0.00 89.95
- 14时54分32秒 all 3.77 0.00 1.51 0.00 0.00 94.72
- 平均时间: all 4.52 0.00 1.51 0.95 0.00 93.02
4.4 使用"iostat"命令
"iostat"命令可以用来查询从系统启动以来的是CPU平均使用率以及设备或者分区的I/O状况:
$ iostat
- long@long-Ubuntu:~$ iostat
- Linux 3.7.1 (long-Ubuntu) 2013年03月04日 _i686_ (2 CPU)
- avg-cpu: %user %nice %system %iowait %steal %idle
- 18.89 4.90 5.18 0.99 0.00 70.04
- Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
- sda 6.75 67.08 58.24 1512659 1313268
4.5 GUI Tools 一些有图形界面的工具
KDE桌面环境有一些系统监控器一类的工具可以用来监控CPU使用率甚至更多的系统信息(比如说CPU负载状况、物理内存以及交换分区的数据占用信息),你还可以使用它来杀死一些进程。
下表总结了若干Linux下的工具:
工具
简单介绍
top
查看进程活动状态以及一些系统状况
vmstat
查看系统状态、硬件和系统信息等
iostat
查看CPU 负载,硬盘状况
sar
综合工具,查看系统状况
mpstat
查看多处理器状况
netstat
查看网络状况
iptraf
实时网络状况监测
tcpdump
抓取网络数据包,详细分析
mpstat
查看多处理器状况
tcptrace
数据包分析工具
netperf
网络带宽工具
dstat
综合工具,综合了 vmstat, iostat, ifstat, netstat 等多个信息
- 浅谈Linux下CPU利用率和CPU负载
- 浅谈Linux下CPU利用率和CPU负载
- 浅谈Linux下CPU利用率和CPU负载及其代码实现原理
- 浅谈Linux下CPU利用率和CPU负载及其代码实现原理
- Linux下CPU利用率和CPU负载(附加代码实现)
- Linux CPU负载利用率统计
- 关于CPU负载和CPU利用率
- Linux下CPU的利用率
- Linux下CPU的利用率
- 关于CPU利用率和Load Average负载
- 关于CPU利用率和Load Average负载
- Linux下获得CPU利用率和内存使用情况
- linux下获取CPU利用率和内存使用情况
- Linux下CPU负载
- cpu利用率和cpu 队列
- linux环境下cpu利用率的计算
- Linux下CPU利用率获取方法
- linux下如何获取cpu的利用率??
- 为什么Nginx的性能要比Apache高很多?
- 关于网络验证的一些思想的总结
- Android 动画-CircularReveal
- MySqL 命令2
- Spring+MyBatis实现数据库读写分离方案
- 浅谈Linux下CPU利用率和CPU负载
- JS中的类型检测
- 剑指offer——字符流中第一个不重复的字符
- swift 初用地图
- WebSocket 是什么原理?为什么可以实现持久连接?
- Android和H5交互之初学H5
- linux下安装dubbo管理控制台
- caffe中编译python一些错误及其解决方法
- 决策树