cpu时间是一项重要的资源,有时,我们需要跟踪某个时间内占用cpu周期最多的进程。
在普通的桌面系统或膝上系统中,cpu处于高负荷状态也许不会引发什么问题。但对于需要处理大量请求的服务器来讲,cpu是极其重要的资源。
通过监视某个时期内cpu的使用情况,我们可以找出长期占用cpu的进程并对其进行优化,或调试其它相关问题。
在linux系统中,ps命令用于收集系统中进程的详细信息。这些信息包括cpu使用情况、正在执行的命令、内存使用、进程状态等。记录在一个小时内占用过的cpu的进程,然后通过恰当地运用ps以及文本处理就可以找出占用cpu最多的10个进程。
例子,监视并计算一小时内cpu使用情况的shell/ target=_blank class=infotextkey>shell脚本。
#!/bin/bash
# 文件名:pcpu_usage.sh
# 用途:计算1小时内进程的cpu占用情况
SECS=3600
UNIT_TIME=60
# 将SECS更改成需要进行监视的总秒数
# UNIT_TIME是取样的时间间隔,单位是秒
STEPS=$(( $SECS / $UNIT_TIME ))
echo Watching CPU usage... ;
for ((i=0;i<STEPS;i++))
do
ps -eo comm,pcpu | tail -n +2 >> /tmp/cpu_usage.$$
sleep $UNIT_TIME
done
echo
echo CPU eaters :
cat /tmp/cpu_usage.$$ |
awk '
{ process[$1]+=$2 }
END{
for(i in process)
{
printf("%-20s %s",i, process[i] ;
}
}' | sort -nrk 2 | head
rm /tmp/cpu_usage.$$
#删除临时日志文件
输出结果:
# ./pcpu_usage.sh
Watching CPU usage...
xofr 20
firefox-bin 15
bash 3
evince 2
pulseaudio 1.0
pcpu.sh 0.3
wpa_supplicant 0
wnck-applet 0
watchdog/0 0
usb-storage 0
注解:
以上脚本中,主要的输入源是ps -eo comm,pcpu,其中comm表示命令名(command name),pcpu表示cpu例用率(CPU usae in percent)。该命令输出所有进程名及CPU使用率。每个进程对应一行输出。因为需要监视一个小时内CPU的使用情况,所以我们得在一个每次迭代时间为60秒的循环中不停地使用ps -eo comm,pcpu | tail -n +2来获取CPU的使用统计数据,并将这些数据添加到文件/tmp/cpu_usage.$$中。60秒的迭代时间通过sleep 60来提供。这就使得每一分钟执行一次ps。
tail -n +2用来将ps输出中的头部和COMMAND %CPU剥除。
cpu_usage.$$中的$$表示当前脚本的进程ID。假设进程ID为1345,那么在脚本执行时,它会被替换成/tmp/cpu_usage.1345。因为这是一个临时文件,所以我们把它放在/tmp目录中。
统计文件在1小时后,准备妥当,文件中包含了60项,分别对应每分钟的进程状态。
然后用awk求出每个进程的CPU使用情况。我们用了一个关联数组来统计CPU的使用情况。其中进程名作为数组索引。
最后根据总的CPU使用情况依数值逆序排序,并通过head获得前10项的值,加以输出。
脚本学堂-原创文章,转载请注明出处。