次のコードは、100,000 スレッドを作成することになっています。
/* compile with: gcc -lpthread -o thread-limit thread-limit.c */
/* originally from: http://www.volano.com/linuxnotes.html */
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#define MAX_THREADS 100000
int i;
void run(void) {
sleep(60 * 60);
}
int main(int argc, char *argv[]) {
int rc = 0;
pthread_t thread[MAX_THREADS];
printf("Creating threads ...\n");
for (i = 0; i < MAX_THREADS && rc == 0; i++) {
rc = pthread_create(&(thread[i]), NULL, (void *) &run, NULL);
if (rc == 0) {
pthread_detach(thread[i]);
if ((i + 1) % 100 == 0)
printf("%i threads so far ...\n", i + 1);
}
else
{
printf("Failed with return code %i creating thread %i (%s).\n",
rc, i + 1, strerror(rc));
// can we allocate memory?
char *block = NULL;
block = malloc(65545);
if(block == NULL)
printf("Malloc failed too :( \n");
else
printf("Malloc worked, hmmm\n");
}
}
sleep(60*60); // ctrl+c to exit; makes it easier to see mem use
exit(0);
}
これは、32 GB の RAM を搭載した 64 ビット マシンで実行されています。Debian 5.0 がインストールされており、すべてストックされています。
- ulimit -s 512 スタックサイズを抑える
- /proc/sys/kernel/pid_max を 1,000,000 に設定 (デフォルトでは、32k pid に制限されています)。
- ulimit -u 1000000 を使用して最大プロセス数を増やします (これはまったく問題にならないと思います)。
- /proc/sys/kernel/threads-max を 1,000,000 に設定 (デフォルトでは、まったく設定されていませんでした)
これを実行すると、次のように吐き出されます。
65500 threads so far ...
Failed with return code 12 creating thread 65529 (Cannot allocate memory).
Malloc worked, hmmm
私は確かにラムを使い果たしていません。同時に実行されているこれらのプログラムをさらにいくつか起動することもでき、それらはすべて 65k スレッドを開始します。
(100,000 以上のスレッドを起動しようとしないことを示唆するのは控えてください。これは動作するはずの単純なテストです。現在の epoll ベースのサーバーには常に約 20 万以上の接続があり、さまざまな論文では、スレッドの方が優れた選択肢である可能性があることが示唆されています。 。 - ありがとう :) )