top 命令技巧:监控 Linux 上的 CPU 负载

实时查看 Linux 上运行的进程,以解决速度减慢和其他问题。
368 位读者喜欢这篇文章。
An introduction to GNU Screen

Opensource.com

本文节选自 Manning 出版的书籍《Linux in Action》第 13 章。

您的 Linux 机器性能是否不稳定或异常缓慢?您是否怀疑不断增长的需求可能超出了您可用的资源?以下是一些您应该自问的问题:

  • 您的 CPU 和内存资源即将耗尽到什么程度?
  • 是否有不必要运行的东西可以关闭?
  • 是否有未经您知晓而恶意运行的东西?

您应该在哪里寻找答案?top 程序是一个很好的起点。它可以为您提供系统上运行进程的丰富、自动更新的概览。

下图显示了 top 数据的典型屏幕。第一行提供当前时间、自上次系统启动以来的运行时间、当前登录的用户数以及过去一分钟、五分钟和十五分钟的平均负载。运行 uptime 也可以返回此信息。

Top

opensource.com

由于我们正试图解决性能问题,因此我们最感兴趣的数据列应该是 %CPU(给定进程当前使用的 CPU 容量百分比)和 %MEM(内存容量百分比)。您尤其需要注意列表中顶部显示的进程。

在本例中,您可以看到 MySQL 守护进程正在使用服务器 CPU 的 4.3%,以及从下一列来看,内存的 13%。如果您沿着该行向左看,您会看到进程 ID (PID) 是 1367,并且该进程由 mysql 用户“拥有”。

也许您会得出结论,这个进程占用的资源超过了可以 оправданно 的程度,并且必须牺牲它(为了更大利益,您明白的)。top 显示为您提供了终止它所需的一切。由于 MySQL 是一项由 systemd 管理的服务(在那些使用 systemd 的发行版上),您的首选应该是使用 systemctl 来温和地关闭该进程,而不会使任何应用程序数据面临风险。

systemctl stop mysqld

如果您要关闭的进程不是由 systemd 管理的,或者如果出现问题并且 systemctl 未能停止它,那么您可以使用 killkillall 来终止您的进程。某些系统要求您安装 killall 作为 psmisc 软件包的一部分。您可以通过这种方式将 PID 传递给 kill

kill 1367

另一方面,killall 使用进程名称而不是其 ID。

killall mysqld

终止还是 killall,这是个问题。实际上,答案有点显而易见。kill 将关闭单个进程,因为它基于 PID,而 killall 将杀死尽可能多的特定程序实例(如果正在运行)。因此,如果存在两个或三个单独的 MySQL 实例——可能属于不同的用户——它们都将被停止。在启动 killall 之前,请确保没有您仍然希望运行的类似名称的进程可能会成为“附带损害”。

当然,您还需要运行 systemctl disable 以确保该进程在下次启动时不会重新启动。

systemctl disable mysqld

解读 top

如果您需要它们,您稍早看到的 top 输出的第三行给出了许多其他 CPU 指标的时间值(以百分比表示)。以下是您将在那里看到的各种首字母缩略词的快速说明:

指标 含义
us 运行高优先级(非 nice)进程的时间
sy 运行内核进程的时间
ni 运行低优先级 (nice) 进程的时间
id 空闲时间
wa 等待 I/O 事件完成的时间
hi 管理硬件中断所花费的时间
si 管理软件中断所花费的时间
st 虚拟机 (VM) 被其 hypervisor(宿主机)偷走的时间

可以通过键盘输入实时自定义 top 显示。键入 h 以了解更多信息。

制造麻烦(模拟 CPU 负载)

渴望看到 top 的实际运行情况,但您知道吗,一切都运行平稳?

为什么不模拟危机级别的 CPU 过载呢?就像孩子一样,yes 会持续输出(数字)噪声,直到被告知停止。再想一想,这根本不像孩子。

此命令会将噪声重定向到可丢弃的 /dev/null 文件,并且 & 字符会将进程推送到后台,从而将命令行控制权还给您。要加大压力,请多次启动该命令。

$ yes > /dev/null &

这应该让他们忙碌起来。在所有这些运行期间,观察 top 以查看正在发生的事情。您也可以尝试运行其他应用程序,看看需要多少负载才能使它们变慢。完成后,运行 killall 以一次性结束所有 yes 会话。

$ killall yes

 

标签
David Clinton
DAVID CLINTON 是一位系统管理员、教师和作家。他管理过、撰写过并创建过许多重要技术主题的培训材料,包括 Linux 系统、云计算(尤其是 AWS)以及 Docker 等容器技术。

10 条评论

我经常使用 top 来查看当一些内存密集型的 Python 脚本在 Scribus 中运行时发生了什么。最近,我一直在使用 KSysGuard,它类似于 top,但它以图形方式显示 CPU 活动、内存使用情况(包括交换空间)和网络活动。我设置了一个 Windows 10 VM,并试图弄清楚使用什么设置,因为它阻塞了我的系统。我原以为将其设置为仅使用 1 个 CPU 将是答案,但我可以看到它所做的是从 100% 使用一个 CPU 快速切换到 100% 使用另一个 CPU。最终,我发现将其设置为同时使用两个 CPU,但限制在约 54% 可以让 VM 运行得更好,并且不会阻塞我的 Fedora 系统。即便如此,与单独的 Linux 相比,即使您没有运行任何应用程序,Windows 也会消耗大量的 CPU 和内存,这真是令人惊讶。在 Linux 中,当您不执行任何操作时,即使您可能同时运行着浏览器和邮件客户端,一切都非常安静。

我在 Virtualbox 上也有类似的经历;尤其是在 CPU 是 Corei3 时(Corei5、Corei7 和更好的 CPU 问题较少)

如果您的 RAM 足够大,请确保禁用 Windows 中的虚拟内存,或者将其设置为固定大小 - 至少 4GB。如果您不共享资源,请禁用“服务器”服务。确保将性能设置为后台服务,并“调整为最佳性能”。不要使用任何背景图片并禁用省电功能。

回复 作者:Greg P

yes 输出的是无休止的 y[cr] 序列。不完全是“(数字)噪声”。

数字噪声更像是 cat /dev/urandom。

关于虚拟机和 top,如果您是 zen 或 kvm 用户,virt-top 值得一看...

您也可以使用替代的 'htop',它具有类似的功能,并为每个 cpu 核心提供半图形化输出。

我也推荐 htop。作为 Linux,似乎有很多实用程序可以满足这里每个人的个性化需求,glances 是另一种基于文本的仪表板类型视图,也很受欢迎。对于 I/O 统计信息,当然还有 iotop。

回复 作者:abaldwin

atop 是另一种替代方案,它提供了更全面的系统视图。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© 2025 open-source.net.cn. All rights reserved.