我看到超过40万的PID是为什么?是否表示出了什么问题?


14

今天,我刚刚注意到我的进程ID非常高,为40万(即449624)。当我跑步时ps -ef | more,就是我注意到它的时候。那是正常现象还是表明有问题?否则脚本运行良好。

我正在使用Redhat 7.3 x64位。

我注意到的另一件事是,我们也有Redhat 7.2,而pids并不高,仅在较新的OS上。为什么会这样呢?这是否意味着它与操作系统相关且正常?

我没有说kernel_pid_maxsysctl.conf。我跑了猫/proc/sys/kernel/pid_max,我明白了458752


你没有kernel_pid_maxsysctl.conf因为它应该存在kernel.pid_max
JRFerguson

大型进程ID仅表示自启动计算机以来您已经启动了许多进程。每次启动一个进程时,内核会分配一个比最近使用的进程ID大的下一个可用进程ID,并在达到最大值时滚动。
chepner '19

Answers:


19

引导时,内核会根据pid_max可用的CPU数量来调整默认值。当数字低时,选择通常的32768。否则,计算如下所示(此处显示的3.10内核与RHEL相似,但除了一些变化之外,对于任何最新的Linux内核都是相同的):

include/linux/threads.h

/ *
 *这控制分配给进程的默认最大pid
 * /
#定义PID_MAX_DEFAULT(CONFIG_BASE_SMALL?0x1000:0x8000)

0x8000 = 32768是在可用线程少于32个的系统上使用的常规值。

然后:

#定义PIDS_PER_CPU_DEFAULT 1024

这些值然后用于kernel/pid.c

int pid_max = PID_MAX_DEFAULT;

以后

    / *凹凸默认值和基于cpus数量的最小pid_max * /
    pid_max = min(pid_max_max,max_t(int,pid_max,
                PIDS_PER_CPU_DEFAULT * num_possible_cpus()));
    pid_max_min = max_t(int,pid_max_min,
                PIDS_PER_CPU_MIN * num_possible_cpus());
    pr_info(“ pid_max:默认值:%u最小值:%u \ n”,pid_max,pid_max_min);

因此,从OP中开始,这意味着总共有458752/1024 = 448个同时可用线程:很多。其他系统可能没有那么多的CPU /内核/线程等,因此默认值较低pid_max


1
示例:SuperServer 7089P-TR4T具有224个核心,因此具有448个线程。
AB

16

procdocumentaton

在32位平台上,pid_max的最大值为32768。在64位系统上,可以将pid_max设置为最大2 ^ 22的任何值(PID_MAX_LIMIT,大约为400万)。

您可以看到带有cat /proc/sys/kernel/pid_max。您也可以使用进行查询sysctl

sudo sysctl -a | grep kernel.pid_max

要么:

sysctl -n kernel.pid_max

修改/etc/sysctl.conf以永久更改该值,然后使用重新加载sysctl -p


7

进程ID可以是由pid_t类型表示的任何值,该值特定于您的操作系统。实际上,它通常是一个32位带符号整数,这意味着最大进程ID将为2147483647,或比您正在观察的进程ID大大约5000倍。

GNU的文档说:

数据类型:pid_t

pid_t数据类型是一个带符号的整数类型,其能够表示进程ID。在GNU C库中,这是一个int

实际上,内核通常会强制执行一个低于该上限的上限。在Linux系统上,此/proc/sys/kernel/pid_max设置由控制,默认为32768。如果您的系统是Linux,则可以检查该文件以查看当前限制。

在不同的操作系统上,限制可能会有所不同;例如,在macOS上PID_MAX似乎被硬编码为99999


3
Linux具有API的基本原因,pid无法填充31位空间;在健壮的futex和PI futex接口中,保留前2位(除符号位外)用于特殊目的。对于512M的pid空间,只剩下29位。
R .. GitHub STOP HELPING ICE

1
@R .:当然,对于Linux是正确的。但是,当我编写此答案时,该问题并未指定Linux,因此我为任何Unix给出了答案。据我所知,POSIX标准中没有任何要求特定大小的pid。现在看来似乎没有必要,但是我可以想象一个将来的系统,pid_t它的大小为64位。
丹尼尔·普赖登

的确如此。
R .. GitHub停止帮助ICE,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.