我有一个在 CloudLinux 6.6 x86_64 标准上运行的托管 VPS。
它有几个使用 CPanel 运行 MySQL、PHP 和 Apache 的网站。
我正在开发一个需要管理 PID 并检测其状态的 PHP 系统。
我已经smallint
在 MySQL 数据库上定义了一个字段(2 个字节)来存储 PID。
但今天我发现了一些奇怪的事情:
该服务“出现故障”,并显示进程未运行,但实际上任务已完成。
我查了一下,有进程的 PID 高达997282(迄今为止最高)。
我尝试在 Google 上查找没有什么这对我有帮助。
我只找到了有关/proc/sys/kernel/pid_max
我用来读取该文件并从中获取最大 PID 的文件的信息,即1048576
。
PID 超过 65535 正常吗?
有点不相关:当 PID 超过 10000 时,服务器是否会尖叫着要求重新启动?
如果您需要任何额外的信息,我都愿意提供,只要不泄露秘密。
答案1
PID 是可回收的。当一个进程退出时,它的 PID 稍后可由另一个进程使用,因此您不会因为存在接近最大值的 PID 而“耗尽”或需要重新启动。但请参见下文...
除非必要,否则我不会修改此 sysctl 参数;例如,在一个具有大量短期进程的繁忙系统上工作,或者在一个具有长期运行进程的大量多线程应用程序上工作。
通常我设置为 99999 或一些案例,999999……
一个值得注意的案例是,我的数据库服务器用完了进程 ID。平均有 9,000-10,000 个并发数据库连接耗尽了 PID。每个连接都生成了多个线程,达到了操作系统中配置的 32,768 个限制。由于运行队列较高,这提高了系统平均负载。
提高PID最大值可以减轻压力。
编辑:
如果这是 VPS,我认为主机会有一个较高的 pid_max 值,因为 PID 在系统上的客户机之间共享。这可能是为了提供余量。
答案2
32 位系统的理论最大 pid 数为 32768,64 位系统的理论最大 pid 数为 4194304。您可以在问题中提到的文件中定义低于此数字的另一个上限(/proc/sys/kernel/pid_max
)。
如果pid_max
达到该上限(通过运行进程),系统将不允许创建新进程,直到现有进程退出并清理完毕。因此,除非您的系统有 1048576 个进程,否则您不会遇到任何问题跑步流程。