FreeBSD: Webserver ungewöhnlich langsam

Hallo,

ich habe mir gerade das Wochenend-Projekt aufgehalst aus einem Debian-Server einen FreeBSD-Server zu machen und die Kiste treibt mich gerade in den Wahnsinn.

Bei einem Benchmark mit einer 56550 Bytes großen Datei liefert der Apache etwa 200-400 Requests pro Sekunde. Das ist peinlich bis schlimm. Unter Linux mit selber (völlig unoptimierten) Konfiguration sind es etwa 15400.

Bei 100 Paralellen Requests beantwortet er etwa 400 Requests die Sekunde. Bei 20 parallelen Requests nur noch 200. Nginx verhält sich equivalent.

Die Platten liefern schnell genug, Netz ist auch super, DNS-Lookups sind aus, innerhalb von Jails verhält es sich genauso wie ausserhalb, es gibt keine Einschränkungen in der /etc/login.conf, Top zeigt einen völlig gelangweilten Server. Und mir gehen wirklich die Ideen aus was da beim aufmachen neuer HTTP-Verbindungen so unglaublich ausbremst.

Irgendjemand eine tolle Idee? :)

root@linux ~ # ab -n 1000000 -c 100 http://127.0.0.1/test.html

Server Software: Apache/2.2.16
Server Hostname: 127.0.0.1
Server Port: 80

Document Path: /test.html
Document Length: 56550 bytes

Concurrency Level: 100
Time taken for tests: 65.068 seconds
Complete requests: 1000000
Failed requests: 0
Write errors: 0
Total transferred: 56832000000 bytes
HTML transferred: 56550000000 bytes
Requests per second: 15368.43 [#/sec] (mean)
Time per request: 6.507 [ms] (mean)
Time per request: 0.065 [ms] (mean, across all concurrent requests)
Transfer rate: 852947.61 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 0.4 2 5
Processing: 1 4 1.5 4 214
Waiting: 0 2 0.7 2 25
Total: 3 6 1.5 6 216

Percentage of the requests served within a certain time (ms)
50% 6
66% 7
75% 7
80% 7
90% 7
95% 7
98% 7
99% 7
100% 216 (longest request)

root@linux ~ # ab -n 1000000 -c 100 -k http://127.0.0.1/test.html

Server Software: Apache/2.2.16
Server Hostname: 127.0.0.1
Server Port: 80

Document Path: /test.html
Document Length: 56550 bytes

Concurrency Level: 100
Time taken for tests: 40.955 seconds
Complete requests: 1000000
Failed requests: 0
Write errors: 0
Keep-Alive requests: 990149
Total transferred: 56868556750 bytes
HTML transferred: 56550000000 bytes
Requests per second: 24417.28 [#/sec] (mean)
Time per request: 4.095 [ms] (mean)
Time per request: 0.041 [ms] (mean, across all concurrent requests)
Transfer rate: 1356030.76 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 3
Processing: 0 4 2.6 4 264
Waiting: 0 1 2.6 1 262
Total: 0 4 2.6 4 264

Percentage of the requests served within a certain time (ms)
50% 4
66% 4
75% 4
80% 4
90% 5
95% 5
98% 5
99% 6
100% 264 (longest request)

root@freebsd ~ # ab -n 1000000 -c 100 http://127.0.0.1/test.html

Server Software: Apache/2.2.24
Server Hostname: 127.0.0.1
Server Port: 80

Document Path: /test.html
Document Length: 56550 bytes

Concurrency Level: 100
Time taken for tests: 2000.132 seconds
Complete requests: 1000000
Failed requests: 0
Write errors: 0
Total transferred: 56846000000 bytes
HTML transferred: 56550000000 bytes
Requests per second: 499.97 [#/sec] (mean)
Time per request: 200.013 [ms] (mean)
Time per request: 2.000 [ms] (mean, across all concurrent requests)
Transfer rate: 27755.01 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 2
Processing: 100 200 0.8 200 300
Waiting: 1 100 0.8 100 201
Total: 102 200 0.8 200 301

Percentage of the requests served within a certain time (ms)
50% 200
66% 200
75% 200
80% 200
90% 200
95% 200
98% 200
99% 200
100% 301 (longest request)

root@freebsd ~ # ab -n 1000000 -c 100 -k http://127.0.0.1/test.html

Server Software: Apache/2.2.24
Server Hostname: 127.0.0.1
Server Port: 80

Document Path: /test.html
Document Length: 56550 bytes

Concurrency Level: 100
Time taken for tests: 25.005 seconds
Complete requests: 1000000
Failed requests: 0
Write errors: 0
Keep-Alive requests: 990105
Total transferred: 56882340833 bytes
HTML transferred: 56550761234 bytes
Requests per second: 39992.52 [#/sec] (mean)
Time per request: 2.500 [ms] (mean)
Time per request: 0.025 [ms] (mean, across all concurrent requests)
Transfer rate: 2221550.92 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 2
Processing: 0 2 22.3 0 322
Waiting: 0 1 12.5 0 222
Total: 0 2 22.3 0 323

Percentage of the requests served within a certain time (ms)
50% 0
66% 0
75% 0
80% 0
90% 0
95% 1
98% 1
99% 1
100% 323 (longest request)
 
Zuletzt bearbeitet:
Welches MPM verwendest du und wie sehen die Settings dafür aus? Gibt es hohe IO-Waits?
 
Die Benchmarks waren alles Worker. Als Prefork verhält es sich aber nur unwesentlich abweichend. Da Nginx sich ebenfalls genauso verhält, habe ich den Apachen als Fehlerquelle schon fast ausgeschlossen.

Code:
<IfModule mpm_worker_module>
    StartServers          2
    MaxClients          150
    MinSpareThreads      25
    MaxSpareThreads      75
    ThreadsPerChild      25
    MaxRequestsPerChild   0
</IfModule>

IO-Waits sehen auf den ersten Blick unauffällig aus. Das schaue ich morgen nochmal genau an. Die Kiste spricht so flüssig an und ist eher auffällig idle als ausgelastet.
 
Wie schnell reagiert denn z.B. der SSH-Server, sofern da einer läuft und welchen Durchsatz liefert z.B. ein scp? Wie sehen die Ping-Zeiten aus und sind sie stabil? Wenn da alles flüssig läuft, kann man das Netzwerk als Fehlerquelle auch ausschliessen.
 
Guten Morgen,

ich habe das Problem gelöst. Eigentlich hatte ich das Netzwerk als Fehler ausgeschlossen, aber weil ich dir da ein paar Werte liefern wollte habe ich auch gleich noch einen Blick über die Ausgabe von sysctl net.inet.tcp geworfen und festgestellt das net.inet.tcp.delayed_ack per Standard auf 1 steht.

sysctl net.inet.tcp.delayed_ack=0 und alles war gut. Manchmal können einen solche Defaults echt in den Wahnsinn treiben..


Danke für deine Mithilfe. :)
 
Zurück
Oben