【发布时间】:2011-04-01 02:13:01
【问题描述】:
下面的代码应该可以创建 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);
}
这是在具有 32GB 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
我当然没有用完 ram;我什至可以同时启动多个这样的程序,它们都启动它们的 65k 线程。
(请不要建议我不要尝试启动 100,000+ 个线程。这是对应该工作的一些东西的简单测试。我当前基于 epoll 的服务器始终有大约 200k+ 个连接和@987654321 @ 会建议线程可能是一个更好的选择。-谢谢:))
【问题讨论】:
-
ulimit -s 512实际上将最小堆栈大小设置为 512 KB,而不是 512 字节。因此,100,000 个线程将接近 50GB(但是,这可能不是问题,因为堆栈是按需分配的)。 -
是的,我尝试将其设置为简单的 ulimit -s 1 并且 65528 个线程的结果是相同的。如果我为此使用 ulimit -s 1024 也是一样。
-
您能否用 strace(和耐心)确认最终的 pthread_create (clone(2)?) 调用实际上因 ENOMEM 而失败?如果增加
/proc/sys/文件:vm/max_map_count、kernel/pid_max和kernel/threads-max,它们的值是什么,会发生什么? -
您的“各种论文”链接指向一篇论文,基本上说如果您将线程库更改为自定义绿色线程实现并且可能也更改编译器,那么线程会很棒。您的测试代码正在使用库存编译器和操作系统线程,所以我不明白为什么您甚至使用那篇论文来支持您尝试这个的决定。此外,该论文忽略了线程从根本上是不确定的这一事实。您应该阅读伯克利其他人的这篇较新的论文:eecs.berkeley.edu/Pubs/TechRpts/2006/EECS-2006-1.pdf
-
请将您的解决方案放在答案中,以便我们投票:)。
标签: c linux multithreading pthreads nptl