この:
$ 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
以前にログインしたことがないユーザーとしてログインすると、新しい制限が機能します。しかし、最近ログインしたユーザーとしてログインすると、最初のログイン時にアクティブになる制限が適用されます。したがって、制限はどこかにキャッシュされます。
上記を使用して、最大30000個のプロシージャをテストしましたが、これは機能しますが、以前にログインしたことがないユーザーのみを対象としています。
それで、/etc/systemd/logind.conf
からの制限をキャッシュするのは何ですか?そして、どうすればそのキャッシュをフラッシュできますか?
新しい制限は60000プロシージャをはるかに上回っています(また、予想どおり313370になる可能性もあります)。
問題のシステムはsystemdを実行します。これはcgroupsを使用してシステムリソースをさまざまなプロセスグループに分割する1つの方法です。
Sysctl kernel.sched_autogroup_enabled = 1
が設定されています。これは、cgroupを使用してシステムリソースを分割する2番目のことです。
特定のユーザーのcgroupまたはcgroupのセットが初期化されると、再起動するまで変更されないままになる可能性があります。
Systemdとautogroupのどちらが原因か、プロセス番号の制限が原因か、または(cgroup内の)メモリーの制限が原因か、またはソースコードを探す時間がありません。答えるのではなくコメントしたかったのですが、評判が足りません。