sched_yield() is very slow when other threads are busy on
FreeBSD-current
NIIMI Satoshi
sa2c at sa2c.net
Fri Sep 28 12:09:06 PDT 2007
Hi,
I experienced sched_yield() is very slow when other threads are busy
on FreeBSD-current.
When I run the program:
------------------------------------------------
#include <assert.h>
#include <stdio.h>
#include <pthread.h>
#define NUM_THREAD (10)
volatile int run = 0;
void *start(void *p)
{
while (!run)
;
return p;
}
int main()
{
pthread_t th[NUM_THREAD];
int i;
for (i = 0; i < NUM_THREAD; i++) {
assert(pthread_create(&th[i], NULL, start, NULL) == 0);
sched_yield();
}
run = 1;
for (i = 0; i < NUM_THREAD; i++)
assert(pthread_join(th[i], NULL) == 0);
return 0;
}
------------------------------------------------
The output of /usr/bin/time:
FreeBSD 6.2-RELEASE, libthr, HZ=100, GENERIC kernel:
0.55 real 0.55 user 0.00 sys
FreeBSD 7-CURRENT, libthr, HZ=100, kernel
include GENERIC
nooptions INVARIANTS, INVARIANT_SUPPORT, WITNESS, WITNESS_SKIPSPIN:
164.16 real 162.80 user 0.00 sys
I tried SCHED_ULE too, but does not help so much.
Increasing HZ helps to perform better, but still very slower than FreeBSD-6.
Thanks,
--
NIIMI Satoshi
More information about the freebsd-threads
mailing list