Shell脚本可检查Linux中的内存和cpu消耗最多的进程

时间:2020-01-09 10:37:40  来源:igfitidea点击:

如果我们希望检查试验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个使用情况条目中。