本文节选自 Manning 出版的书籍《Linux in Action》第 13 章。
您的 Linux 机器性能是否不稳定或异常缓慢?您是否怀疑不断增长的需求可能超出了您可用的资源?以下是一些您应该自问的问题:
- 您的 CPU 和内存资源即将耗尽到什么程度?
- 是否有不必要运行的东西可以关闭?
- 是否有未经您知晓而恶意运行的东西?
您应该在哪里寻找答案?top 程序是一个很好的起点。它可以为您提供系统上运行进程的丰富、自动更新的概览。
下图显示了 top 数据的典型屏幕。第一行提供当前时间、自上次系统启动以来的运行时间、当前登录的用户数以及过去一分钟、五分钟和十五分钟的平均负载。运行 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终止还是 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
 
 
 
 
 

10 条评论