오늘 방금 내 프로세스 ID가 400,000(예: 449624)으로 매우 높은 것을 확인했습니다. 나는 달리고 있을 때 ps -ef | more
이것을 발견했다 . 이는 정상입니까, 아니면 문제가 있음을 나타냅니까? 그렇지 않으면 스크립트가 정상적으로 실행됩니다.
저는 Redhat 7.3 x64비트를 사용하고 있습니다.
내가 알아차린 또 다른 점은 Redhat 7.2도 있고 pid가 그다지 높지 않고 최신 OS에서만 가능하다는 것입니다. 왜 그럴까요? 이것이 OS와 관련이 있고 정상이라는 뜻입니까?
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
값을 영구적으로 변경하도록 수정 하고 reload 를 사용하세요 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로 하드코딩되어 있습니다..