CPU 是另一种会被失常进程(misbehaving process)耗尽的资源。Linux支持一些能够识别并对长期占用CPU的进程施加控制的命令。

9.5.1 预备知识

ps命令能够显示出系统中进程的详细信息。这些信息包括CPU使用情况、所执行的命令、内存占用、进程状态等。可以在脚本中使用ps命令识别出在一小时内占用CPU最多的进程。关于ps命令的更多细节,请参考第10章。

9.5.2 实战演练

让我们看看用于监视并计算一小时内CPU使用情况的shell脚本:

  1. #!/bin/bash
  2. #文件名: pcpu_usage.sh
  3. #用途:计算1个小时内进程的CPU占用情况
  4. #将SECS更改成需要进行监视的总秒数
  5. #UNIT_TIME是取样的时间间隔,单位是秒
  6. SECS=3600
  7. UNIT_TIME=60
  8. STEPS=$(( $SECS / $UNIT_TIME ))
  9. echo Watching CPU usage... ;
  10. #采集数据,存入临时文件
  11. for((i=0;i<STEPS;i++))
  12. do
  13. ps -eocomm,pcpu | egrep -v '(0.0)|(%CPU)' >> /tmp/cpu_usage.$$
  14. sleep $UNIT_TIME
  15. done
  16. #处理采集到的数据
  17. echo
  18. echo CPU eaters :
  19. cat /tmp/cpu_usage.$$ | \
  20. awk '2
  21. { process[$1]+=$2; }
  22. END{
  23. for(i in process)
  24. {
  25. printf("%-20s %s\n",i, process[i]) ;
  26. }
  27. }' | sort -nrk 2 | head
  28. #删除临时日志文件
  29. rm /tmp/cpu_usage.$$

输出如下:

  1. $ ./pcpu_usage.sh
  2. Watching CPU usage...
  3. CPU eaters :
  4. Xorg 20
  5. firefox-bin 15
  6. bash 3
  7. evince 2
  8. pulseaudio 1.0
  9. pcpu.sh 0.3
  10. wpa_supplicant 0
  11. wnck-applet 0
  12. watchdog/0 0
  13. usb-storage 0

9.5.3 工作原理

CPU 的使用情况是由第一个循环负责生成的,该循环的执行时长为 1 小时( 3600 秒)。每隔 1 分钟,命令ps -eocomm,pcpu就会产生一份系统活动报告。选项-e指定采集所有进程的数据,而不仅限于本次会话的进程。选项-o指定了输出格式。其中,comm指定输出命令名,pcpu指定输出CPU占用率。ps命令为每个进程输出一行,其中包含命令名及进程当时的CPU占用率。然后使用grep过滤这些行,删除未占用CPU的行(%CPU0.0)以及头部信息COMMAND %CPU。处理后的结果被追加到临时文件中。

临时文件名为/tmp/cpu_usage.。其中,一个shell变量,值为当前脚本的进程ID(PID)。如果脚本的PID1345,那么临时文件名就是/tmp/cpu_usage.1345

统计文件在 1 小时后就准备妥当了,文件中包含了60项,分别对应每分钟的系统状态。awk计算出每个进程总的CPU使用情况并将其存入一个关联数组。该数组以进程名作为索引。最后根据总的CPU使用情况依数值执行逆序排序并利用head获得前10项。

9.5.4 参考

  • 4.6 节讲解了 awk 命令。
  • 3.13 节讲解了 tail 命令。