使用 vmstat 管理虚拟内存
Linux 进程管理中使用的另一个基本命令是 vmstat。
vmstat 命令提供有关内存、进程和分页的摘要报告。
$ vmstat -a
我们使用 -a 选项来获取所有活动和非活动进程。
这是此命令的基本列输出:
si: | 从磁盘中交换了多少。 |
so: | 多少交换到磁盘。 |
bi: | 发送到块设备多少钱。 |
bo: | 从块设备获得了多少。 |
us: | 用户时间。 |
sy: | 系统时间。 |
id: | 空闲时间。 |
我们主要关注的是 (si) 和 (so) 列,其中 (si) 列显示页面输入,而 (so) 列提供页面输出。
查看这些值的更好方法是使用延迟选项查看输出,如下所示:
$ vmstat 2 5
其中 2 是以秒为单位的延迟,5 是我们将调用 vmstat 的次数。
它显示了命令的五个更新,所有数据都以千字节为单位。
Page-in (si) 在我们启动应用程序时发生,并且信息被分页。
当内核正在释放内存时会发生页出(so)。
使用 iostat 和 lsof 监控系统运行状况
iostat 命令为我们提供 CPU 利用率报告;我们可以将它与 -c 方法一起使用来显示 CPU 利用率报告。
$ iostat -c
输出结果很容易理解,但是如果系统忙,你会看到 %iowait 增加。
这意味着服务器正在传输或者复制大量文件。
使用此命令,我们可以检查读写操作,因此我们应该对挂起磁盘的内容有深入的了解并做出正确的决定。
此外,我们使用 lsof 命令列出打开的文件:
lsof 命令显示哪个可执行文件正在使用该文件、进程 ID、用户和打开文件的名称。
在服务器管理中,了解正在运行的进程的详细工作方式非常重要,从高负载到慢响应时间进程。
当服务器变得如此缓慢或者无法响应时,我们应该了解进程管理或者Linux进程管理。
何时终止或者重新启动进程以及如何监视当前正在运行的进程以及这些进程如何影响系统负载。
让我们看看 Linux 进程管理将如何帮助我们调整系统。
pgrep 和 systemctl
我们可以使用 pgrep 命令后跟服务名称来获取进程 ID。
$ pgrep servicename
此命令显示进程 ID 或者 PID。
请注意,如果此命令显示的不仅仅是进程 ID,如 httpd 或者 SSH,则最小的进程 ID 是父进程 ID。
另一方面,我们可以使用 systemctl 命令来获取主 PID,如下所示:
$ systemctl status <service_name>.service
获取所需进程 ID 或者父进程 ID 的方法有很多,但这种方法简单直接。
进程类型
在我们开始谈论 Linux 进程管理之前,我们应该回顾一下进程类型。
有四种常见的进程类型:
- 父进程
- 子进程
- 孤儿进程
- 守护进程
- 僵尸进程
父进程是运行 fork() 系统调用的进程。
除进程 0 外的所有进程都有一个父进程。
子进程由父进程创建。
孤儿进程在其父进程终止或者完成时继续运行。
守护进程总是从子进程创建然后退出。
Zombie Process 存在于进程表中,尽管它已终止。
孤儿进程是一个仍在执行的进程,它的父进程已经死亡,而孤儿进程不会变成僵尸进程。
ps命令
我们之前在上一篇文章中已经讨论过 ps 命令以及如何按内存使用率和 CPU 使用率对进程进行排序。
内存管理
在服务器管理中,内存管理是我们作为系统管理员应该关心的职责之一。
Linux 进程管理中最常用的命令之一是 free 命令:
$ free –m
-m 选项以兆字节显示值。
我们主要关注增益/缓存。
这里 free 命令的输出意味着我们正在使用 536 兆字节,而 1221 兆字节可用。
第二行是交换空间。
当内存变得拥挤时会发生交换。
第一个值是总交换大小,即 3070 兆字节。
第二个值是已使用的交换,即 0。
第三个值是使用的可用交换,即 3070。
从上面的结果,可以说内存状态很好,因为没有使用swap,所以在我们谈论swap时,让我们看看proc目录为我们提供了swap。
$ cat /proc/swaps
此命令显示交换大小以及我们使用的数量:
$ cat /proc/sys/vm/swappiness
此命令显示 0 到 100 之间的值;这个值意味着如果内存使用了 70%,系统将使用交换。
注意:大多数发行版的默认值在 30 到 60 之间,我们可以像这样修改它:
$ echo 50 > /proc/sys/vm/swappiness
或者像这样使用 sysctl 命令:
$ sudo sysctl -w vm.swappiness=50
使用上述命令更改 swappiness 值不是永久性的,我们必须将其写入 /etc/sysctl.conf 文件,如下所示:
$ nano /etc/sysctl.conf vm.swappiness=50
交换级别衡量将进程从内存转移到交换的机会。
为系统选择准确的 swappiness 值需要进行一些实验来为服务器选择最佳值。
系统负载 和 top 命令
在 Linux 进程管理中,top 命令为我们提供正在运行的进程列表以及它们如何使用 CPU 和内存;输出是实时数据。
如果我们有一个双核系统,其中第一个内核为 40%,第二个内核为 70%,在这种情况下,top 命令可能会显示 110% 的组合结果,但我们不会知道各个值每个核心。
$ top -c
我们使用 -c 选项来显示该进程背后的命令行或者可执行路径。
我们可以在查看顶部命令统计信息时按 1 键以显示各个 CPU 状态。
请记住,某些进程是像子进程一样生成的;我们将看到同一程序的多个进程,如 httpd 和 PHP-fpm。
你不应该只依赖 top 命令;在做出最终行动之前,我们应该查看其他资源。
发送终止信号
要终止导致问题的服务或者应用程序,我们可以发出终止信号 (SIGTERM)。
我们可以查看之前关于信号和工作的帖子。
$ kill process ID
我们称这种方法为安全杀死。
但是,根据情况,也许我们需要像这样强制服务或者应用程序挂断:
$ kill -1 process ID
有时安全的杀戮和重装也无济于事;我们可以使用 -9 选项发送终止信号 SIGKILL ,我们称之为强制终止。
$ kill -9 process ID
此命令没有清理操作或者安全退出,不是首选。
但是,我们可以使用 pkill 命令做一些更合适的事情。
$ pkill -9 serviceName
并且我们可以使用 pgrep 命令来确保所有属于该服务的进程都被杀死。
$ pgrep serviceName
计算系统负载
计算系统负载在 Linux 进程管理中非常重要。
系统负载是当前正在工作的系统的处理量。
这不是衡量系统性能的完美方式,但它为我们提供了一些证据。
我们可以这样计算负载:
实际负载 = 总负载(正常运行时间)/ CPU 数量
我们可以通过查看 uptime 命令或者 top 命令来计算正常运行时间:
$ uptime
$ top
top 命令显示 1、5 和 15 分钟内的服务器负载。
如我们所见,第一分钟的平均负载为 0.00,第五分钟为 0.01,第十五分钟为 0.05.
当负载增加时,系统将处理器排队,如果处理器内核很多,系统会在服务器的内核之间平均分配负载以平衡工作。
我们可以说良好的平均负载大约为 1.
这并不意味着如果负载超过 1 就存在问题,但是如果我们开始看到很长一段时间内更高的数字,则意味着高负载,并且有一个问题。
使用 iotop 监控磁盘 I/O
由于磁盘活动频繁,系统开始变慢,因此监控磁盘活动很重要。
这意味着找出导致此磁盘活动的进程或者用户。
Linux进程管理中的iotop命令可以帮助我们实时监控磁盘I/O。
如果你没有它,你可以安装它:
$ yum install iotop
在没有任何选项的情况下运行 iotop 将导致所有进程的列表。
要查看导致磁盘活动的进程,我们应该使用 -o 选项:
$ iotop -o
我们可以轻松了解哪些程序正在影响系统。
使用 systemd 管理服务
如果我们要谈论 Linux 进程管理,我们应该看看 systemd。
systemd 管理和控制现代 Linux 系统(如 CentOS 7)上的服务。
我们可以像这样启动、停止和检查状态:
$ systemctl status <service_name>.service $ systemctl stop <service_name>.service $ systemctl start <service_name>.service
我们可以使用 systemctl 命令,而不是使用 chkconfig 命令在引导期间启用和禁用服务:
$ systemctl enable <service_name>.service $ systemctl disable <service_name>.service
Systemd 还附带了 top 命令的版本,并显示属于特定服务的进程;我们可以像这样使用 system-cgtop 命令:
$ systemd-cgtop
如我们所见,所有相关进程、路径、任务数量、CPU 使用百分比、内存分配以及相关的输入和输出。
我们可以使用这个命令来输出服务内容的递归列表,如下所示:
$ systemd-cgls
此命令为我们提供了非常有用的信息,我们可以使用这些信息来做出决定。
Nice 和 renice 流程
进程 nice 值是一个数字指示,它属于进程以及它如何争夺 CPU。
较高的 nice 值表示流程的优先级较低,因此我们对其他用户的态度会有多好,因此名称由此而来。
好的范围是从 -20 到 +19.
nice 命令在创建时设置进程的 nice 值,而 renice 命令稍后调整该值。
$ nice –n 5 ./myscript
该命令增加了 nice 值,这意味着将优先级降低 5.
$ sudo renice -5 2213
该命令减小 nice 值意味着增加优先级,数字 (2213) 是 PID。
我们可以增加它的 nice 值(较低优先级),但不能降低它(高优先级),而 root 用户可以同时执行这两种操作。