web-dev-qa-db-ja.com

制限はどこに設定されていますか? bash:fork:再試行:子プロセスなし

この:

$ 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になる可能性もあります)。

5
Ole Tange

問題のシステムはsystemdを実行します。これはcgroupsを使用してシステムリソースをさまざまなプロセスグループに分割する1つの方法です。

Sysctl kernel.sched_autogroup_enabled = 1が設定されています。これは、cgroupを使用してシステムリソースを分割する2番目のことです。

特定のユーザーのcgroupまたはcgroupのセットが初期化されると、再起動するまで変更されないままになる可能性があります。

Systemdとautogroupのどちらが原因か、プロセス番号の制限が原因か、または(cgroup内の)メモリーの制限が原因か、またはソースコードを探す時間がありません。答えるのではなくコメントしたかったのですが、評判が足りません。

2
Jake F