Web Server PHP Benchmark

ต้องการเปลี่ยนเครื่องเซิร์ฟเวอร์ที่ใช้รัน Drupal จึงทดลองทดสอบเปรียบเทียบ Web Server และโปรแกรมที่ใช้รัน php รุ่นต่าง ๆ ไว้ดังนี้

  1. apache2-mpm-prefork libapache2-mod-php5
  2. apache2-mpm-worker libapache2-mod-fcgid php5-cgi
  3. lighttpd php5-cgi
  4. nginx php5-cgi spawn-fcgi

สมบัติ

  • เครื่อง: cpu E5200 ram 2G
  • os: Debian Squeeze 2.6.32-5-xen-amd64
  • mysql-server: 5.1.49-3
  • apache2: 2.2.16-4
  • lighttpd: 1.4.28-1
  • nginx: 0.7.67-3
  • php-apc: 3.1.3p1-2
  • สมมุติว่าลง Drupal ไว้ที่ /var/www/example.com/drupal

วิธี

ทำสคริปต์เรียก node ของ Drupal จากเซิร์ฟเวอร์ จำนวน 200 node โดยแบ่งเป็นแบบลำดับและแบบขนาน

  1. แบบลำดับ
    #!/bin/bash
    SERVER='www.example.com'
    time $(for i in `seq 101 300`;do wget -q -O- http://$SERVER/?q=node/$i; done)
    
  2. แบบขนาน
    #!/bin/bash
    SERVER='www.example.com'
    time $(
        for i in `seq 101 300`; do 
            wget -q -O- http://$SERVER/?q=node/$i & 
        done
    wait)
    

รัน 5 ครั้งแล้วดูค่าเฉลี่ย และได้เปรียบเทียบระหว่างไม่มีแคช กับมีแคชด้วย โดยใช้แพ็กเกจ php-apc

ผลการทดลอง

ได้ผลดังนี้

BENCH1 - sequential get 200 nodes (secs)12345avg
apache2-mpm-prefork mod_php57.2776.7016.5236.5496.5286.7156
apache2-mpm-prefork mod_php5 php-apc4.7794.5244.5144.3394.1044.452
apache2-mpm-worker mod_fcgi7.3766.6186.5956.5966.586.753
apache2-mpm-worker mod_fcgi php-apc4.7184.5074.5474.0944.14.3932
lighttpd php5-cgi7.1787.1116.4846.4396.4816.7386
lighttpd php5-cgi php-apc4.5754.4234.0464.0974.0934.2468
nginx php5-cgi7.1396.3946.4116.3956.46.5478
nginx php5-cgi php-apc4.6674.0664.0494.064.054.1784
BENCH2 - concurrent get 200 nodes (secs)12345avg
apache2-mpm-prefork mod_php55.4655.4915.9125.3575.3545.5158
apache2-mpm-prefork mod_php5 php-apc5.1425.2045.1955.0675.0785.1372
apache2-mpm-worker mod_fcgi7.0314.2724.2594.2474.2714.816
apache2-mpm-worker mod_fcgi php-apc5.6862.9822.9562.9112.9183.4906
lighttpd php5-cgi4.7714.7594.6574.184.154.5034
lighttpd php5-cgi php-apc3.2113.1023.1163.092.9063.085
nginx php5-cgi4.2073.8714.1174.1313.974.0592
nginx php5-cgi php-apc2.8012.8242.9752.8572.3992.7712

การติดตั้ง

ลงวิธีติดตั้งแบบหยาบ ๆ ไว้เพื่ออ้างอิง (แพกเกจ phpmyadmin ลงไว้เพื่อให้เดเบียนหา dependencies ให้)

1. apache2-mpm-prefork libapache2-mod-php5

ติดตั้ง

# aptitude install phpmyadmin

ปรับ apache2

# vi /etc/apache2/site-enabled/000-default
<VirtualHost *:80>
    ...
    #DocumentRoot /var/www
    DocumentRoot /var/www/example.com/drupal
    ...
    #<Directory /var/www/>
    <Directory /var/www/example.com/drupal/>
        Options Indexes FollowSymLinks MultiViews
        DirectoryIndex index.html index.php
        #AllowOverride None
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>
    ...
</VirtualHost>

เริ่มใหม่

# /etc/init.d/mysql restart
# /etc/init.d/apapche2 restart

(ถอดถอนด้วยคำสั่ง aptitude purge phpmyadmin apache2-mpm-prefork libapache2-mod-php5 apache2.2-common)

2. apache2-mpm-worker libapache2-mod-fcgid php5-cgi

ติดตั้ง

# aptitude install phpmyadmin apache2-mpm-worker libapache2-mod-fcgid php5-cgi

ปรับ apache2

# vi /etc/apache2/site-enabled/000-default
<VirtualHost *:80>
    ...
    #DocumentRoot /var/www
    DocumentRoot /var/www/example.com/drupal
    ...
    #<Directory /var/www/>
    <Directory /var/www/example.com/drupal/>
        Options Indexes FollowSymLinks MultiViews
        DirectoryIndex index.html index.php
        AddHandler fcgid-script .php
        FCGIWrapper /usr/lib/cgi-bin/php5 .php
        Options +ExecCGI
        #AllowOverride None
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>
    ...
</VirtualHost>

เริ่มใหม่

# /etc/init.d/mysql restart
# /etc/init.d/apapche2 restart

(ถอดถอนด้วยคำสั่ง aptitude purge phpmyadmin apache2-mpm-worker libapache2-mod-fcgid php5-cgi)

3. lighttpd php5-cgi

ติดตั้ง

# aptitude install phpmyadmin lighttpd php5-cgi

ปรับ lighttpd

# vi /etc/lighttpd/lighttpd.conf
...
#server.document-root        = "/var/www"
server.document-root        = "/var/www/example.com/drupal"
...
fastcgi.server = ( ".php" => ((
                     "bin-path" => "/usr/bin/php5-cgi",
                     "socket" => "/tmp/php.socket"
                 )))
...

เริ่มใหม่

# /etc/init.d/mysql restart
# /etc/init.d/lighttpd restart

(ถอดถอนด้วยคำสั่ง aptitude purge phpmyadmin lighttpd php5-cgi)

4. nginx php5-cgi spawn-fcgi

ติดตั้ง

# aptitude install phpmyadmin nginx php5-cgi spawn-fcgi

ปรับ spawn-fcgi

# cp /usr/share/doc/spawn-fcgi/run-php /usr/local/bin/spawn-fcgi-run-php
# vi /usr/local/bin/spawn-fcgi-run-php
...
#exec /usr/bin/spawn-fcgi -n -s /var/run/lighttpd/php-xxx.sock -n -u xxx -U www-data -- /usr/bin/php5-cgi
exec /usr/bin/spawn-fcgi -n -s /var/run/php-www-data.sock -n -u www-data -U www-data -- /usr/bin/php5-cgi
...
# sh /usr/local/bin/spawn-fcgi-run-php &

(ถ้าทำ server จริง ให้เอาคำสั่งนี้ไปใส่ใน /etc/rc.local ตรงก่อน exit 0 แล้วเปิดเครื่องใหม่)

ปรับ nginx

# vi /etc/nginx/sites-enabled/default
...
server {
...
    #server_name  localhost;
    server_name  _;
...
    location / {
        #root   /var/www;
        root   /var/www/example.com/drupal;
        #index  index.html index.htm;
        index  index.html index.htm index.php;
    }
...
    #location ~ \.php$ {
        #fastcgi_pass   127.0.0.1:9000;
        #fastcgi_index  index.php;
        #fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #includefastcgi_params;
    #}
    location ~ \.php$ {
        #fastcgi_pass   127.0.0.1:9000;
        fastcgi_pass   unix:/var/run/php-www-data.sock;
        fastcgi_index  index.php;
        #fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        fastcgi_param  SCRIPT_FILENAME  /var/www/example.com/drupal/$fastcgi_script_name;
        #includefastcgi_params;
        include fastcgi_params;
    }
..

เริ่มใหม่

# killall php5-cgi
# sh /usr/local/bin/spawn-fcgi-run-php &
# /etc/init.d/mysql restart
# /etc/init.d/nginx restart

(ถอดถอนด้วยคำสั่ง aptitude purge phpmyadmin nginx php5-cgi spawn-fcgi)

อ้างอิง

Creative Commons License ลิขสิทธิ์ของบทความเป็นของเจ้าของบทความแต่ละชิ้น
ผลงานนี้ ใช้สัญญาอนุญาตของครีเอทีฟคอมมอนส์แบบ แสดงที่มา-อนุญาตแบบเดียวกัน 3.0 ที่ยังไม่ได้ปรับแก้