Date: Sun, 1 Feb 2004 10:21:05 -0500 From: Craig Rodrigues <rodrigc@crodrigues.org> To: Julian Elischer <julian@elischer.org> Cc: freebsd-threads@freebsd.org Subject: Re: pthread_create() blocks if maxthreads reached? Message-ID: <20040201152105.GA2370@crodrigues.org> In-Reply-To: <Pine.BSF.4.21.0401312317590.38031-100000@InterJet.elischer.org> References: <20040201061212.GA6349@crodrigues.org> <Pine.BSF.4.21.0401312317590.38031-100000@InterJet.elischer.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, Jan 31, 2004 at 11:27:39PM -0800, Julian Elischer wrote: > On Sun, 1 Feb 2004, Craig Rodrigues wrote: > > > Hi, > > > > I wrote the following small test program to spawn > > a large number of threads. > > > > ================================================================== > > > > #include <sys/types.h> > > #include <sys/select.h> > > #include <pthread.h> > > #include <stdio.h> > > > > #define NUM 100000 > > > > void *thr(void *p) > > { > > select(0, NULL, NULL, NULL, NULL); > > return p; > > } > > > > > > int > > main() > > { > > pthread_t t[NUM]; > > > > int ret=0; > > int i; > > > > for(i=0; ; ++i) > > { > > printf("Entering pthread_create...\n"); > > ret = pthread_create(&t[i], NULL, thr, NULL); > > printf("Left pthread_create...\n"); > > > > if( ret != 0 ) { > > printf("%d %s\n", ret, strerror(ret)); > > break; > > } > > } > > printf("Max threads reached at: %d\n", i); > > > > return 0; > > } > > ============================================================== > > > > > > If I link this program with -lthr or -lc_r, the > > program will terminate. > > Successfully? > that's interesting.. libthr should theoretically b elimited to about > 8000 threads.. (on x86). If I link with -lthr, I get: Max threads reached at: 109 If I link with -lc_r, I get: Max threads reached at: 14118 If I link with -lpthread, I get about 161 threads created, and then pthread_create() blocks and I never get to the "Max threads" message. > > > > > > If I link with -lpthread, the program seems to > > block in the pthread_create() call, instead of > > returning EAGAIN (to indicate that a new thread cannot > > be created due to hitting some system limit). > > is that what you expected? No that is not what I expected. I expected that pthread_create() should either: - if it creates the thread successfully, return 0 - if it cannot create the thread, return EAGAIN if a resource limit is it, or EINVAL if bad parameters were passed down into the pthread_create() call I never expected that pthread_create() would block. > yes > to stop processes running away and making the system unusable while we > are developing the therad package we made a limit on how many > threads we allow to ente the kernel at one time per process.. > If you trust your program, you could over-ride the limit. > > see: > kern.threads.max_threads_per_proc: 150 > kern.threads.max_groups_per_proc: 50 Understood. Keep in mind, I am trying to "kick the tires" on libpthread, to see how it reacts on crazy corner cases. I can certainly increase the values of these sysctls, but I think that pthread_create() should not block if it hits a limit. > > Your threads are all waiting in the kernel. > If you used a blocked semaphore or some other non-kernel > method of blocking then you would discover that you could do more > or you could allow more threads to enter the kernel at a time > but that would be a poor use of resources.. it is much more > efficient to keep blocked threads in userland than to block them in the > kernel where they use precious kernel resources. > I'm not sure but I think 'sleep()' is intecepted for example to > keep the sleeping threads in userland. (I may be wrong. > I don't know if Dan did that yet). > > > BTW the limit is not on making more threads, its that the last select() > REALLY blocked and did not return to the userland program to allow you > to make a new thread. Well, this may be so, but I don't think pthread_create() should block. For kicks, I ran this code on Solaris 2.7, and pthread_create() returned EAGAIN after spawning 3399 threads. -- Craig Rodrigues http://crodrigues.org rodrigc@crodrigues.org
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040201152105.GA2370>