나는 왜 400,000 이상의 pid를 보았습니까? 뭔가 잘못되었음을 나타 냅니까?


14

오늘 방금 프로세스 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.


에 있어야하므로 kernel_pid_max귀하 는 가지고 있지 않습니다 . sysctl.confkernel.pid_max
JR 페 거슨

프로세스 ID가 크면 머신이 부팅 된 이후 많은 프로세스를 시작했음을 의미합니다. 프로세스가 시작될 때마다 커널은 가장 최근에 사용한 것보다 큰 다음 사용 가능한 프로세스 ID를 할당하여 최대 값에 도달하면 롤오버합니다.
chepner 2013

답변:


19

부팅시 커널 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 개 미만인 시스템에서 일반적으로 사용되는 값입니다.

그리고 나중에 :

#PIDS_PER_CPU_DEFAULT 1024 정의

이러한 값은 다음에 사용됩니다 kernel/pid.c.

int pid_max = PID_MAX_DEFAULT;

그리고 나중에 :

    / * CPU 수에 따른 범프 기본 및 최소 pid_max * /
    pid_max = 최소 (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.


1
예 : SuperServer 7089P-TR4T 에는 224 개의 코어가 있으므로 448 개의 스레드가 있습니다.
AB

16

에서 documentaton :proc

32 비트 플랫폼에서 32768은 pid_max의 최대 값입니다. 64 비트 시스템에서 pid_max는 최대 2 ^ 22 (PID_MAX_LIMIT, 약 4 백만)의 값으로 설정할 수 있습니다.

당신은를 볼 수 있습니다 cat /proc/sys/kernel/pid_max. 로 쿼리 할 수도 있습니다 sysctl.

sudo sysctl -a | grep kernel.pid_max

또는:

sysctl -n kernel.pid_max

/etc/sysctl.conf값을 영구적으로 변경하도록 수정 하고로 다시로드하십시오 sysctl -p.


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_MAX99999로 하드 코드 된 것으로 나타납니다 .


3
리눅스는 pid가 31 비트 공간을 채울 수없는 근본적인 API 이유를 가지고있다. 상위 2 비트 (부호 비트 외에)는 강력한 futex 및 PI futex 인터페이스에서 특수 목적으로 예약되어 있습니다. 그것은 512M pid 공간에 대해 29 비트 만 남습니다.
R .. GitHub 중지 지원 얼음

1
@R .: 물론입니다. Linux에서도 마찬가지입니다. 그러나이 답변을 쓸 때 질문은 Linux를 지정하지 않았으므로 모든 Unix에 대한 답변을주었습니다. 내가 아는 한 POSIX 표준에는 pid의 특정 크기가 필요한 것은 없습니다. 지금은 불필요 해 보이지만 pid_t64 비트 크기 의 미래 시스템을 상상할 수 있습니다.
Daniel Pryden

실제로 그것은 모두 사실입니다.
R .. GitHub 중지 지원 얼음
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.