我是否需要监控 Redhat 7.9 服务器中的僵尸进程?

我是否需要监控 Redhat 7.9 服务器中的僵尸进程?

我有一台 7.9 Redhat 服务器,大约有 30 个用户、64 个内核和 512 Go RAM。我有几个僵尸进程,我不知道用户到底创建了什么,但在阅读了互联网上的内容后,我感觉当他们的会话被终止时,它会终止所有僵尸进程,因为“父”进程将被终止。

因此,让我们想象一下,如果用户在其会话期间创建了大约 30 个僵尸进程,我最多可以有 900 个僵尸进程,这只是一个近似值,因为一个用户的会话持续的时间越长,僵尸进程的数量就越高。我是否需要监视这个数字以避免服务器崩溃或类似情况?

我知道僵尸进程不占用任何资源(RAM、CPU 等),但这也证明该值不能高于限制......

我也知道有时用户断开连接然后僵尸进程被清理所以僵尸进程的数量可能会减少......

答案1

不,你当然不需要监视他们。

这就是简短的回答。虽然“僵尸”听起来像是某种危险的东西,可能会入侵您的系统并造成各种麻烦,但事实并非如此。“僵尸”进程不再是进程,因此无法“杀死”它们(即使 SIGKILL 也无济于事)。该进程早已死亡,其所有资源都已释放。“僵尸”只是进程表中的一个占位符条目,用于防止进程 ID 被重用并存储死亡进程的退出状态。

当有人调用 PID 上的某个wait*()系统调用来检索退出状态(“收获” PID)时,这样的条目将被删除。这通常是父进程会立即执行的操作,因此大多数僵尸进程只会停留几毫秒,但有时父进程会因为某种原因忘记这样做,导致僵尸进程长期存在。如果父进程退出(即您的用户注销),僵尸进程将重新成为 init 进程(PID 1,或担任相同角色的其他进程)的父进程,它将立即收获它看到的任何东西,清理僵尸进程。

僵尸 PID 条目所消耗的内存量微不足道(几十字节),因此它永远不会成为任何非嵌入式系统的问题。您需要数十亿个僵尸来消耗很大一部分 RAM。因此,您唯一真正担心的是,如果所有进程 ID 最终都被僵尸占用,则可能会耗尽进程 ID 的供应。可以查看和更改 PID 的当前限制,/proc/sys/kernel/pid_max并将其设置为至少 1024 倍于内核数或 32768(以较高者为准)。您可以通过写入该文件任意提高它,最高可达 400 多万。

因此,如果您的系统当前设置为默认最大 65536 个 PID,并且您担心数以万计的僵尸会耗尽这个数量,那么只需提高限制即可。为此,请创建一个名为/etc/sysctl.d/somenameyoulike.conf包含的文件kernel.pid_max = 1000000(根据需要调整值)。有关详细信息,请参阅man sysctl.d

相关内容