스레드 수의 제한은 무엇입니까?

스레드 수의 제한은 무엇입니까?

내 컴퓨터(x64, 8GB RAM 및 Ubuntu 실행)에서 생성할 수 있는 프로세스 수를 알고 싶습니다. 그래서 저는 자식 프로세스를 계속 생성하고 자식 프로세스는 계속 잠자기 상태를 유지하는 간단한 기본 프로세스를 만들었습니다. 결국 11-12k 프로세스만 남았습니다. 그런 다음 프로세스를 스레드로 전환하고 똑같은 결과를 얻었습니다. 내 pid_max는 32768로 설정되어 있으며 모든 사용자별 제한이 비활성화되어 있습니다. 실제 메모리 사용량은 몇 바이트에 불과합니다. 이 시점에서 시스템이 새 스레드를 생성하는 것을 방해하는 것이 무엇인지 말해 줄 수 있습니까?

ps 이것은 C로 작성된 다중 처리 테스트의 소스 코드입니다.

#include <stdio.h>
#include <unistd.h>

int main() {
    pid_t pid;
    int count = 0;
    while (1) {
        pid = fork();
        if (pid == -1) {
            printf("total: %d\n", count);
            return 0;
        }
        if (pid == 0) {
            while (1) sleep(10);
        }
        count++;
    }
}

답변1

프로세스 제한이나 메모리 제한에 도달한 것 같습니다.

내 컴퓨터에서 프로그램을 시도하고 pid == -1상태 오류에 도달하면 오류 메시지와 함께 fork()반환됩니다 .EAGAINResource temporarily unavailable일반 사용자로서, 약 15,000개의 프로세스를 생성할 수 있습니다.

EAGAIN이는 아래에 자세히 설명된 여러 가지 이유로 인해 발생할 수 있습니다 man 2 fork.

  • 충분한 저장,
  • RLIMIT_NPROC와 같은 한도에 도달,
  • 마감일 스케줄러 세부정보.

RLIMIT_NPROC내 경우에는 이제 한계 에 다다랐다고 생각하는데 , ulimit -u대개 그런 모습을 보여준다. 쉘의 한계가 아닌 실제 값을 얻을 수 있도록 프로그램에 이 한계를 표시하는 것이 더 좋습니다.

#include <sys/time.h>
#include <sys/resource.h>

int main() {
    struct rlimit rlim;
    getrlimit(RLIMIT_NPROC, &rlim);
    printf("RLIMIT_NPROC soft: %d, hard: %d\n", rlim.rlim_cur, rlim.rlim_max);

결과는 다음과 같습니다.

RLIMIT_NPROC soft: 15608, hard: 15608
total: 15242

웹 브라우저를 포함하여 다른 프로세스가 실행 중이므로 이는 합리적으로 보입니다.


지금,루트 사용자로, 이러한 제한은 더 이상 적용되지 않으며 더 많은 작업을 수행할 수 있습니다 fork(). 30,000개 이상의 프로세스를 생성하여 32,000개에 가까워졌습니다 pid_max.

이제 내 것을 넣으면일반 사용자쉘의 PID ( echo $$) 및루트 사용자로다른 셸에서는 다음을 수행합니다 prlimit --pid $SHELLPID --nproc=30000.그 다음에이 셸에서 프로그램을 시작하면 거의 30,000개의 프로세스를 만들 수 있습니다.

RLIMIT_NPROC soft: 30000, hard: 30000
total: 29678

마지막으로, 메모리 사용량도 고려해야 합니다. 내 시스템에서는 다음을 사용하기 때문입니다.많은이러한 모든 프로세스를 생성하기 위한 RAM 및 스왑이 한계에 도달했을 수도 있습니다. 으로 확인하세요 free.

관련 정보