系统的cpu使用率很高,但是为啥找不到高cpu的应用?

通常情况下遇到服务器的cpu使用率升高我们都是会用top或者htop命令去分析.

但是在top界面,我们偶尔可能会发现有的是cpu占有率70%.而且一直居高不下.

这里我们简单展示下,然后通过 pidstat详细查看下进程.

  1. > pidstat -p 6271
  2. Linux 3.10.0-957.21.2.el7.x86_64 06/21/2020 _x86_64_ (16 CPU)
  3. 04:25:24 PM UID PID %usr %system %guest %CPU CPU Command
  4. 04:25:24 PM 0 6271 1.33 0.77 0.00 78 9 node

造成这种情况有两个原因:

1.进程在不停的重启(段错误或配置错误)

2.这些进程都是短时进程,也就是在其他应用内部通过 exec 调用的外面命令。

这个node看起来像是被其他进程调用的短时进程。我们可以用pstree树状形式展示所有进程之间的关系.

我们也可以用perf record -g,记录性能事件,然后使用 perf report查看.

execsnoop 就是一个专为短时进程设计的工具。它通过 ftrace 实时监控进程的 exec() 行为,并输出短时进程的基本信息,包括进程 PID、父进程 PID、命令行参数以及执行的结果。

我们也可以查看下获取占用CPU资源最多的10个进程:

  1. > ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head

或者获取占用内存资源最多的10个进程:

  1. > ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head

通常我都是用占用内存最高的进程命令先查看哪些进程占用了最大的资源:

  1. > ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head
  2. USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
  3. root 1864 1.4 0.9 268496 156944 ? S<sl Jun16 164:09 /usr/local/aegis/aegis_client/aegis_10_79/AliYunDun
  4. root 715 0.0 0.8 240300 140076 ? Ss Jun16 1:51 /usr/lib/systemd/systemd-journald
  5. root 27064 0.4 0.2 2808708 41020 ? Ssl 10:41 0:03 /usr/local/cloudmonitor/CmsGoAgent.linux-amd64
  6. root 1618 0.0 0.1 573924 19088 ? Ssl Jun16 1:03 /usr/bin/python2 -Es /usr/sbin/tuned -l -P
  7. root 1564 0.0 0.1 1132192 18484 ? Ssl Jun16 1:28 /usr/sbin/rsyslogd -n
  8. nobody 28146 0.3 0.1 119084 17420 ? Ssl 10:44 0:02 /usr/local/node_exporter/node_exporter

该命令组合实际上是下面两句命令:

  1. > ps aux|head -1
  2. > ps aux|grep -v PID|sort -rn -k +3|head

其中第一句主要是为了获取标题(USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND)

接下来的 grep -v PID 是将 ps aux 命令得到的标题去掉,即 grep 不包含 PID 这三个字母组合的行,再将其中结果使用sort排序。 sort -rn -k +3 该命令中的 -rnr 表示是结果倒序排列,n为以数值大小排序,而 -k +3 则是针对第3列的内容进行排序,再使用head命令获取默认前10行数据。(其中的 | 表示管道操作)

  1. PID:进程的ID
  2. USER:进程所有者
  3. PR:进程的优先级别,越小越优先被执行
  4. NInice:值
  5. VIRT:进程占用的虚拟内存
  6. RES:进程占用的物理内存
  7. SHR:进程使用的共享内存
  8. S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数
  9. %CPU:进程占用CPU的使用率
  10. %MEM:进程使用的物理内存和总内存的百分比
  11. TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。
  12. COMMAND:进程启动命令名称

我们可以根据这两个命令获取到占用服务器资源最多的进程,然后逐一排查原因解决问题.

性能测试命令

此外我们还可以使用iperfnetperf 作为网络性能测试工具,测试 TCPUDP 的吞吐量。

它们都以客户端和服务器通信的方式,测试一段时间内的平均吞吐量。