我看到 pid 超过 400,000,这是为什么?这是否表明有什么问题?

我看到 pid 超过 400,000,这是为什么?这是否表明有什么问题?

今天我刚刚注意到我的进程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 内核都是相同的):

include/linux/threads.h:

/*
 * 这控制分配给进程的默认最大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

相关内容