私のコンピュータ(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
Webブラウザを含む他のプロセスが実行されているので、これは合理的に見えます。
今、rootユーザーとして、これらの制限はもはや適用されず、より多くの作業を実行できますfork()
。 30,000以上のプロセスを作成し、32,000に近づいていますpid_max
。
今私を入れたら一般ユーザーシェルのPID(echo $$
)とrootユーザーとして他のシェルは次のことを行いますprlimit --pid $SHELLPID --nproc=30000
。それからこのシェルでプログラムを起動すると、ほぼ30,000のプロセスを作成できます。
RLIMIT_NPROC soft: 30000, hard: 30000
total: 29678
最後に、メモリ使用量も考慮する必要があります。私のシステムでは以下を使用しているからです。たくさんこれらすべてのプロセスを作成するためのRAMとスワップが制限に達した可能性があります。で確認してくださいfree
。