如何找出系统中load高时处于运行队列的进程nginx
系统有很高的负载可是CPU使用率却很低,或者负载很低而CPU利用率很高,这二者没有直接关系,如何用脚本统计出来处于运行队列的进程呢?bash
每隔1s统计一次:线程
#!/bin/bash LANG=C PATH=/sbin:/usr/sbin:/bin:/usr/bin interval=1 length=86400 for i in $(seq 1 $(expr ${length} / ${interval}));do date LANG=C ps -eTo stat,pid,tid,ppid,comm --no-header | sed -e 's/^ \*//' | perl -nE 'chomp;say if (m!^\S*[RD]+\s*!)' date cat /proc/loadavg echo -e "\n" sleep ${interval} done
从统计出来的结果能够看到:code
注:R表明运行中的队列,D是不可中断的睡眠进程blog
在load比较高的时候,有大量的nginx处于R或者D状态,他们才是形成load上升的元凶,和咱们底层的负载确实是没有关系的。队列
最后也给你们share一下查CPU使用率比较高的线程小脚本:进程
#!/bin/bash LANG=C PATH=/sbin:/usr/sbin:/bin:/usr/bin interval=1 length=86400 for i in $(seq 1 $(expr ${length} / ${interval}));do date LANG=C ps -eT -o%cpu,pid,tid,ppid,comm | grep -v CPU | sort -n -r | head -20 date LANG=C cat /proc/loadavg { LANG=C ps -eT -o%cpu,pid,tid,ppid,comm | sed -e 's/^ *//' | tr -s ' ' | grep -v CPU | sort -n -r | cut -d ' ' -f 1 | xargs -I{} echo -n "{} + " && echo ' 0'; } | bc -l sleep ${interval} done fuser -k $0