测量Linux CPU资源使用率并进行故障排除

时间:2020-03-21 11:46:17  来源:igfitidea点击:

跟踪CPU使用率并确定Debian Linux服务器上的繁重进程。

安装性能监控工具

安装sysstat和htop:

# apt-get update && apt-get install sysstat htop

对于RHEL/CentOS,请执行以下操作(必须启用EPEL存储库):

# yum install -y sysstat htop

sysstat软件包包含以下系统性能工具:

  • sar:收集并报告系统活动信息。
  • iostat:报告CPU利用率和磁盘I/O统计信息。
  • mpstat:报告全局和每个处理器的统计信息。
  • pidstat:报告Linux任务(进程)的统计信息。
  • sadf:以各种格式显示sar收集的数据。
  • nfsiostat:报告网络文件系统的I/O统计信息。
  • cifsiostat:报告CIFS文件系统的I/O统计信息。

确保在'/etc/default/sysstat'中启用了sar。
如果未启用,请执行此操作。

我们可能还希望将“/etc/sysstat/sysstat”中的历史记录值更改为不同于7天的值:

HISTORY=60

请注意,如果值大于28,则日志文件将保存在多个目录中,每个月一个。

默认情况下,sysstat将每10分钟收集一次数据。
我们可以通过修改cronjob'/etc/cron.d/sysstat'来更改此设置。

最后,重新启动服务:

# service sysstat restart

测量CPU使用率

top和htop的CPU使用率

顶层程序提供正在运行的系统的动态实时视图。
这对于确定在监视时使用最多CPU(而不仅仅是CPU)的进程非常有用。
要按CPU对输出进行排序,请使用“ Ctrl” +“ P”组合。

如下所示(红色),由用户sandy运行的dd命令正在使用所有CPU资源的66%。

$top
top - 20:53:16 up 3 days, 21:08,  2 users,  load average: 0.86, 0.66, 0.32
Tasks: 127 total,   2 running, 124 sleeping,   0 stopped,   1 zombie
%Cpu(s):  7.0 us, 24.7 sy, 0.0 ni, 48.9 id, 17.7 wa, 0.0 hi, 1.6 si, 0.0 st
KiB Mem:   1022744 total,  1008568 used,    14176 free,

584 buffers
KiB Swap:   991228 total,   105604 used,   885624 free,   662508 cached
  PID USER

PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND
29390 sandy     20   0  3536  560  472 R  66.0  0.1   0:10.54 dd
   23 root

20   0     0    0    0 S   5.3  0.0   1:22.64 kswapd0
 2860 mysql     20   0  321m 164m 2992 S   0.7 16.5  68:55.36 mysqld
29370 sandy     20   0  4512 1348  952 R   0.7  0.1   0:02.09 top
 1923 root

20   0  279m  96m  984 S   0.3  9.7  53:45.61 nessusd
 1945 root

20   0  2052  424  352 S   0.3  0.0   1:19.69 vnstatd
 2642 zabbix    20   0  3036  572  508 S   0.3  0.1   7:45.23 zabbix_agentd
 3103 zabbix    20   0 59872 9512 9216 S   0.3  0.9   4:07.73 zabbix_server
 3147 www-data  20   0 24132 1080  896 S   0.3  0.1   6:15.05 zmdc.pl
29346 sandy     20   0  9452 1492  816 S   0.3  0.1   0:00.35 sshd

第3行以蓝色标记,根据自上次刷新以来的时间间隔显示CPU状态百分比。
值如下(根据手册页):

  • 我们:时间运行非独立的用户进程。
  • sy:运行内核进程的时间。
  • ni:运行良好的用户进程的时间。
  • id:闲置的时间。
  • wa:等待I/O完成的时间。
  • 我们好:维修硬件中断所花费的时间。
  • si:花在服务软件中断上的时间。
  • st:虚拟机管理程序从此vm窃取的时间。

Htop是一个交互式过程查看器,与top类似。
htop的头部如下所示:

ps的CPU使用率

ps命令显示有关活动进程选择的信息。
top提供了系统资源的动态实时视图,而ps显示了当前正在运行的进程的快照。
ps命令通常是识别当前消耗最多CPU的用户的第一工具。

可以将三种不同的选项传递给ps:

  • UNIX。这些前面带有破折号(标准语法)。
  • BSD。这些不得与破折号一起使用。
  • GNU长选项。这些前面有两个破折号。

获取9个最消耗CPU的进程的快照:

$ps -eo pid,user,s,pcpu,comm --sort -pcpu | head
  PID USER     S %CPU COMMAND
 3360 zabbix   S  1.3 zabbix_server
 2041 root     S  1.2 nessusd
 3059 mysql    S  1.2 mysqld
 2395 clamav   S  0.3 freshclam
 2159 root     S  0.1 /usr/bin/monitorix
 2876 zabbix   S  0.1 zabbix_agentd
 2877 zabbix   S  0.1 zabbix_agentd
 2878 zabbix   S  0.1 zabbix_agentd
 2879 zabbix   S  0.1 zabbix_agentd

使用的参数如下:

  • -e:选择所有进程。
  • -o:指定用户定义的格式。
  • pid:进程号。
  • 用户:用户名。
  • s:最小状态显示(一个字符)。
  • S用于睡眠(空闲)。
  • R运行。
  • D用于磁盘睡眠(不间断)。
  • Z代表僵尸(等待父母读取其退出状态)。
  • T表示已跟踪或者已暂停(例如,通过SIGTSTP)。
  • W用于分页。
  • pcpu:cpu使用率。
  • comm:命令名称(仅可执行文件名称)。
  • —sort -pcpu:按降序对pcpu进行排序。

mpstat的CPU使用率

mpstat命令报告每个可用处理器的活动以及全局CPU活动。
我个人认为,在对CPU泄漏进行故障排除时,mpstat提供了最有用的输出之一。

每隔一秒显示三个CPU利用率(-u)报告:

$mpstat -u 1 3
Linux 3.2.0-4-686-pae (flames) 	20/02/14

_i686_	(2 CPU)
19:43:03     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
19:43:04     all    4.86    0.00   26.49   16.22    0.54    1.62    0.00    0.00   50.27
19:43:05     all    8.33    0.00   24.44   16.11    0.00    1.11    0.00    0.00   50.00
19:43:06     all    6.67    0.00   24.44   17.78    0.00    1.11    0.00    0.00   50.00
Average:     all    6.61    0.00   25.14   16.70    0.18    1.28    0.00    0.00   50.09

显示以下值(按手册页):

  • CPU:处理器编号。关键字all表示统计信息是所有处理器之间的平均值。
  • %usr:显示在用户级别(应用程序)执行时发生的CPU利用率百分比。
  • %nice:显示具有良好优先级的用户级别执行时发生的CPU利用率百分比。
  • %sys:显示在系统级别(内核)执行时发生的CPU利用率百分比。请注意,这不包括花在维修硬件和软件中断上的时间。
  • %iowait:显示在系统有未完成的磁盘I/O请求期间,一个或者多个CPU空闲的时间百分比。
  • %irq:显示一个或者多个CPU服务硬件中断所花费的时间百分比。
  • %soft:显示一个或者多个CPU服务软件中断所花费的时间百分比。
  • %steal:显示虚拟机管理程序为另一个虚拟处理器提供服务时,一个或者多个虚拟CPU在非自愿等待中花费的时间百分比。
  • %guest:显示一个或者多个CPU运行虚拟处理器所花费的时间百分比。
  • %idle:显示一个或者多个CPU空闲且系统没有未完成的磁盘I/O请求的时间百分比。

在多处理器系统上,我们可以通过传递-P参数并指定处理器编号来指定要为其获取报告的处理器。

每隔一秒钟显示三个处理器0和1的每个处理器(-P)CPU报告:

$mpstat -P 0,1 1 3
Linux 3.2.0-4-686-pae (flames) 	20/02/14

_i686_	(2 CPU)
19:43:16     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
19:43:17

0   21.98    0.00   62.64   14.29    0.00    1.10    0.00    0.00    0.00
19:43:17

1    0.00    0.00   11.11    0.00    0.00    0.00    0.00    0.00   88.89
19:43:18

0   20.65    0.00   61.96   15.22    0.00    1.09    0.00    0.00    1.09
19:43:18

1    2.04    0.00   10.20    7.14    0.00    0.00    0.00    0.00   80.61
19:43:19

0   18.89    0.00   66.67   14.44    0.00    0.00    0.00    0.00    0.00
19:43:19

1    1.02    0.00    8.16    0.00    0.00    0.00    0.00    0.00   90.82
Average:

0   20.51    0.00   63.74   14.65    0.00    0.73    0.00    0.00    0.37
Average:

1    1.02    0.00    9.83    2.37    0.00    0.00    0.00    0.00   86.78

因此,标记为蓝色的CPU 1正在运行,而标记为红色的CPU 0正在运行。

iostat的CPU使用率

iostat命令可以报告CPU统计信息以及设备和分区的I/O统计信息。
对于多处理器系统,CPU值是所有处理器之间的全局平均值。
iostat命令不报告每个处理器的使用情况。
在谈论CPU资源监视时,我会将iostat描述为mpstat的下一个或者简化版本。

每隔一秒显示三个CPU报告(-c):

$iostat -c 1 3
Linux 3.2.0-4-686-pae (flames) 	20/02/14

_i686_	(2 CPU)
avg-cpu:  %user   %nice %system %iowait  %steal   %idle

1.59    0.68    0.70    0.55    0.00   96.47
avg-cpu:  %user   %nice %system %iowait  %steal   %idle

9.68    0.00   32.80   10.22    0.00   47.31
avg-cpu:  %user   %nice %system %iowait  %steal   %idle

8.60    0.00   35.48    8.06    0.00   47.85

请注意,第一行给出的是自上次重新启动以来的平均值。
CPU报告具有以下格式(根据手册页):

  • %user:显示在用户级别(应用程序)执行时发生的CPU利用率百分比。
  • %nice:显示具有良好优先级的用户级别执行时发生的CPU利用率百分比。
  • %system:显示在系统级别(内核)执行时发生的CPU利用率百分比。
  • %iowait:显示在系统有未完成的磁盘I/O请求期间,一个或者多个CPU空闲的时间百分比。
  • %steal:显示虚拟机管理程序为另一个虚拟处理器提供服务时,一个或者多个虚拟CPU在非自愿等待中花费的时间百分比。
  • %idle:显示一个或者多个CPU空闲且系统没有未完成的磁盘I/O请求的时间百分比。

vmstat的CPU使用率

vmstat命令报告有关许多资源活动的信息,包括CPU,进程,内存,页面调度,块IO和磁盘活动。
请注意,报告的第一行给出了自上次重新引导以来的平均值。
默认输出显示以KB(1024B)为单位的内存。

与mpstat或者iostat相比,vmstat命令提供的CPU报告最不详尽,但通常是用于获得当前系统上发生的情况的总体概述的第一工具。

每隔一秒显示三个报告:

$vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  1  69188  13436  47032 589176    0    0    63   106  110   40  2  1 96  1
 1  0  69188  13700  47032 588840    0    0 113920     0 1642 2231 9 35 48  7
 1  0  69188  13204  47032 589516    0    0 112256     0 1633 2252 9 37 47  7

CPU活动标记为蓝色。
数字是总CPU时间的百分比。
时间值是(按手册页):

  • us:运行非内核代码所花费的时间(用户时间,包括美好的时光)。
  • sy:运行内核代码所花费的时间(系统时间)。
  • id:闲置的时间。在Linux 2.5.41之前的版本中,这包括IO等待时间。
  • wa:等待IO所花费的时间。在Linux 2.5.41之前的版本中,包含在闲置中。
  • st:从虚拟机窃取的时间(如果存在)。在Linux 2.6.11之前,未知。

sar的CPU使用率

sar命令提供系统中选定资源活动计数器的报告。

按照手册页,sar可以按指定的时间间隔(以秒为单位)以指定的次数写入信息。
如果interval参数设置为零,则sar命令显示自系统启动以来的时间的平均统计信息。
这对于分析历史数据和将来的资源容量规划非常有帮助。

每隔一秒钟显示三个实时CPU利用率(-u)报告:

$sar -u 1 3
Linux 3.2.0-4-686-pae (flames) 	20/02/14

_i686_	(2 CPU)
19:18:02

CPU     %user     %nice   %system   %iowait    %steal     %idle
19:18:03

all

7.94

0.00     35.45

8.47

0.00     48.15
19:18:04

all

6.74

0.00     39.90

7.77

0.00     45.60
19:18:05

all

9.14

0.00     34.95

8.06

0.00     47.85
Average:

all

7.92

0.00     36.80

8.10

0.00     47.18

该报告显示以下字段(按手册页):

  • %user:在用户级别(应用程序)执行时发生的CPU利用率百分比。请注意,此字段包括运行虚拟处理器所花费的时间。
  • %nice:在具有较高优先级的用户级别执行时发生的CPU利用率百分比。
  • %system:在系统级别(内核)执行时发生的CPU利用率百分比。请注意,此字段包括用于服务硬件和软件中断的时间。
  • %iowait:系统有未完成的磁盘I/O请求时,一个或者多个CPU空闲的时间百分比。
  • %steal:在管理程序为另一个虚拟处理器提供服务时,一个或者多个虚拟CPU在非自愿等待中花费的时间百分比。
  • %idle:一个或者多个CPU空闲且系统没有未完成的磁盘I/O请求的时间百分比。

ALL关键字(-u ALL)可用于显示所有CPU字段。
例如,“ sar -u ALL 1 3”应产生与“ mpstat -u 1 3”相同的报告。

提取历史CPU利用率(-u)记录开始(-s)1 PM和结束(-e)2 PM时间间隔:

$sar -u -s 13:00:00 -e 14:00:00
Linux 3.2.0-4-686-pae (flames) 	20/02/14

_i686_	(2 CPU)
13:05:01

CPU     %user     %nice   %system   %iowait    %steal     %idle
13:15:01

0.00

0.53

0.34

0.00     98.29

提取处理器0和1开始(-s)1 PM和结束(-e)2 PM时间间隔的处理器的历史每处理器(-P)统计信息:

$sar -P 0,1 -s 13:00:00 -e 14:00:00
Linux 3.2.0-4-686-pae (flames) 	20/02/14

_i686_	(2 CPU)
13:05:01

CPU     %user     %nice   %system   %iowait    %steal     %idle
13:15:01

0

0.69

0.00

0.53

0.92

0.00     97.86
13:15:01

1

0.69

0.00

0.53

0.03

0.00     98.75
13:25:01

0

0.67

0.00

0.55

0.70

0.00     98.08
13:25:01

1

0.75

0.00

0.53

0.02

0.00     98.70
13:35:01

0

2.30

0.00

0.53

0.57

0.00     96.59
13:35:01

1

0.68

0.00

0.53

0.03

0.00     98.76
13:45:01

0

0.63

0.00

0.50

0.58

0.00     98.29
13:45:01

1

0.65

0.00

0.57

0.02

0.00     98.77
13:55:01

0

0.64

0.00

0.48

0.55

0.00     98.33
13:55:01

1

0.65

0.00

0.54

0.01

0.00     98.79
Average:

0

0.99

0.00

0.52

0.66

0.00     97.83
Average:

1

0.69

0.00

0.54

0.02

0.00     98.75

可以通过从存储在“/var/log/sysstat /”下的日志文件(-f)中提取记录来显示前几天的统计信息。
例如,要获取2月18日的CPU统计信息,我们可以这样做:

$sar -u -f /var/log/sysstat/sa18

Sar是未来容量规划的不可替代的工具。
有关更多信息,请参见sar的手册页。