sched_yield() is very slow when other threads are busy on FreeBSD-current

From: NIIMI Satoshi <sa2c_at_sa2c.net>
Date: Sat, 29 Sep 2007 03:42:17 +0900
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
Received on Fri Sep 28 2007 - 17:07:14 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:18 UTC