今天我刚刚注意到我的进程ID非常高,达到了400,000(即449624)。当我跑步时ps -ef | more
,我就注意到了这一点。这是正常现象还是表明存在问题?否则脚本运行良好。
我使用的是 Redhat 7.3 x64 位。
我注意到的另一件事是,我们也有 Redhat 7.2,并且 pid 不是那么高,只是在较新的操作系统上。为什么会这样呢?这是否意味着它与操作系统相关且正常?
kernel_pid_max
我的里面没有那个sysctl.conf
。我跑了猫/proc/sys/kernel/pid_max
,我明白了458752
。
答案1
启动时,内核会pid_max
根据可用 CPU 的数量调整默认值。当数字较小时,选择通常的32768。否则,计算如下(此处显示的 3.10 内核与 RHEL 类似,但除了一些变化之外,它与任何最新的 Linux 内核都是相同的):
/* * 这控制分配给进程的默认最大pid */ #定义PID_MAX_DEFAULT(CONFIG_BASE_SMALL?0x1000:0x8000)
0x8000 = 32768 是可用 cpu 线程少于 32 个的系统上常用的值。
然后:
#定义PIDS_PER_CPU_DEFAULT 1024
然后将这些值用于kernel/pid.c
:
int pid_max = PID_MAX_DEFAULT;
和之后:
/* 根据 cpu 数量调整默认值和最小 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
。
答案2
从文档proc
:
在 32 位平台上,32768 是 pid_max 的最大值。在 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
。
答案3
进程 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。