今天我才注意到我的进程 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
。
A.B*_*A.B 21
启动时,内核会根据pid_max
可用 CPU 的数量调整默认值。当数量较少时,选择通常的 32768。否则计算如下(此处显示 3.10 内核与 RHEL 类似,但除了一些变化之外,它与任何最新的 Linux 内核相同):
/* * 这控制分配给进程的默认最大 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
在 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
。
进程 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。