debian: Web Server PHP Benchmark 2

ต้องการเปลี่ยนเครื่องเซิร์ฟเวอร์ที่ใช้รัน 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) 1 2 3 4 5 avg
apache2-mpm-prefork mod_php5 7.277 6.701 6.523 6.549 6.528 6.7156
apache2-mpm-prefork mod_php5 php-apc 4.779 4.524 4.514 4.339 4.104 4.452
apache2-mpm-worker mod_fcgi 7.376 6.618 6.595 6.596 6.58 6.753
apache2-mpm-worker mod_fcgi php-apc 4.718 4.507 4.547 4.094 4.1 4.3932
lighttpd php5-cgi 7.178 7.111 6.484 6.439 6.481 6.7386
lighttpd php5-cgi php-apc 4.575 4.423 4.046 4.097 4.093 4.2468
nginx php5-cgi 7.139 6.394 6.411 6.395 6.4 6.5478
nginx php5-cgi php-apc 4.667 4.066 4.049 4.06 4.05 4.1784
BENCH2 - concurrent get 200 nodes (secs) 1 2 3 4 5 avg
apache2-mpm-prefork mod_php5 5.465 5.491 5.912 5.357 5.354 5.5158
apache2-mpm-prefork mod_php5 php-apc 5.142 5.204 5.195 5.067 5.078 5.1372
apache2-mpm-worker mod_fcgi 7.031 4.272 4.259 4.247 4.271 4.816
apache2-mpm-worker mod_fcgi php-apc 5.686 2.982 2.956 2.911 2.918 3.4906
lighttpd php5-cgi 4.771 4.759 4.657 4.18 4.15 4.5034
lighttpd php5-cgi php-apc 3.211 3.102 3.116 3.09 2.906 3.085
nginx php5-cgi 4.207 3.871 4.117 4.131 3.97 4.0592
nginx php5-cgi php-apc 2.801 2.824 2.975 2.857 2.399 2.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)

อ้างอิง