내 컴퓨터(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()
반환됩니다 .EAGAIN
Resource 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
.