在服务器管理中,了解正在运行的进程如何详细工作(从高负载进程到慢响应时间进程)非常重要。当你的服务器变得如此缓慢或无法响应时,你应该了解进程管理或Linux进程管理。
当是时候杀死一个进程 or renice它以及如何monitor当前正在运行的进程以及这些进程如何影响系统负载。让我们看看 Linux 进程管理将如何帮助我们调整系统。
工艺类型
在我们开始讨论 Linux 进程管理之前,我们应该回顾一下进程类型。有四种常见的流程类型:
父进程是一个运行 fork() 系统调用的进程。除进程 0 之外的所有进程都有一个父进程。
子进程由父进程创建。
孤儿进程当其父进程终止或完成时,它继续运行。
守护进程总是从子进程创建然后退出。
僵尸进程存在于进程表中,尽管它已终止。
孤儿进程是仍在执行的进程,其父进程已死亡,而孤儿进程不会成为僵尸进程。
内存管理
在服务器管理中,内存管理是作为系统管理员应该关心的职责之一。
Linux 进程管理中最常用的命令之一是 free 命令:
$ free –m
-m 选项显示以兆字节为单位的值。
我们主要关心的是buff/cache。
这里 free 命令的输出意味着我们正在使用 536 MB,而可用空间为 1221 MB。
第二行是交换。当内存变得拥挤时就会发生交换。
第一个值是总交换大小,为 3070 MB。
第二个值是已使用的交换,为 0。
第三个值是可用交换空间,为 3070。
从上面的结果可以看出,由于没有使用swap,所以内存状态良好,所以在讨论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
Cool!!
交换级别衡量将进程从内存转移到交换的机会。
为您的系统选择准确的交换值需要进行一些实验才能为您的服务器选择最佳值。
使用 vmstat 管理虚拟内存
Linux 进程管理中另一个重要的命令是 vmstat。 vmstat 命令提供有关内存、进程和分页的摘要报告。
$ vmstat -a
我们使用 -a 选项来获取所有活动和非活动进程。
这是该命令的基本列输出:
si: |
How much swapped in from disk. |
so: |
How much swapped out to disk. |
bi: |
How much sent to block devices. |
bo: |
How much obtained from block devices. |
us: |
The user time. |
sy: |
The system time. |
id: |
The idle time. |
我们主要关心的是 (si) 和 (so) 列,其中 (si) 列显示页入,而 (so) 列提供页出。
查看这些值的更好方法是使用延迟选项查看输出,如下所示:
$ vmstat 2 5
其中 2 是以秒为单位的延迟,5 是我们调用 vmstat 的次数。它显示了命令的五次更新,所有数据均以千字节为单位。
当您启动应用程序时会发生页调入 (si),并且信息会被调入。当内核释放内存时,就会发生页出(so)。
系统加载和top命令
在Linux进程管理中,top命令为您提供正在运行的进程的列表以及它们如何使用CPU和内存;输出是实时数据。
如果您有一个双核系统,第一个核心的利用率可能为 40%,第二个核心的利用率为 70%,在这种情况下,top 命令可能会显示 110% 的组合结果,但您不会知道各个值每个核心。
$ top -c
我们使用 -c 选项来显示命令行或该进程背后的可执行路径。
您可以在查看 top 命令统计数据时按 1 键来显示各个 CPU 的状态。
请记住,某些进程会像子进程一样产生;您将看到同一个程序的多个进程,例如 httpd 和 PHP-fpm。
你不应该只依赖 top 命令;在采取最终行动之前,您应该查看其他资源。
使用 iotop 监控磁盘 I/O
由于磁盘活动较多,系统开始变慢,因此监视磁盘活动非常重要。这意味着要找出哪些进程或用户导致了此磁盘活动。
Linux进程管理中的iotop命令可以帮助我们实时监控磁盘I/O。如果没有的话可以安装:
$ yum install iotop
不带任何选项运行 iotop 将生成所有进程的列表。
要查看导致磁盘活动的进程,您应该使用 -o 选项:
$ iotop -o
您可以轻松了解哪些程序正在影响系统。
ps 命令
我们已经讨论过ps 命令之前在上一篇文章中介绍了如何按内存使用率和 CPU 使用率对进程进行排序。
使用 iostat 和 lsof 监控系统运行状况
iostat 命令为您提供 CPU 利用率报告;您可以将其与 -c 选项一起使用来显示 CPU 利用率报告。
$ iostat -c
输出结果很容易理解,但是如果系统繁忙,你会看到%iowait增加。这意味着服务器正在传输或复制大量文件。
使用此命令,您可以检查读写操作,因此您应该充分了解磁盘挂起的原因并做出正确的决定。
此外,我们使用 lsof 命令列出打开的文件:
lsof 命令显示哪个可执行文件正在使用该文件、进程 ID、用户以及打开的文件的名称。
计算系统负载
计算系统负载在Linux进程管理中非常重要。系统负载是当前正在工作的系统的处理量。它不是衡量系统性能的完美方法,但它为您提供了一些证据。
您可以这样计算负载:
实际负载 = 总负载(正常运行时间)/ CPU 数量
您可以通过查看 uptime 命令或 top 命令来计算正常运行时间:
$ uptime
$ top
top 命令显示 1、5 和 15 分钟内的服务器负载。
正如您所看到的,第一分钟的平均负载为 0.00,第五分钟的平均负载为 0.01,第十五分钟的平均负载为 0.05。
当负载增加时,系统会对处理器进行排队,如果有许多处理器核心,系统会将负载平均分配到服务器的核心上以平衡工作。
您可以说良好的平均负载约为 1。这并不意味着如果负载超过 1 就存在问题,但如果您开始长时间看到更高的数字,则意味着负载较高,并且存在问题问题。
pgrep 和 systemctl
您可以使用 pgrep 命令获取进程 ID,后跟服务名称。
$ pgrep servicename
此命令显示进程 ID 或 PID。
请注意,如果此命令显示多个进程 ID(如 httpd 或 SSH),则最小的进程 ID 是父进程ID.
另一方面,您可以使用 systemctl 命令来获取主 PID,如下所示:
$ systemctl status <service_name>.service
有多种方法可以获取所需的进程 ID 或父进程 ID,但这一种非常简单直接。
使用 systemd 管理服务
如果我们要讨论 Linux 进程管理,我们应该看一下systemd。 systemd 管理和控制 CentOS 7 等现代 Linux 系统上的服务。
您可以像这样启动、停止和检查状态:
$ 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 值表示您的进程的优先级较低,那么如何nice你将成为其他用户,从这里,名字就来了。
合适的范围是从 -20 到 +19。
Nice命令在创建时设置进程的nice值,而renice命令稍后调整该值。
$ nice –n 5 ./myscript
该命令增加了nice值,这意味着优先级降低了5。
$ sudo renice -5 2213
该命令减小nice值意味着增加优先级,数字(2213)就是PID。
您可以增加其nice值(较低优先级),但不能降低它(高优先级),而root用户可以同时执行这两个操作。
发送终止信号
要终止导致问题的服务或应用程序,您可以发出终止信号 (SIGTERM)。你可以回顾一下之前的帖子信号和工作.
$ kill process ID
我们称这个方法为安全杀死。但是,根据您的情况,也许您需要像这样强制挂起服务或应用程序:
$ kill -1 process ID
有时候,安全杀戮和重装却无济于事;你可以使用 -9 选项发送终止信号 SIGKILL,我们称之为强制杀戮.
$ kill -9 process ID
此命令没有清理操作或安全退出,因此不是首选。但是,您可以使用 pkill 命令执行更正确的操作。
$ pkill -9 serviceName
并且可以使用 pgrep 命令来确保属于该服务的所有进程都被杀死。
$ pgrep serviceName
我希望您对 Linux 进程管理有一个很好的了解,以及如何采取良好的行动来使系统健康。
谢谢。