system call performance 4.x vs 5.x [and UP vs MP]
Don Bowman
don at sandvine.com
Wed Jan 28 09:20:50 PST 2004
This is a very simplistic benchmark, so don't get too hung up on the
accuracy.
If you run this on a given machine on 4.x vs 5.x, you will notice
a dramatic difference [yes, invariants, et al are disabled].
For example, on a 2.0GHz P4-Xeon, HTT enabled, MP kernel, i can
do ~1M socket/s calls on 4.7, but only ~250K/s on 5.2.
syscall 4.7 5.2
write 1015036 169800
socket 1078994 223253
select 430564 155077
gettimeofday 252762 183620
As a side note, any idea why gettimeofday is so much more
expensive than socket?
Any suggestion on why such a difference between 4.x and 5.x?
code is compiled the same on each, 'gcc -O2', no threading
options chosen.
For interest, you can try the same program on 4.x in UP vs MP,
and the difference is very dramatic too.
#include <sys/types.h>
#include <sys/uio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <stdio.h>
#define M(n) measure(#n, n);
static void
measure(char *name, void (*fp)(int,...))
{
double speed;
int j;
unsigned long long i = 0;
unsigned long long us;
struct timeval tp,tp1;
gettimeofday(&tp, 0);
tp1 = tp;
while (tp1.tv_sec - tp.tv_sec < 10)
{
for (j = 0; j < 1000000; j++)
{
fp(0,0,0,0);
i++;
}
gettimeofday(&tp1, 0);
}
us = ((tp1.tv_sec - tp.tv_sec) * 1000000) + (tp1.tv_usec - tp.tv_usec);
speed = (1000000.0 * i) / us;
printf("{%s: %llu %llu %6.2f}\n", name, i,us, speed);
}
static void
doGettimeofday()
{
double speed;
unsigned long long i = 0;
unsigned long long us;
struct timeval tp,tp1;
gettimeofday(&tp, 0);
tp1 = tp;
while (tp1.tv_sec - tp.tv_sec < 10)
{
gettimeofday(&tp1, 0);
i++;
}
us = ((tp1.tv_sec - tp.tv_sec) * 1000000) + (tp1.tv_usec - tp.tv_usec);
speed = (1000000.0 * i) / us;
printf("{gettimeofday: %llu %llu %6.2f}\n", i,us, speed);
}
int
main(int argc, char **argv)
{
M(write);
M(socket);
M(select);
doGettimeofday();
return 0;
}
More information about the freebsd-current
mailing list