Shell脚本可检查Linux中的内存和cpu消耗最多的进程
如果我们希望检查试验cpu和内存最多的进程,那么该怎么办,因此在本文中,我们将向前走一步,编写一个shell脚本来检查Linux中的最多CPU消耗进程和最多内存消耗进程。
检查最消耗CPU进程的工具
如果我们只想监视CPU消耗最大的进程,则可以使用各种实用程序,例如top,vmstat,sar,它们可以检查高CPU使用率进程并详细提供运行时CPU利用率状态。
top-检查高CPU使用率进程
top是系统管理员用来监视系统资源的非常有用的工具。要检查CPU消耗最大的进程,请执行top,然后按" shift + p",这将对Linux中CPU使用率高的进程进行排序并列出。如我们目前所见
top - 20:32:26 up 9:31, 3 users, load average: 0.60, 0.17, 0.30 Tasks: 120 total, 3 running, 117 sleeping, 0 stopped, 0 zombie %Cpu(s): 27.4 us, 33.6 sy, 0.0 ni, 23.4 id, 13.7 wa, 0.0 hi, 2.0 si, 0.0 st KiB Mem : 3880016 total, 2932017 free, 399832 used, 548164 buff/cache KiB Swap: 1048572 total, 1048572 free, 0 used. 3268824 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 13681 root 20 0 7312 100 0 R 99.7 0.0 0:06.42 stress 13683 root 20 0 269460 128468 124 R 99.3 3.3 0:06.41 stress 13684 root 20 0 108000 616 520 R 51.0 0.0 0:01.54 dd 427 root 0 -20 0 0 0 S 2.0 0.0 0:00.81 kworker/0:1H
如我们所见,目前stress和dd是我们最消耗CPU的进程
检查CPU使用率
sar是另一种功能强大的监视工具,大多数专业人士都在使用它(我个人最喜欢)。我写了另一篇文章,介绍了我们可以使用sar监视的所有系统资源。
要使用sar检查CPU使用率,可以使用-u
。例如检查两个间隔为1秒的CPU使用情况
# sar -u 1 2 Linux 3.10.0-1062.4.1.el7.x86_64 (server1.example.com) 01/10/2017 _x86_64_ (4 CPU) 08:45:20 PM CPU %user %nice %system %iowait %steal %idle 08:45:21 PM all 26.87 0.00 36.43 12.92 0.00 23.77 08:45:22 PM all 27.46 0.00 35.49 13.99 0.00 23.06 Average: all 27.17 0.00 35.96 13.45 0.00 23.42
同样,我们可以使用-P检查每个内核的CPU使用率。例如,要检查每个内核的CPU使用率是否有2个间隔(间隔为1秒),请使用以下命令。如我们所见," CPU0"是最常使用的,而" CPU 1-3"则主要是空闲的。我们还可以通过创建cgroup将服务分配给特定的核心,或者将CPU和其他资源分配给服务
# sar -P ALL 1 2 Linux 3.10.0-1062.4.1.el7.x86_64 (server1.example.com) 01/10/2017 _x86_64_ (4 CPU) 08:54:56 PM CPU %user %nice %system %iowait %steal %idle 08:54:57 PM all 27.32 0.00 35.31 14.43 0.00 22.94 08:54:57 PM 0 0.00 0.00 7.37 0.00 0.00 92.63 08:54:57 PM 1 1.09 0.00 39.13 59.78 0.00 0.00 08:54:57 PM 2 5.05 0.00 94.95 0.00 0.00 0.00 08:54:57 PM 3 100.00 0.00 0.00 0.00 0.00 0.00 08:54:57 PM CPU %user %nice %system %iowait %steal %idle 08:54:58 PM all 26.99 0.00 36.76 13.62 0.00 22.62 08:54:58 PM 0 0.00 0.00 9.28 0.00 0.00 90.72 08:54:58 PM 1 0.00 0.00 42.39 57.61 0.00 0.00 08:54:58 PM 2 6.93 0.00 93.07 0.00 0.00 0.00 08:54:58 PM 3 100.00 0.00 0.00 0.00 0.00 0.00 Average: CPU %user %nice %system %iowait %steal %idle Average: all 27.16 0.00 36.04 14.03 0.00 22.78 Average: 0 0.00 0.00 8.33 0.00 0.00 91.67 Average: 1 0.54 0.00 40.76 58.70 0.00 0.00 Average: 2 6.00 0.00 94.00 0.00 0.00 0.00 Average: 3 100.00 0.00 0.00 0.00 0.00 0.00
要检查每个CPU内核的CPU使用率,我们可以使用sar -P <CPU Core>
,例如,使用sar -P 0
检查`CPU0'。
检查顶部内存消耗进程的工具
与上一章类似,相同的工具也可以用来监视内存消耗最大的进程。我将给出一些使用top和sar命令的示例
另请阅读:
有关Linux内存管理和Linux中不同类型的内存的详细概述
top-检查高内存利用率进程
我们可以在终端上不带任何参数的情况下执行top,然后按shift + m来排序和打印Linux中当前的高内存利用率进程。
top - 21:05:23 up 10:04, 3 users, load average: 3.13, 3.05, 2.73 Tasks: 121 total, 5 running, 116 sleeping, 0 stopped, 0 zombie %Cpu(s): 27.5 us, 34.1 sy, 0.0 ni, 22.8 id, 14.0 wa, 0.0 hi, 1.6 si, 0.0 st KiB Mem : 3880016 total, 2457248 free, 178352 used, 1244416 buff/cache KiB Swap: 1048572 total, 1048572 free, 0 used. 3462736 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 13683 root 20 0 269460 54740 124 R 100.0 1.4 30:47.68 stress 857 root 20 0 358748 29472 7048 S 0.0 0.8 0:00.63 firewalld 1193 root 20 0 574200 17512 6136 S 0.0 0.5 0:05.59 tuned 841 polkitd 20 0 613016 12952 4892 S 0.0 0.3 0:00.07 polkitd
如我们所见,目前这里的内存使用不是很高,只有很少的进程正在消耗内存,而压力是主要的得分手。
sar-检查内存使用情况
与sar一起使用-r来检查Linux中的内存使用情况。例如,其中我将以1秒的间隔打印2个间隔的内存使用情况。
# sar -r 1 2 Linux 3.10.0-1062.4.1.el7.x86_64 (server1.example.com) 01/10/2017 _x86_64_ (4 CPU) 09:11:20 PM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty 09:11:21 PM 2274656 1605360 41.38 39156 1150276 552848 11.22 1202516 234216 0 09:11:22 PM 2337276 1542740 39.76 39156 1150276 552848 11.22 1155908 234216 0 Average: 2305966 1574050 40.57 39156 1150276 552848 11.22 1179212 234216 0
还有许多其他工具,例如vmstat,collectl,nmon等。但是,由于本文的主要目的是使用shell脚本检查CPU和内存消耗最大的进程,因此我们将跳至示例shell脚本。
检查最消耗CPU的进程的命令
我们将使用ps
来检查Linux中最消耗CPU的进程。
# ps -eocomm,pcpu | egrep -v '(0.0)|(%CPU)' kworker/0:1H 0.3 stress 99.9 stress 46.7 stress 99.9 kworker/u8:2 0.3 kworker/u8:1 0.3
我们可以在Shell脚本中利用此命令来检查消耗CPU最多的进程。
检查最高内存消耗进程的命令
其中我们还将使用ps命令来检查消耗最大内存的进程,与上面的命令相比有一点变化
# ps -eocomm,pmem | egrep -v '(0.0)|(%MEM)' systemd 0.1 polkitd 0.1 NetworkManager 0.1 tuned 0.2 java 82.1 metricbeat 1.4 rsyslogd 0.1 iscsid 0.2
其中
-e选项指定收集所有进程的数据,而不仅仅是此会话的任务。
-o选项指定输出格式。
comm,pcpu和pmem分别指定报告命令名称,CPU百分比和内存百分比。
这个" ps"命令生成一行,其中包含命令名称以及每个正在运行的进程的当前CPU和内存使用率百分比。
这些行使用grep过滤,以删除那些使用COMMAND
%CPU
标头没有CPU使用情况(%CPU
为0.0)以及没有使用COMMAND%MEM
的MEM使用情况(%MEM
为0.0)的行。标头。
Shell脚本检查一个小时内消耗最多的CPU进程
现在,我们可以在shell脚本中利用此命令来获取Linux中的顶级内存和cpu消耗进程。下面的示例脚本收集并打印一个小时内消耗CPU最多的进程。我为" Ctrl + C"添加了一个陷阱,这样,如果最终用户不想等待一个小时并且想要检查CPU利用率高的进程,那么他可以按" Ctrl + C"发送中断。
#!/bin/bash #Name: monitor_cpu_usage.sh #Description: Script to check top cpu consuming process for 1 hour #Change the SECS to total seconds to monitor CPU usage. #UNIT_TIME is the interval in seconds between each sampling function report_utilisation { # Process collected data echo echo CPU eaters : cat /tmp/cpu_usage.$$| awk ' { process[]+=; } END{ for(i in process) { printf("%-20s %sn",i, process[i]) ; } }' | sort -nrk 2 | head #Remove the temporary log file rm /tmp/cpu_usage.$$ exit 0 } trap 'report_utilisation' INT SECS=3600 UNIT_TIME=10 STEPS=$(( $SECS/$UNIT_TIME )) echo Watching CPU usage... ; # Collect data in temp file for((i=0;i<$STEPS;i++)); do ps -eocomm,pcpu | egrep -v '(0.0)|(%CPU)' >> /tmp/cpu_usage.$$ sleep $UNIT_TIME done report_utilisation
提供脚本的可执行权限
# chmod u+x /tmp/monitor_cpu_usage.sh
现在执行脚本。这为我们提供了脚本运行时的总体CPU使用率的累积值
# /tmp/monitor_cpu_usage.sh Watching CPU usage... ^C CPU eaters : stress 235.1 java 15.7 metricbeat 3.1 sshd 0.4 systemd-journal 0.1 systemd 0.1 rcu_sched 0.1 kworker/u8:0 0.1 kworker/0:1H 0.1
Shell脚本检查一个小时内消耗最多的CPU进程
我们可以通过修改某些变量和命令来检查内存消耗最大的进程,从而使用相同的脚本:
# cat /tmp/monitor_mem_usage.sh #!/bin/bash #Name: monitor_mem_usage.sh #Description: Script to check top memory consuming process for 1 hour #Change the SECS to total seconds to monitor CPU usage. #UNIT_TIME is the interval in seconds between each sampling function report_utilisation { # Process collected data echo echo Memory eaters : cat /tmp/mem_usage.$$| awk ' { process[]+=; } END{ for(i in process) { printf("%-20s %sn",i, process[i]) ; } }' | sort -nrk 2 | head #Remove the temporary log file rm /tmp/mem_usage.$$ exit 0 } trap 'report_utilisation' INT SECS=3600 UNIT_TIME=10 STEPS=$(( $SECS/$UNIT_TIME )) echo Watching Memory usage... ; # Collect data in temp file for((i=0;i<$STEPS;i++)); do ps -eocomm,pmem | egrep -v '(0.0)|(%MEM)' >> /tmp/mem_usage.$$ sleep $UNIT_TIME done report_utilisation
提供脚本的可执行权限
# chmod u+x /tmp/monitor_mem_usage.sh
现在,我们将运行脚本几分钟,然后按ctrl + C发送一个中断
# /tmp/monitor_mem_usage.sh Watching Memory usage... ^C Memory eaters : java 82.1 stress 1.6 metricbeat 1.5 tuned 0.2 iscsid 0.2 systemd 0.1 rsyslogd 0.1 polkitd 0.1 NetworkManager 0.1
该脚本如何工作?
ps -eocomm,pcpu或者ps -eocomm,pmem命令基于UNIT_TIME变量生成有关当时系统活动的报告并将其存储在临时文件中
临时文件名为
/tmp/cpu_usage。$$
。其中:$$
是一个脚本变量,用于保存当前脚本的进程ID(PID
)。例如,如果脚本的PID为1345,则临时文件将被命名为/tmp/cpu_usage.1345
。统计文件将在一小时后准备就绪,并且将包含60套条目,每分钟对应于系统状态。
" awk"脚本将每个进程的总CPU和内存使用量汇总为一个名为process的关联数组。该数组使用进程名称作为数组索引。
最后,awk会根据总的CPU和内存使用情况,使用数字逆序对结果进行排序,并使用head将报告限制在前10个使用情况条目中。