本文节选自 Manning 出版的书籍《Linux in Action》第 13 章。
您的 Linux 机器的性能是否时好时坏或异常缓慢?您是否怀疑不断增长的需求可能超出了您的可用资源?以下是您应该自问的一些问题:
- 您的 CPU 和内存资源即将耗尽到什么程度?
- 是否有不必要运行的东西可以关闭?
- 是否有您不知情的情况下一直在流氓运行的东西?
您应该在哪里寻找答案?top 程序是一个很好的起点。它可以为您提供系统上运行进程的丰富、自动更新的概览。
下图显示了典型的 top
数据屏幕。第一行提供当前时间、自上次系统启动以来经过的时间、当前登录用户数以及过去 1 分钟、5 分钟和 15 分钟的平均负载。运行 uptime
也可以返回此信息。

opensource.com
由于我们正在尝试解决性能问题,因此我们最感兴趣的数据列应该是 %CPU
(给定进程当前使用的 CPU 容量百分比)和 %MEM
(内存容量百分比)。您尤其需要注意列表中顶部显示的进程。
在本例中,您可以看到 MySQL 守护程序正在使用服务器 CPU 的 4.3%,以及下一列显示的 13% 的内存。如果您沿着该行向左看,您会看到进程 ID (PID) 是 1367
,并且该进程由 mysql
用户“拥有”。
也许您会得出结论,该进程占用的资源超出了合理范围,必须牺牲它(为了更大的利益,您明白的)。top
显示为您提供了终止它所需的一切。由于 MySQL 是一项由 systemd 管理的服务(在那些使用 systemd 的发行版上),您的首选应该是使用 systemctl
轻轻地关闭进程,而不会使任何应用程序数据面临风险。
systemctl stop mysqld
如果您要关闭的进程不受 systemd 管理,或者出现问题且 systemctl
未能停止它,那么您可以使用 kill
或 killall
来消除您的进程。某些系统要求您安装 killall
作为 psmisc
软件包的一部分。您可以通过这种方式将 PID 传递给 kill
:
kill 1367
另一方面,killall
使用进程名称而不是其 ID。
killall mysqld
生存还是毁灭,这是一个问题。实际上,答案是显而易见的。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 |
虚拟机管理程序(主机)从该虚拟机窃取的时间 |
可以通过键盘输入实时自定义 top
显示。键入 h
以了解更多信息。
制造麻烦(模拟 CPU 负载)
渴望看到 top
运行,但您知道,一切都运行顺利?
为什么不模拟危机级别的 CPU 过载?就像孩子一样,yes
会持续输出(数字)噪音,直到被告知停止。再想一想,这根本不像孩子。
此命令会将噪音重定向到可丢弃的 /dev/null
文件,而 &
字符会将进程推送到后台,从而将命令行的控制权返回给您。要加大压力,请多次启动该命令。
$ yes > /dev/null &
应该让他们忙起来。在所有这些都在运行时,观看 top
以查看发生了什么。您也可以尝试运行其他应用程序,看看需要多少资源才能使其速度变慢。完成后,运行 killall
以一次性关闭所有 yes
会话。
$ killall yes
10 条评论