Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 1 Aug 2003 10:12:45 +0900
From:      TeJun Huh <tj@atj.dyndns.org>
To:        freebsd-threads@freebsd.org
Subject:   Regarding KSE
Message-ID:  <20030801011245.GA31048@atj.dyndns.org>

next in thread | raw e-mail | index | archive | help
  Hello, I'm currently evaluating various thread packages for a paper.
The focus is on aptness for Internet servers, so performance and
scalability are main concerns.  I'm trying to evaluate M:N threading
(scheduler activaton) and 1:1 threading using KSE and maybe
traditional libc_r on FreeBSD 5.1.

  I've encountered several problems with KSE.  I made a small test
case program to demonstrate the problem.  The program accepts one
argument telling it how many threads should be created.  The main
thread creates given number of threads with user allocated stack
(pthread_attr_setstack()).  After createing all threads the main
thread waits forever.  Each created thread reads fd 0 (stdin).  After
reading some input from stdin, it prints the input and exits.  The
source of test program is appended at the tail of this mail.

  First problem is that I can hang whole operating system (even
ctrl-alt-sec doesn't work).  Creating 160 threads and pressing ctrl-c
after all threads are created hang the kernel reliably.

  Secondly, I cannot get more than 150 threads active at once.  I
guess this is the limit of KSEs per process.  Is there any way to
increase this number?  I'm looking at ten thousands threads at least.

  Thanks in advance.

/*****************************************************************/
/***************** test program source follows *******************/
/* compile with '$ gcc -D_THREAD_SAFE -o test test.c -lkse' ******/
/*****************************************************************/

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

static void * service_startup(void *arg)
{
	char buf[64];
	int ret;
	printf("service startup %d\n", (int)arg);
	if ((ret = read(0, buf, sizeof(buf)-1)) < 0)
		printf("read failed %d\n", errno);
	else {
		buf[ret] = '\0';
		printf("read: \"%s\"\n", buf);
	}
	printf("exiting\n");
	return NULL;
}

#define STACK_SIZE 32768

int main(int argc, char **argv)
{
	static const struct timespec ts1sec = { 1, 0 };
	int nr, i;

	if (argc < 2) {
		fprintf(stderr, "babo\n");
		return 1;
	}

	nr = atoi(argv[1]);

	for (i = 0; i < nr; i++) {
		void *stack;
		pthread_t thr;
		pthread_attr_t attr;

		if ((stack = malloc(STACK_SIZE)) == NULL) {
			fprintf(stderr, "malloc failed\n");
			return 1;
		}

		pthread_attr_init(&attr);
		pthread_attr_setdetachstate(&attr, 1);
		pthread_attr_setstack(&attr, stack, STACK_SIZE);

		if (pthread_create(&thr, &attr, service_startup, (void *)i) < 0) {
			fprintf(stderr, "pthread_create failed\n");
			return 1;
		}
	}

	while (1)
		nanosleep(&ts1sec, NULL);

	return 0;
}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030801011245.GA31048>