De l’interêt d’un peu d’opcode cache quand on utilise un langage interpreté

Les utilisateurs l’oublient souvent, php c’est bien beau et pratique, mais c’est un langage interprété à chaque utilisation .. Ce qui donne des résultats catastrophiques en termes de performance ..

D’où l’apparation d’outils tels qu’apc, eaccelerator, xcache ..

Personnellement, je n’ai pas constaté à ce jour de grosse différence entre les deux premiers et trouve le dernier un peu moins pratique à l’utilisation .. Je vous laisse comparer par vous même ;)

Installation et attribution de 512mo de ram pour le cache:

apt-get install php-apc
echo "apc.enabled=1" >> /etc/php5/conf.d/apc.ini
echo "apc.shm_size=512" >> /etc/php5/conf.d/apc.ini

Pour en revenir à l’intérêt de notre opcode, sur cette page, nous avions vu qu’un lamp sans configuration/optimisation pouvait nous renvoyer 23 pages par seconde.

Voyons voir maintenant :

guillaume@mars:~ # ab -n1000 -c 23 http://test-joomla.domaine.com/
This is ApacheBench, Version 2.0.41-dev <$Revision: 1.121.2.12 $> apache-2.0
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 2006 The Apache Software Foundation, http://www.apache.org/
Benchmarking test-joomla.domaine.com (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Finished 1000 requests
Server Software:        Apache/2.2.16
Server Hostname:        test-joomla.domaine.com
Server Port:            80
Document Path:          /
Document Length:        15155 bytes
Concurrency Level:      23
Time taken for tests:   26.154066 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      15543000 bytes
HTML transferred:       15155000 bytes
Requests per second:    38.23 [#/sec] (mean)
Time per request:       601.544 [ms] (mean)
Time per request:       26.154 [ms] (mean, across all concurrent requests)
Transfer rate:          580.33 [Kbytes/sec] received
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        4   34 298.6      4    3004
Processing:   250  561  83.7    580     724
Waiting:      213  527  78.3    544     666
Total:        254  595 313.5    584    3675
Percentage of the requests served within a certain time (ms)
  50%    584
  66%    599
  75%    611
  80%    619
  90%    639
  95%    657
  98%    689
  99%   3536
 100%   3675 (longest request)

Et bien, on a réussi à faire descendre le temps par requête de 42 à 26ms, et on peut dorénavant servir jusqu’à 38 requêtes en simultané. Plutôt pas mal l’opcode non ? ;)

Mise en place d’un lamp ( Linux / Apache / Mysql / Php )

Pré-requis : un serveur linux ( on utilisera ici une Debian 6.0 ) sans rien d’installer dessus.

Pour la suite de l’article, on dira que le serveur a une entrée dns correctement configurée ( ainsi que le reverse ) pour serveur.domaine.com

Installation des logiciels

Ca, on utilise simplement apt et c’est reglé ;)

root@serveur:/home# apt-get install apache2 libapache2-mod-php5 php5 php5-gd php5-mysql mysql-server
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
  apache2-mpm-prefork apache2-utils apache2.2-bin apache2.2-common fontconfig-config heirloom-mailx libapr1 libaprutil1
  libaprutil1-dbd-sqlite3 libaprutil1-ldap libdbd-mysql-perl libdbi-perl libfontconfig1 libgd2-xpm libhtml-template-perl libjpeg62
  libmysqlclient16 libnet-daemon-perl libonig2 libplrpc-perl libpng12-0 libqdbm14 libt1-5 libx11-6 libx11-data libxpm4
  mysql-client-5.1 mysql-common mysql-server-5.1 mysql-server-core-5.1 php5-cli php5-common php5-suhosin ssl-cert ttf-dejavu-core
Suggested packages:
  apache2-doc apache2-suexec apache2-suexec-custom exim4 mail-transport-agent php-pear libgd-tools libipc-sharedcache-perl
  libterm-readkey-perl tinyca openssl-blacklist
Recommended packages:
  mailx
The following NEW packages will be installed:
  apache2 apache2-mpm-prefork apache2-utils apache2.2-bin apache2.2-common fontconfig-config heirloom-mailx libapache2-mod-php5
  libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libdbd-mysql-perl libdbi-perl libfontconfig1 libgd2-xpm
  libhtml-template-perl libjpeg62 libmysqlclient16 libnet-daemon-perl libonig2 libplrpc-perl libpng12-0 libqdbm14 libt1-5 libx11-6
  libx11-data libxpm4 mysql-client-5.1 mysql-common mysql-server mysql-server-5.1 mysql-server-core-5.1 php5 php5-cli php5-common
  php5-gd php5-mysql php5-suhosin ssl-cert ttf-dejavu-core
0 upgraded, 41 newly installed, 0 to remove and 0 not upgraded.
Need to get 37.3 MB of archives.
After this operation, 96.8 MB of additional disk space will be used.
Do you want to continue [Y/n]? Y
....

On verifie que les services tournent bien :

root@serveur:/home# netstat -an | grep LISTEN | egrep "(80|3306)"
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN
tcp6       0      0 :::80                   :::*                    LISTEN

Il semblerait qu’on ait bien quelque chose qui ecoute sur le port 3306 et uniquement sur localhost, le serveur mysql à bien l’air installé.

De même pour le port 80, on doit donc donc avoir apache de lancé. Il suffit de vérifier à l’aide d’un navigateur/telnet que monserveur.mondomaine.com réponds bien et affiche bien “It Works”

Les choses sérieuses, création d’un premier site de test ..

Mise en place de l’arborescence des répertoires

root@serveur:/# mkdir /var/www/www.domaine.com
root@serveur:/# mv /var/www/index.html /var/www/www.domaine.com

On met les droits qui vont bien

root@serveur:/# chown -fR www-data:www-data /var/www/*
root@serveur:/# chmod -fR g+rwxs /var/www/*
root@serveur:/# chmod -fR o-rwx /var/www/*

Prendre votre éditeur de texte préféré pour éditer le fichier /etc/apache2/sites-available afin d’obtenir :

<VirtualHost *:80>
        ServerAdmin webmaster@domaine.com
        ServerName serveur.domaine.com
        DocumentRoot /var/www/serveur.domaine.com
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/serveur.domaine.com/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>
        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>
        ErrorLog ${APACHE_LOG_DIR}/serveur.domaine.com-error.log
        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn
        CustomLog ${APACHE_LOG_DIR}/serveur.domaine.com-access.log combined
</VirtualHost>

On demande à apache de verifier la configuration :

root@srv1:~# apachectl configtest
Syntax OK

Ne reste plus, qu’a lui faire prendre en compte

root@serveur:/# /etc/init.d/apache2 reload
Reloading web server config: apache2.