이것:
$ seq 100000 | xargs -P0 -n1 -I {} bash -c 'echo {};sleep {}'
:
5514
bash: fork: retry: No child processes
시스템에 11666개의 프로세스가 실행 중이면 5500개쯤에서 불평이 시작됩니다. 이제 11666은 다음과 같은 이유로 나를 놀라게 합니다.
$ ulimit -u
313370
$ cat /proc/sys/kernel/pid_max
313370
$ grep hard.*nproc /etc/security/limits.conf
* hard nproc 313370
왜 11600개의 프로세스만 실행할 수 있나요?
편집하다:
다른 사용자와 테스트해 보니 6100개(즉, 12200개의 프로세스)가 있으므로 총 24000개의 프로세스가 있습니다. 따라서 제한은 시스템 전체에 적용되지 않습니다.
$ uname -a
Linux aspire 4.4.0-116-generic #140-Ubuntu SMP Mon Feb 12 21:23:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
$ grep -i tasksmax /etc/systemd/*
/etc/systemd/logind.conf:#UserTasksMax=12288
/etc/systemd/system.conf:#DefaultTasksMax=
따라서 12288이 아마도 범인일 것입니다. 1000으로 변경하고 다음을 수행합니다.
sudo systemctl daemon-reexec
sudo systemctl restart systemd-logind
이제 이전에 로그인하지 않은 사용자로 로그인하면 새로운 제한 사항이 적용됩니다. 하지만 가장 최근에 로그인한 사용자로 로그인하면 첫 번째 로그인 시 활동 제한이 적용됩니다. 따라서 한계는 어딘가에 캐시됩니다.
위 방법을 사용하여 최대 30,000개의 프로세스를 테스트했는데 효과가 있었지만 이전에 로그인한 적이 없는 사용자에게만 해당되었습니다.
그렇다면 캐싱의 한계는 무엇입니까
/etc/systemd/logind.conf
? 이 캐시를 어떻게 새로 고칠 수 있나요?
새로운 제한은 60000개 프로세스(아마도 예상했던 313370개)보다 훨씬 높습니다.
답변1
문제의 시스템은 systemd로 실행됩니다. 이거 하나 써먹을 일이네cgroup다양한 프로세스 그룹에 시스템 리소스를 할당합니다.
sysctl이 설정될 수 있습니다 kernel.sched_autogroup_enabled = 1
. 이것이 cgroup을 사용하여 시스템 리소스를 나누는 두 번째 방법입니다.
특정 사용자에 대해 cgroup 또는 cgroup 그룹이 초기화되면 재부팅할 때까지 변경되지 않은 상태로 유지될 수 있습니다.
systemd 때문인지 자동 그룹 때문인지, 프로세스 제한 때문인지 메모리 제한(cgroup 내) 때문인지 확인할 방법이 없으며 소스 코드에서 검색할 방법도 없습니다. 답변 대신 댓글을 달고 싶었지만 평판이 충분하지 않습니다.