Messages in this thread |  | | Date | Fri, 19 Jan 2001 02:30:41 +0100 | | From | Andrea Arcangeli <> | | Subject | Re: [Lse-tech] Re: multi-queue scheduler update |
| |
On Thu, Jan 18, 2001 at 04:52:25PM -0800, Mike Kravetz wrote: > was less than the number of processors. I'll give the tests a try > with a smaller number of threads. I'm also open to suggestions for
OK!
> what benchmarks/test methods I could use for scheduler testing. If > you remember what people have used in the past, please let me know.
It was this one IIRC (it spawns threads calling sched_yield() in loop).
/* Tester for the kernel's speed in scheduling. (C) 1999 / Willy Tarreau <willy@meta-x.org>
Modified by Davide Libenzi <davidel@maticad.it>
You can do whatever you want with this program, but I'm not responsible for any misuse. Be aware that it can heavily load a host. As it is multithreaded, it might take advantages of SMP.
It basically creates a growing amount of threads and measures their cumulative work (i.e. loop iterations/second). The output is easily useable by gnuplot.
To compile, you need libpthread :
gcc -O2 -fomit-frame-pointer -o threads threads.c -lpthread
Output on stdout is : <nb_threads> <average_work> <zero_work_threads> <std_deviation>
*/
#include <stdio.h> #include <pthread.h> #include <signal.h> #include <unistd.h> #include <time.h>
#define MAXTHREADS 450 #define MEASURE_TIME 60
pthread_t thr[MAXTHREADS]; int nbthreads = MAXTHREADS; int measure_time = MEASURE_TIME; volatile actthreads = 0;
long long int totalwork[MAXTHREADS]; volatile int stop = 0, start = 0, count = 0;
void oneatwork(int thr) { int i; while (!start) /* don't disturb pthread_create() */ usleep(10000);
actthreads++; while (!stop) { if (count) totalwork[thr]++;
syscall(158); /* sys_sched_yield() */ } actthreads--; pthread_exit(0); }
main(int argc, char **argv) {
int i, err, avgwork, thrzero; long long int value, avgvalue; double sqrdev; time_t ts, te;
if (argc < 3) { printf("usage: %s threads time\n", argv[0]); exit(1); }
nbthreads = atoi(argv[1]); measure_time = atoi(argv[2]); start = 0; count = 0; stop = 0; actthreads = 0; thrzero = 0; value = 0; sqrdev = 0.0;
fprintf(stderr, "\nCreating %d threads ...", nbthreads); for (i = 0; i < nbthreads; i++) { if ((err = pthread_create(&thr[i], NULL, (void *) &oneatwork, (void *) i)) != 0) { fprintf(stderr, "thread %d pthread_create=%d -> ", i, err); perror(""); exit(1); } pthread_detach(thr[i]); }
for (i = 0; i < nbthreads; i++) totalwork[i] = 0;
fprintf(stderr, " OK !\nWaiting for all threads to start ...");
start = 1; while (actthreads != nbthreads) usleep(10000); /* waiting for a bit of stability */
fprintf(stderr, "Go !\n");
count = 1; time(&ts);
sleep(measure_time);
count = 0; stop = 1; time(&te);
for (i = 0; i < nbthreads; i++) { value += totalwork[i]; if (totalwork[i] == 0) ++thrzero; } avgvalue = value / nbthreads; value /= (int) difftime(te, ts); avgwork = (int) (value / nbthreads);
for (i = 0; i < nbthreads; i++) { double difvv = (double) (totalwork[i] - avgvalue);
sqrdev += difvv * difvv; }
while (actthreads > 0) usleep(10000);
printf("%d\t\t%lld\t\t%d\t\t%d\t\t%f\n", nbthreads, value, avgwork, thrzero, sqrdev / ((double) nbthreads * avgvalue * avgvalue));
exit(0);
}
Andrea - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org Please read the FAQ at http://www.tux.org/lkml/
|  |