The following code should do 100,000 threads:
/* 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); }
It runs on a 64-bit machine with 32 GB of RAM; Debian 5.0 installed, all stocks.
- ulimit -s 512 save stack size
- / proc / sys / kernel / pid_max is set to 1,000,000 (by default it is disabled at 32k pids).
- ulimit -u 1,000,000 to maximize max processes (don't think it matters at all)
- / proc / sys / kernel / threads-max is set to 1,000,000 (by default it was not installed at all)
By running this, do the following:
65500 threads so far ... Failed with return code 12 creating thread 65529 (Cannot allocate memory). Malloc worked, hmmm
I, of course, lack a ram; I can even run several more of these programs, all running at the same time, and they all start their 65k threads.
(Please refrain from suggesting that I am not trying to start 100,000+ threads. This is a simple test of what should work. My current epoll-based server has approximately 200k + connections at any time and various documents would suggest that the threads may be the best option. - Thank you :))
rekamso
source share