nproc が問題でした:
[[email protected] ~]# ps -eLf | grep pascal | wc -l
4068
[[email protected] ~]# cat /etc/security/limits.d/20-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc 4096
root soft nproc unlimited
[[email protected] ~]#
man limits.conf の状態:
Also, please note that all limit settings are set per login. They are
not global, nor are they permanent; existing only for the duration of
the session. One exception is the maxlogin option, this one is system
wide. But there is a race, concurrent logins at the same time will not
always be detected as such but only counted as one.
nproc はログインごとにのみ適用されますが、グローバルにカウントされるようです。したがって、nproc 8192 および 5000 スレッドでのログインは問題ありませんが、nproc 4096 および 50 スレッドで同じ UID の同時ログインは、グローバル カウント (5050) が nproc 設定を超えているため、それ以上作成できません。
[[email protected] ~]# ps -eLf | grep pascal | grep google/chrome | wc -l
3792
アカウントにまったくアクセスできない場合は、問題の原因を突き止めるのに苦労します。ただし、システムまたはアプリケーションのログを確認してください。うまくいけば、何らかのプログラムがそこに手がかりを残しているはずです (特に、ログイン試行の失敗について)。
プログラムを実行して実験できる場合は、制限された各値を増やしてみて、それがいつ機能し、いつ EAGAIN
で失敗したかを確認することで、どの制限に達したかを知ることができます。 .各値に使用されるリソースを一覧表示することもできます。すべての制限のデータを収集するユーティリティは考えられませんが、存在する可能性は十分にあります。
問題がカーネルの制限であると仮定すると、それらは setrlimit
にリストされています マンページ。ユーザー ID ごとに適用されるものは次のとおりです。
RLIMIT_MEMLOCK
— スワップ不能メモリのサイズ。ログインを妨げるべきではありません。スワップできないメモリを要求するプログラムはほとんどありません。RLIMIT_MSGQUEUE
— メッセージキューのサイズ。ログインを妨げるべきではありません。メッセージ キューを使用するプログラムはほとんどありません。RLIMIT_NPROC
— プロセスの最大数。これは絶対にする 到達した場合、ログインを防ぎます。/etc/security/limits.conf
で上限を引き上げる 既存のセッションには影響しませんが、新しいプロセスには影響するため、システム管理者が値を大きくすると、ユーザーはログインできるようになります。RLIMIT_SIGPENDING
— 保留中のシグナルの最大数。ログインを妨げるべきではありません。sigqueue
を使用するプログラムはほとんどありません。 シグナルをエンキューします。
したがって、プロセスの制限が最も可能性が高いものです。実行中のシェルにアクセスできる場合は、プログラムを実行して確認できます。エラーはかなり特徴的です:
$ ls
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: Resource temporarily unavailable
この制限は ulimit -u
で出力できます .問題のあるユーザーとして実行されているシェルにアクセスでき、ユーザーが setuid プログラムを実行していない場合は、この制限に対してカウントされるプロセスを set /proc/*/task/*/cwd/.; echo $#
でリストできます。 (ユーザーが cwd
を読み取ることができるカーネルスレッドをリストします これは、ユーザーがプロセスを完全に制御できることを意味します)。