如何在 Linux 上监控 CPU 和内存?

深入了解单个进程或整个系统的 CPU 和内存使用情况。

作为系统管理员,您经常需要解决因 CPU/内存/网络使用率过高而导致应用程序运行缓慢或无响应的问题。 如果服务器仅托管一个进程,则很容易确定哪个进程消耗了所有资源。 然而,在一个共享服务器上,多个服务同时运行,您需要找出哪个服务正在消耗大量资源。

市面上有很多现成的监控软件。但是,如果您手头没有这些软件,或者正在寻找基于命令行的解决方案,那么您就来对地方了。这些工具都是免费的!

首选工具

您可能首先需要查看 `top` 或 `htop` 命令的结果,以获得进程的总体概览。

正如您在下面看到的,这些命令可以很好地展示所有进程的资源使用情况。例如,第一行显示 MySQL 占用了 11.9% 的 CPU 和 2.5% 的内存。

top - 11:57:33 up 0 min,  1 user,  load average: 3.69, 0.96, 0.32
Tasks: 165 total,   2 running, 113 sleeping,   0 stopped,   0 zombie
%Cpu(s): 21.0 us,  5.5 sy,  0.0 ni, 70.5 id,  1.7 wa,  0.0 hi,  1.3 si,  0.0 st
KiB Mem :  7637308 total,  5802888 free,   849512 used,   984908 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  6495648 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                        
 1986 netdata   20   0 1738856 191560  22948 S  11.6  2.5   0:02.30 mysqld                                                                                                         
 3021 www-data  20   0  255288  78420  55484 S   6.6  1.0   0:01.55 php-fpm                                                                                                        
 3138 www-data  20   0  253096  79780  59228 S   6.6  1.0   0:00.92 php-fpm                                                                                                        
 3153 www-data  20   0  255116  79088  56472 S   5.0  1.0   0:00.70 php-fpm                                                                                                        
 3037 www-data  20   0  257200  81088  56216 S   4.3  1.1   0:01.50 php-fpm                                                                                                        
 3048 www-data  20   0  257088  78740  55380 S   4.3  1.0   0:01.46 php-fpm                                                                                                        
 3054 www-data  20   0  254160  72168  52108 S   3.7  0.9   0:01.32 php-fpm                                                                                                        
 3135 www-data  20   0  255084  75912  54836 S   3.7  1.0   0:00.91 php-fpm                                                                                                        
 3051 www-data  20   0  254096  73804  51964 S   3.0  1.0   0:01.38 php-fpm                                                                                                        
 2962 www-data  20   0   45280   7284   3488 R   2.0  0.1   0:00.22 openresty                                                                                                      
 1062 netdata   20   0  338748  76144   6720 S   1.0  1.0   0:01.31 netdata                                                                                                        
 1702 netdata   20   0   21852   4232   2352 S   1.0  0.1   0:00.34 apps.plugin                                                                                                    
 1729 netdata   20   0   18636   3280   2764 S   0.7  0.0   0:00.05 bash                                                                                                           
 1980 netdata   20   0   62008  12896   5796 S   0.7  0.2   0:00.14 redis-server                                                                                                   
   11 root      20   0       0      0      0 I   0.3  0.0   0:00.14 rcu_sched                                                                                                      
 1007 root      20   0 1347424  74524  38872 S   0.3  1.0   0:00.92 dockerd                                                                                                        
 1857 root      20   0   10600   5564   4276 S   0.3  0.1   0:00.03 containerd-shim                                                                                                
 2045 root      20   0    9948   6028   5016 S   0.3  0.1   0:00.14 forego                                                                                                         
 2934 root      20   0   13616   8760   5928 S   0.3  0.1   0:00.07 docker-gen                                                                                                     
 2966 systemd+  20   0   25784   7924   2340 S   0.3  0.1   0:00.06 nginx

几乎所有的 Linux 发行版都预装了 `top` 命令。

一旦您确定了可疑进程,您可能希望专注于该进程,而不是像上面那样查看所有进程。您仍然可以使用 `top` 命令,但需要添加一些参数。

假设您知道进程 ID (PID),您可以使用以下命令。

`top -p $PID`

下面是一个 `top -p 3102` 的示例:

top - 11:59:56 up 3 min,  1 user,  load average: 0.72, 0.70, 0.31
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
%Cpu(s):  7.1 us,  2.9 sy,  0.0 ni, 89.1 id,  0.3 wa,  0.0 hi,  0.7 si,  0.0 st
KiB Mem :  7637308 total,  5802024 free,   783672 used,  1051612 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  6555636 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                        
 3102 www-data  20   0  329500  82376  60640 S   0.0  1.1   0:03.35 php-fpm

您也可以将 `grep` 与 `top` 命令结合使用。下面是一个使用 `grep` 检查 Docker 利用率的示例。

[email protected]:~# top | grep docker
 1007 root      20   0 1347424  74524  38872 S   0.3  1.0   0:01.38 dockerd                                                                                                        
 2934 root      20   0   14676   9652   5928 S   0.3  0.1   0:00.54 docker-gen                                                                                                     
 1007 root      20   0 1347424  74524  38872 S   0.3  1.0   0:01.39 dockerd                                                                                                        
 1007 root      20   0 1347424  74524  38872 S   1.0  1.0   0:01.42 dockerd                                                                                                        
 2934 root      20   0   14740   9652   5928 S   0.3  0.1   0:00.55 docker-gen                                                                                                     
 2934 root      20   0   14740   9652   5928 S   0.3  0.1   0:00.56 docker-gen

htop

`htop` 命令类似于 `top`,但提供了更多信息。 值得注意的是,它有命令列,方便您识别进程的路径。而且它有彩色显示界面,更加直观。

默认情况下可能不会安装 `htop`,但您可以按照以下方式进行安装。

在 Ubuntu 上安装 `htop`

apt-get install htop

在 CentOS/RHEL 8.x 上安装 `htop`

dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
dnf update
dnf install htop

Glances

顾名思义,`glances` 可以让您在单个屏幕上查看系统资源利用率。 正在运行的进程会按照 CPU 使用率进行排序。

您可以使用 DNF 在 CentOS 8 上安装 `Glances`,如下所示。

dnf install glances

对于 CentOS 7,您可以使用 YUM。

yum install glances

atop

`atop` 命令类似于上面列出的命令,但它有一个强大的功能,可以将输出记录到文件中,以便您日后查看。 想象一下,在特定时间窗口内出现问题的情况。 您可以通过 `crontab` 或其他计划任务将输出写入文件,稍后您可以回放这些文件。

要将输出记录到文件中:

atop -w filename

要播放:

atop -r filename

`atop` 支持多个参数,例如时间间隔、采样等等。我强烈建议您查看手册页以获取更多信息。

如果您只是想进行实时故障排除,那么只需运行 `atop` 命令,您应该会看到如下所示的界面。

您可以通过以下方式安装 `atop` 命令:

dnf install atop

ps

现在,让我们来看看 `ps` 命令。

您可以使用带有 PID 的 `ps` 命令来输出它们的 CPU 和内存使用率。

ps -p $PID -o %cpu,%mem

输出应如下所示。

[email protected]:~# ps -p 1048 -o %cpu,%mem
%CPU %MEM
 0.2  3.0
[email protected]:~#

nmon

`nmon` 是一个交互式命令行监控工具,用于查看 CPU、内存、磁盘、网络、NFS 和虚拟内存的使用情况。要查看占用资源最多的进程(按利用率),您可以执行 `nmon` 命令并按下 `t` 键。

您可以按如下方式安装 `nmon` 命令。

dnf install nmon

Monit

Monit 是一个基于 Web 和命令行的开源解决方案,用于监控服务器资源、守护进程、文件、目录和文件系统等等。

Monit 还有一个非常酷的小部件。

它是一个轻量级的监控软件。但是,它还有许多值得探索的功能。

Monitorix

一个用于监控 Linux 服务器的轻量级开源实用程序。 Monitorix 具有内置的 HTTP,因此您可以通过 Web 检查资源使用情况和其他信息。 其他一些监控报告包括:

  • 内核/温度
  • 文件系统和 I/O
  • 网络流量
  • Apache/邮件/FTP/Nginx
  • MySQL/Varnish/Memcached

Monitorix 还提供警报配置,因此您可以在出现问题时收到通知。当您管理云服务器并寻找主动监控解决方案时,这是一个不错的选择。

Netdata

Netdata 是一个用于实时监控系统资源、应用程序、Web 服务器、数据库、DNS、邮件、硬件传感器等等的工具。它是开源的,并且很容易上手。 它收集、存储和流式传输所有数据,以便您以交互方式进行可视化。 Netdata 每秒都会收集数据,因此您不会错过任何信息。

深受许多行业领导者的喜爱。

所以,还等什么呢?快来试试这些工具,掌控您的 Linux 服务器吧!

btop

btop 是一个方便的资源监视器,具有美观的交互式界面,可以帮助您管理 Linux 服务器。

您可以轻松地在树状视图中查看进程、从进程列表中过滤,以及管理资源占用。 `btop` 还配备了自动缩放图表,可以显示网络使用情况。

此外,您还可以检查磁盘速度和 I/O 活动。

您可以在 Linux、FreeBSD 和 macOS 上体验 `btop` 的更多功能。

结论

我希望上述工具可以帮助您实时可视化服务器利用率,以便您可以采取必要的措施。 如果您刚刚开始担任系统管理员,并且希望获得实践培训,请查看这个 Udemy 课程