zl程序教程

您现在的位置是:首页 >  系统

当前栏目

Linux系统小技巧(2):利用ps工具统计CPU/MEM消耗高或者负载高的进程

2023-09-11 14:19:43 时间

CPU消耗高往往是系统异常的一种表现。因为平常检查系统运行有哪些进程,都是使用ps工具。因此,出现这种情况时,如果能够通过ps工具搜寻出CPU消耗高的线程,则对进一步搜寻线索或者排查应该有帮助。

下面我们讨论两个相关的小技巧。

首先,我们得了解一下进程的概念。我们都很熟悉进程了,那么,线程是什么呢?引用Andrew S. Tanenbaum的话,就是

进程认为自己独占一台主机;线程认为自己独占一颗CPU。

所以,一个进程可能包含多个线程。但是考察CPU消耗问题,只考虑进程而不考虑线程是不够的。就是说,我们总是得给ps命令加上“-T”选项。

为了便于按照CPU消耗的情况排序,我们也通过“-o”定制ps输出的字段,以确保CPU消耗占比字段是第一个字段,这样便于排序。

列出消耗高的线程

命令如下

LANG=C ps -eT -o%cpu,pid,tid,ppid,comm | grep -v CPU | sort -n -r | head -20

效果如下
_2017_07_17_16_14_48

统计线程消耗的总的CPU

命令如下

{ 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

效果如下
_2017_07_17_16_15_16

设想我们需要追踪CPU占用最好的线程,则可以这样

export LANG=C;d=$(mktemp -d) cd $d # 建并进入临时目录

# 捕捉之

strace -f -ff -s 256 -tt -T -o strace.log -p $(ps -eT -o%cpu,pid,tid,ppid,comm | grep -v CPU | sort -n -r | head -1 | sed -e s/^ *// | tr -s   | cut -d   -f 3)

线程是共享内存空间的。所以,一般情况下,没有必要使用“-T”选项。

列出内存消耗高的进程

LANG=C ps -e -o%mem,pid,tid,ppid,comm | grep -v MEM | sort -n -r | head -20

统计内存消耗情况

{ LANG=C ps -e -o%mem,pid,tid,ppid,comm | sed -e s/^ *// | tr -s   | grep -v MEM | sort -n -r | cut -d   -f 1 | xargs -I{} echo -n "{} + " echo  0; } | bc -l
列出导致CPU负载高的线程
LANG=C ps -eTo stat,pid,tid,ppid,comm,args | perl -ne chomp;if (m!^\s*(\S*[RD]+\S*.*)!) {print qq[$1\n];}

阿里云支持与服务 2136 作为全球云计算的领先者,阿里云为全球230万企业提供着云计算服务,服务范围覆盖200多个国家和地区。我们致力于为企业、政府等组织机构提供安全可靠的云计算服务,给用户带来极速愉悦的服务体验。