我看到 pid 高于 400,000,这是为什么?它是否表明有问题?

use*_*090 18 process

今天我才注意到我的进程 ID 非常高,在 400,000(即 449624)。当我跑ps -ef | more的时候,我才注意到它。这是正常的还是表明有问题?否则脚本运行良好。

我使用的是 Redhat 7.3 x64 位。

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

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

A.B*_*A.B 21

启动时,内核会根据pid_max可用 CPU 的数量调整默认值。当数量较少时,选择通常的 32768。否则计算如下(此处显示 3.10 内核与 RHEL 类似,但除了一些变化之外,它与任何最新的 Linux 内核相同):

include/linux/threads.h

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

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

然后:

#define PIDS_PER_CPU_DEFAULT 1024

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

int pid_max = PID_MAX_DEFAULT;
Run Code Online (Sandbox Code Playgroud)

后来

    /* 基于 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: default: %u minimum: %u\n", pid_max, pid_max_min);

因此,从 OP 来看,这应该意味着总共有 458752/1024 = 448 个可用的并发线程:相当多。另一个系统可能没有那么多的 CPU/内核/线程等,因此默认值较低pid_max


JRF*_*son 16

procdocumentaton

在 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
Run Code Online (Sandbox Code Playgroud)

或者:

sysctl -n kernel.pid_max
Run Code Online (Sandbox Code Playgroud)

修改/etc/sysctl.conf以永久更改值并重新加载sysctl -p


Dan*_*den 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

  • Linux 有基本的 API 原因 pids 无法填充 31 位空间;前 2 位(除了符号位)在健壮的 futex 和 PI futex 接口中保留用于特殊目的。对于 512M pid 空间,只剩下 29 位。 (3认同)