性能之CPU定位工具介绍

本文详细介绍了Linux系统中与CPU性能相关的指标,如CPU使用率、平均负载、上下文切换等,并列举了如top、uptime、pidstat、vmstat等常用的系统监控工具的使用方法,帮助理解和排查CPU性能问题。通过这些工具,可以实时查看进程状态、内存使用、网络流量和磁盘I/O等信息,有效定位系统瓶颈。

本篇文章算是一篇读书笔记,基本上是把CPU相关的知识作了一个归纳整理,方便后续查看和排查问题。

   对于CPU来说,涉及到的主要指标包括:CPU使用率、平均负载、上下文切换、硬中断、软中断、等待io和CPU缓存,而CPU的性能问题也都是与这些指标一一对应的,下面是针对不同的指标的一个定位关联图示。

一、CPU性能指标

24fdb82a3d752b4c320659edabd944a7.png

二、常用工具介绍

ccceb5777f124f88077e856a50c9a33f.png

1、top: // 默认5s输出一次

$ top
# 进程数量 568个,有5个处于running状态,563个处于sleeping状态,线程总量是2842个(备注:zombie表示僵尸进程)
Processes: 568 total, 5 running, 563 sleeping, 2842 threads 
# Load Avg:平均负载1分钟、5分钟、15分钟的情况分别是3.21个、3.33个、3.60个
# CPU usage :CPU使用率用户态:7.77%,内核态:6.85%,闲置状态是:85.37%                                   09:26:12
Load Avg: 3.21, 3.33, 3.60  CPU usage: 7.77% user, 6.85% sys, 85.37% idle
SharedLibs: 362M resident, 41M data, 32M linkedit.
MemRegions: 330357 total, 3469M resident, 148M private, 2426M shared.
PhysMem: 16G used (2987M wired), 38M unused.
VM: 4939G vsize, 2317M framework vsize, 6032657(64) swapins, 6655146(0) swapouts.
# Networks网络:入口流量 in,出口流量 out。Disks:read磁盘读,written磁盘写。
Networks: packets: 22961127/8872M in, 25262557/4362M out. Disks: 6564652/128G read, 6301617/84G written.
# PID:进程号,COMMAND:程序名或者执行命令,%CPU:CPU占比,TIME:运行时长,TH:线程数量,WQ:io-wait等待IO数量,PPID:父进程ID,STATE:进程状态
PID    COMMAND      %CPU  TIME     #TH    #WQ  #PORTS MEM    PURG   CMPRS  PGRP  PPID  STATE
17975  iTerm2       25.3  06:47.68 7      4    343+   106M+  22M    19M-   17975 1     sleeping
151    WindowServer 22.5  10:36:59 16/1   6    3580+  707M+  348M-  80M+   151   1     running
815    �~A�~Z微� 20.9.6 0:13:39 94/3   2    25447+ 8+67M+ 2+M    628M   815   1    982 sleeping
223   �coreaudiod   9.4   44:00.51 9/1    4    505    21M    0B     10M    223   1     running
18953  top          8.4   00:04.66 1/1    0    28     7252K  0B     0B     18953 17982 running
0      kernel_task  6.7   03:01:47 217/8  0    0      295M-  0B     0B     0     0     running
8325   EasyConnect  5.6   02:40.11 30     1    361    55M+   72K    0B     8325  1     sleeping
15687  com.apple.Ap 3.5   01:03.82 3      2    78     900K   0B     0B     15687 1     sleeping
883    gamecontroll 3.2   40:47.93 3      2    87     2248K  0B     368K   883   1     sleeping
814    WeChat       3.0   88:35.76 53     12   1589+  377M+  9112K  165M   814   1     sleeping
108    wsdlpd       1.3   31:04.32 40     3    146    94M    0B     79M    108   1   leeping
1104   DLPHelperSer 1.0   08:42.41 6      2    92+    2908K+ 0B     1428K- 1104  1     sleeping
296    ESDaemonBund 0.9   44:08.64 8      3    33     82M    0B     18M    296   1     sleeping
85     JamfDaemon   0.9   18:36.32 3      2    77     57M    0B     38M    85    1     sleeping
818    wpsoffice    0.8   05:07.68 49     5    325    256M-  0B     209M-  818   1     sleeping

2.uptime:

$ uptime
15:17  up 3 days,  1:11, 2 users, load averages: 3.44 3.34 3.48
# 指标分别表示:
15:17 // 当前时间
up 3 days,  1:11 // 系统运行时间
2 users // 正在登录用户数
3.44 3.34 3.48 // 1分钟、5分钟、15分钟的平均负载

3. pidstat:

# 间隔1秒输出一组数据
$ pidstat 1
...
# UID:用户ID,PID:进程ID,%usr:用户态占比, %system:内核态占比,  %guest:运行虚拟机 CPU 使用率   %wait:io-wait指标,CPU:几号CPU,Command:程序名
04:36:24      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
04:36:25        0      6882    1.00    3.00    0.00    0.00    4.00     0  docker-containe
04:36:25      101      6947    1.00    2.00    0.00    1.00    3.00     1  nginx

4.mpstat:

显示所有CPU的指标

# 显示所有CPU的指标,并在间隔5秒输出一组数据
$ mpstat -P ALL 5 1
Linux 4.15.0 (ubuntu)     09/22/18     _x86_64_    (2 CPU)
13:41:28     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
13:41:33     all    0.21    0.00   12.07   32.67    0.00    0.21    0.00    0.00    0.00   54.84
13:41:33       0    0.43    0.00   23.87   67.53    0.00    0.43    0.00    0.00    0.00    7.74
13:41:33       1    0.00    0.00    0.81    0.20    0.00    0.00    0.00    0.00    0.00   98.99

5. vmstat

存储相关的查看工具

# 每隔1秒输出1组数据
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
0  0      0 7743608   1112  92168    0    0     0     0   52  152  0  1 100  0  0
 0  0      0 7743608   1112  92168    0    0     0     0   36   92  0  0 100  0  0

buff 和 cache 就是我们前面看到的 Buffers 和 Cache,单位是 KB。

bi 和 bo 则分别表示块设备读取和写入的大小,单位为块 / 秒。因为 Linux 中块的大小是 1KB,所以这个单位也就等价于 KB/s

6.dsstat:

# 间隔1秒输出10组数据
$ dstat 1 10
You did not select any stats, using -cdngy by default.
--total-cpu-usage-- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai stl| read  writ| recv  send|  in   out | int   csw
  0   0  96   4   0|1219k  408k|   0     0 |   0     0 |  42   885
  0   0   2  98   0|  34M    0 | 198B  790B|   0     0 |  42   138
  0   0   0 100   0|  34M    0 |  66B  342B|   0     0 |  42   135
  0   0  84  16   0|5633k    0 |  66B  342B|   0     0 |  52   177
  0   3  39  58   0|  22M    0 |  66B  342B|   0     0 |  43   144
  0   0   0 100   0|  34M    0 | 200B  450B|   0     0 |  46   147
  0   0   2  98   0|  34M    0 |  66B  342B|   0     0 |  45   134
  0   0   0 100   0|  34M    0 |  66B  342B|   0     0 |  39   131
  0   0  83  17   0|5633k    0 |  66B  342B|   0     0 |  46   168
  0   3  39  59   0|  22M    0 |  66B  342B|   0     0 |  37   134

7.查看中断

/proc/softirqs 提供了软中断的运行情况

/proc/interrupts 提供了硬中断的运行情况

# NET_RX 表示网络接收中断,而 NET_TX 表示网络发送中断
#TIMER:定时中断,SCHED:内核调度
$ cat /proc/softirqs
                    CPU0       CPU1
          HI:          0          0
       TIMER:     811613    1972736
      NET_TX:         49          7
      NET_RX:    1136736    1506885
       BLOCK:          0          0
    IRQ_POLL:          0          0
     TASKLET:     304787       3691
       SCHED:     689718    1897539
     HRTIMER:          0          0
         RCU:    1330771    1354737

8.execsnoop:是一个专为短时进程设计的工具

# 按 Ctrl+C 结束
$ execsnoop
PCOMM            PID    PPID   RET ARGS
sh               30394  30393    0
stress           30396  30394    0 /usr/local/bin/stress -t 1 -d 1
sh               30398  30393    0
stress           30399  30398    0 /usr/local/bin/stress -t 1 -d 1
sh               30402  30400    0
stress           30403  30402    0 /usr/local/bin/stress -t 1 -d 1
sh               30405  30393    0
stress           30407  30405    0 /usr/local/bin/stress -t 1 -d 1
...

https://github.com/brendangregg/perf-tools/blob/master/execsnoop

9. tcpdump

# -i eth0 只抓取eth0网卡,-n不解析协议名和主机名
# tcp port 80表示只抓取tcp协议并且端口号为80的网络帧
$ tcpdump -i eth0 -n tcp port 80
15:11:32.678966 IP 192.168.0.2.18238 > 192.168.0.30.80: Flags [S], seq 458303614, win 512, length 0
...

三、CPU问题定位顺序

这些指标都是描述系统的 CPU 性能,它们不会是完全孤立的,很多指标间都有一定的关联,下面的图可以给个很好的指导

deda089818df6eeda31124e2db04f09b.png

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值