Nasze ostatnie projekty

Motoprawko.pl

Kontakt Z nami

DZIAŁ TECHNICZNY

hosting, domeny, kontakt z administratorem

Bartosz Radwan
mobile: +48 512 044 262
e-mail: b.radwan@znaminet.pl

DESIGN

projekty stron, grafika, animacje flash

Marzena Radwan
mobile: +48 500 145 203
e-mail: m.radwan@znaminet.pl

Porównanie wydajności nginx vs Apache

2009.06.22 Źródło: Informacje własne

Porównaliśmy wydajność serwerów http nginx oraz Apache dla różnych ilości żądań. Wyniki są dosyć ciekawe - okazuje się, że można poprawić wydajność serwera http o ponad 300%.

Środowisko testowe

Testowano serwowanie wyniku działania skryptu php o treści

<? phpinfo(); ?> 

W testach wykorzystaliśmy dystrybucję Linuxa PLD w wersji Th:

Linux bochost 2.6.28.9-1 #1 SMP Tue Mar 24 10:14:37 CET 2009 i686 Intel(R)_Xeon(TM)_CPU_2.40GHz PLD Linux 

 Działającą na sprzęcie:

#cat /proc/cpuinfo
processor : {1,2}
vendor_id : GenuineIntel
cpu family : 15
model : 2
model name : Intel(R) Xeon(TM) CPU 2.40GHz
stepping : 7
cpu MHz : 2372.910
cache size : 512 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 1
apicid : 1
initial apicid : 1
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe pebs bts cid
bogomips : 4747.08
clflush size : 64
power management:


#free -m
total used free shared buffers cached
Mem: 1004 713 291 0 0 101
-/+ buffers/cache: 610 393
Swap: 1945 1 1943

Wersje oprogramowania jakie zastosowano, to:

PHP:

php-dirs-1.1-3.noarch
php-fcgi-5.2.9-10.i686
php-common-5.2.9-10.i686

 Nginx:

nginx-0.7.59-1.i686
nginx-standard-0.7.59-1.i686

 Apache:

apache-base-2.2.11-10.i686
apache-mod_actions-2.2.11-10.i686
apache-mod_alias-2.2.11-10.i686
apache-mod_apparmor-2.3.907-2.i686
apache-mod_autoindex-2.2.11-10.i686
apache-mod_dir-2.2.11-10.i686
apache-mod_mime-2.2.11-10.i686
apache-mod_php-5.2.9-10.i686
apache-mod_vhost_alias-2.2.11-10.i686 

Jako narzędzie do testowania wykorzystano program ab przychodzący wraz z Apache:

$ ab -V
This is ApacheBench, Version 2.3 <$Revision: 655654>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Klient (ab) połączony był serwerem http za pomocą sieci 100Mbps poprzez switch Cisco.

Konfiguracja dla Apache i Nginx

Apache

Wykorzystano typową konfigurację z mod_php i httpd.prefork:

<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>

<Files *.php>
SetHandler application/x-httpd-php
</Files>

Nginx

W tym przypadku wykorzystano protokół FastCGI, stosując 2000 procesów php.fcgi podłączonych pod nginx za pomocą socketa unixowego:

worker_processes        5;
[...]
events {
worker_connections 2048;
use epoll;
}
[...]
server {
listen 80;
server_name hosting.bogus.pl;
access_log /var/log/nginx/traffic.log traffic ;
access_log /var/log/nginx/hosting.bogus.pl main;
location / {
autoindex on;
root /home/services/nginx/hosting.bogus.pl;
index index.html index.php;
}
location ~ \.php$ {
include /etc/nginx/fastcgi.params;
fastcgi_pass unix:/tmp/php-fcgi-socket;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/services/nginx/hosting.bogus.pl/$fastcgi_script_name;
}
}

 2000 procesów php uruchomiliśmy przy pomocy spawn-cgi:

spawn-fcgi -s /tmp/php-fcgi-socket -C 2000 -u test  -g users  -f /usr/bin/php.fcgi

 Wyniki testów

Apache, 10000 żądań, odpowiednio 1, 10 i 100 konkurencyjnych

Document Length:        30645 bytes
Concurrency Level: 1
Time taken for tests: 106.191 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 307750000 bytes
HTML transferred: 306450000 bytes
Requests per second: 94.17 [#/sec] (mean)
Time per request: 10.619 [ms] (mean)
Time per request: 10.619 [ms] (mean, across all concurrent requests)
Transfer rate: 2830.15 [Kbytes/sec] received

Document Length: 30645 bytes
Concurrency Level: 10
Time taken for tests: 106.602 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 307787784 bytes
HTML transferred: 306487524 bytes
Requests per second: 93.81 [#/sec] (mean)
Time per request: 106.602 [ms] (mean)
Time per request: 10.660 [ms] (mean, across all concurrent requests)
Transfer rate: 2819.59 [Kbytes/sec] received

Document Length: 30645 bytes
Concurrency Level: 100
Time taken for tests: 108.388 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 307779581 bytes
HTML transferred: 306479321 bytes
Requests per second: 92.26 [#/sec] (mean)
Time per request: 1083.875 [ms] (mean)
Time per request: 10.839 [ms] (mean, across all concurrent requests)
Transfer rate: 2773.07 [Kbytes/sec] received

Nginx, 10000 żądań, odpowiednio 1, 10 i 100 konkurencyjnych

Document Length:        32018 bytes
Concurrency Level: 1
Time taken for tests: 53.906 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 321400000 bytes
HTML transferred: 320180000 bytes
Requests per second: 185.51 [#/sec] (mean)
Time per request: 5.391 [ms] (mean)
Time per request: 5.391 [ms] (mean, across all concurrent requests)
Transfer rate: 5822.47 [Kbytes/sec] received

Document Length: 32018 bytes
Concurrency Level: 10
Time taken for tests: 28.432 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 321430408 bytes
HTML transferred: 320210286 bytes
Requests per second: 351.72 [#/sec] (mean)
Time per request: 28.432 [ms] (mean)
Time per request: 2.843 [ms] (mean, across all concurrent requests)
Transfer rate: 11040.46 [Kbytes/sec] received

Document Length: 32018 bytes
Concurrency Level: 100
Time taken for tests: 28.078 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 321465900 bytes
HTML transferred: 320245534 bytes
Requests per second: 356.15 [#/sec] (mean)
Time per request: 280.781 [ms] (mean)
Time per request: 2.808 [ms] (mean, across all concurrent requests)
Transfer rate: 11180.64 [Kbytes/sec] received

Wnioski

Wyraźnie widać dużą przewagę nginx nad Apache, w szczególności przy 10 i więcej jednoczesnych połączeniach. Przy 10 i 100 równoległych połączeniach Apache potrafi obsłużyć około 93 żądania na sekundę nginx wyrabia około 350, co daje 3.7 raza więcej przy porównywalnym loadavg serwera. Co więcej - obserwując ilość generowanego ruchu widać, że w przypadku nginxa zbliża się to możliwości sieci FastEthernet.

Na niekorzyść nginx przemawia fakt, że nie wspiera on obsługi plików .htaccess oraz składnia modułu przekierowań (odpowiednika apachowego mod_rewrite) jest nieco inna od składni mod_rewrite. Brak obsługi .htaccess dodatkowo sprawia, że konieczne jest zaszywanie dyrektyw rewrite w samym konfigu serwera, co może być trochę uciążliwe, niemniej jednak dosyć dużo jest w sieci opisów o tym jak pożenić z nginx popularne CMS.

Podsumowując - nginx wygląda na naprawdę bardzo wartą rozważenia alternatywę dla Apache. Testów wymaga jeszcze skalowanie się nginx wraz z ilością uruchomionych interpreterów php. Takie podejście jednak daje nam łatwe odseparowanie klientów od siebie, a także możliwość zastosowania dla nich osobnych plików php.ini. Aby podobną separację usyskać dla Apache należy albo stosować również php uruchomione jako FastCGI albo stosować mod_php w połączeniu z mod_apparmor, a to z kolei wymaga odpowiednio przygotowanego jądra systemu Linux a także dodatkowych zabiegów konfiguracyjnych.

Update

Dokonaliśmy testów z pominięciem sieci w wypadku nginx, ponieważ ilość generowanego ruchu niebezpiecznie zbliżała się do wydajności sieci. Otrzymane rezultaty:

Document Length:        32018 bytes
Concurrency Level: 100
Time taken for tests: 18.298 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 321416463 bytes
HTML transferred: 320196341 bytes
Requests per second: 546.52 [#/sec] (mean)
Time per request: 182.977 [ms] (mean)
Time per request: 1.830 [ms] (mean, across all concurrent requests)
Transfer rate: 17154.28 [Kbytes/sec] received

Jak widać, nginx w takiej konfiguracji prześciga apache około 5.8 razy. To jest chyba warte zachodu.