Re: (Another) simple benchmark

From: Steve Hodgson <steve_at_stevehodgson.co.uk>
Date: Thu, 18 May 2006 21:26:27 +0100
Ivan Voras wrote:
> Today I had the opportunity to experiment for a short time with a
> 4-CPU Xeon machine with hyperthreading (-> 8 logical CPU-s) and 3GB
> RAM. In absence of anything smarter to do, I installed WBEL 3 Linux
> (non-RedHat version of RedHat Enterprise Linux) which was accidentally
> on the table and after toying around I've run a simple benchmark - ab
> (apachebench, included by default with apache server) over localhost
> to a local apache2 server, on a static home-page file. The command
> line was "ab -n 100000 -c 100 http://localhost/". Since I still had
> time with the machine, I then downloaded and installed FreeBSD 6.1 to
> try to beat the score. Unfortunately, not only I couldn't beat the
> score, but the results were *extremely* bad. Since I'm still not sure
> it isn't my fault, I won't post the actual results, but I wonder...
>
> Apache is a well known server-grade product, which doesn't use
> threading (it was preforked in both systems), doesn't call
> gettimeofday() constantly, uses sendfile(), and in short, is very
> different from MySQL. It shouldn't behave this badly on FreeBSD.
>
> Some observations from the benchmark runs:
> - Linux was maxed out with ~50% total idle time, each logical
> processor (hyperthreading was enabled) had ~25% user + ~25% sys time.
> It still delivered order-of-magnitude better results. WBEL3 uses Linux
> 2.4.x kernel (i.e. old kernel)
> - FreeBSD CPU time was 100% spent, with 90%-95% spent in sys time
> - On FreeBSD, enabling hyperthreading got me a slowdown of *4x* over
> the initial (bad) results (some slowdown is not surprising, 4x
> slowdown is).
> - Linux "load average" never went above 8, FreBSD's went > 60; this
> could be just a difference in accounting, or it could not - I don't know.
>
> What is needed to reproduce this simple benchmark:
> - SMP machine, the more CPUs the better
> - installed software: only apache20. The "ab" benchmark is included in
> it. Leave apache's default configuration as-is (i.e. preforked, max
> 150 parallel clients allowed)
> - A simple static HTML page (Apache's default "welcome, but this site
> is not configured" should be ok).
> - my invocation of "ab" was with "-n 100000 -c 100" ; the (n)umber of
> requests could be modified to fit local CPU speed, but (c)oncurrency
> shouldn't (100 parallel requests is not uncommon).
>
Apache may not use gettimeofday, but ab certainly does. here is a truss
output of ab:


gettimeofday({1147982776 251498},0x0)            = 0 (0x0)
connect(0x5f,{ AF_INET 127.0.0.1:80 },16)        = 0 (0x0)
gettimeofday({1147982776 253078},0x0)            = 0 (0x0)
write(95,0x80546e0,0)                            = 0 (0x0)
gettimeofday({1147982776 254325},0x0)            = 0 (0x0)
write(95,0x80546e0,84)                           = 84 (0x54)
gettimeofday({1147982776 256705},0x0)            = 0 (0x0)
read(0x60,0x80522c0,0x2000)                      = 0 (0x0)
gettimeofday({1147982776 258209},0x0)            = 0 (0x0)
close(96)                                        = 0 (0x0)
socket(0x2,0x1,0x0)                              = 96 (0x60)
fcntl(96,F_GETFL,0x0)                            = 2 (0x2)
fcntl(96,F_SETFL,0x6)                            = 0 (0x0)
gettimeofday({1147982776 263102},0x0)            = 0 (0x0)
connect(0x60,{ AF_INET 127.0.0.1:80 },16)        = 0 (0x0)
gettimeofday({1147982776 264622},0x0)            = 0 (0x0)
write(96,0x80546e0,0)                            = 0 (0x0)
gettimeofday({1147982776 265949},0x0)            = 0 (0x0)
write(96,0x80546e0,84)                           = 84 (0x54)
gettimeofday({1147982776 268711},0x0)            = 0 (0x0)
read(0x61,0x80522c0,0x2000)                      = 0 (0x0)
gettimeofday({1147982776 270031},0x0)            = 0 (0x0)
close(97)                                        = 0 (0x0)

A fairer test would be to use ab on a second box and keep ab on the same
OS - you're changing two things at once here. You're also at the mercy
of how the scheduler places the processes across the different CPU's
(since there is one ab process and multiple httpd processes). Why was
Linux stuck at 50% utilization per CPU (surely it should reach 100% with
no disk or network constraints)? Perhaps it is sleeping whilst FreeBSD
spins?

If you are interested in performance try Lighttpd - that is what people
use if they want high transaction rates (x10 higher in tests I've done
on Linux) - and it is a single process so scheduling isn't so significant.

Finally, I'm using apache 2.0.X on 6.1, and ab and apache are both using
poll(2). I don't know if apache 2.2 (well, apr really) supports
kqueue/(epoll  on linux) yet, but it could be worth investigating. Its
conceivable the kernel is spinning on multiple processes hitting poll at
the same time [does apache still serialize access to poll??]. Does apr
use non-portable atomic ops on FreeBSD like it does on Linux 2.4+?

I'd setup a second box [Though then you are bringing different network
implementations into it.], and also test Lighttpd. Sorry I've got lots
of questions and no answers!

Steve



> Since I didn't have time to reinstall Linux to check if apache's
> configuration was the same in all important things all this may be
> bogus, but if anyone has a spare box with several CPUs, I'd be
> interested in results.
>
> p.s. I don't think the actual Linux kernel version matters here, any
> 2.4 or newer will do.
>
>
> _______________________________________________
> freebsd-current_at_freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-current
> To unsubscribe, send any mail to
> "freebsd-current-unsubscribe_at_freebsd.org"
Received on Thu May 18 2006 - 18:26:34 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:38:55 UTC