测量Linux CPU资源使用率并进行故障排除
跟踪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的手册页。