Cache d’opcode APC sur serveur Debian

 

Définition Wikipédia : APC (pour Alternative PHP Cache) est une extension PECL (PHP Extension Community Library) libre et gratuite destinée à améliorer les performances des applications écrites en langage PHP en précompilant le code intermédiaire et en le plaçant dans un cache.

Schéma de fonctionnement

Voici un schéma expliquant le fonctionnement du système de cache d'APC :

Mise en place

De façon à profiter du maximum de fonctionnalités d'APC, on va installer la dernière version.

Dépendances

On commence par installer les dépendances nécessaires à la compilation :

# apt-get install build-essential php5-dev libpcre3-dev

 

Compilation et installation

# cd /usr/src
# wget http://pecl.php.net/get/APC
# tar xvzf APC
# cd APC-3.1.7/
# phpize5
# ./configure --with-php-config=/usr/bin/php-config5 --enable-apc
# make
# make install

 

Configuration

Dans /etc/php5/apache2/php.ini :

[apc]
extension=apc.so
apc.enabled=1
apc.shm_segments=1
apc.shm_size=128M

On définit donc un segment mémoire de 128M.
Si ce segment de mémoire n'est pas assez grand, on l'agrandira après analyse de l'utilisation.

Dans la configuration du vhost :

## APC
php_admin_value apc.enabled                           1
php_admin_value apc.include_once_override             1
php_admin_value apc.canonicalize                      1
php_admin_value apc.rfc1867                           1
php_admin_value apc.stat                              0

On a ainsi la possibilité d'activier ou de désactiver le cache APC par vhost.

 

Analyse

Visualisation de l'utilisation du cache

Dans le répertoire /usr/src/APC_3.1.7 on peut trouver un script apc.php qui permet de visualiser l'utilisation du cache.

Il faut le mettre en place dans un vhost et par mesure de sécurité mettre une authentification sur cette page.

On va s'intéresser à la partie graphique, le reste étant un récapitulatif de la configuration.

 

Première visualisation

Avant d'accéder à un des quelconques sites voici un exemple de ce qu'on peut voir :

 

Après un premier hit sur la page d'accueil d'un site

On voit ici que 97% des hits ne sont pas pris en compte par le cache, logique vu que rien n'a été mis en cache pour l'instant.

 

Après plusieurs hits

Après une série de benchs par exemple.

On voit maintenant que 99,8% des hits sont pris en compte par le cache.

Notre cache marche donc très bien.

IMPORTANT : si le graphs "Detailled Memory and Fragmentation" fait apparaître une fragmentation trop importante, il faut augmenter la valeur de apc.shm_size=128M

 

Analyse numérique

Quelques résultats avec  Apache Benchs :

# ab -n 500 -c15 -H "Accept-Encoding: gzip" http://blog-test.cheramy.name/

Les benchs sont effectués sur la même plateforme sur une installation serveur simple de base et un site WordPress basique.

Sans APC Avec APC
Requests per second (#/sec) 2.32 3.48
Time per request (ms) 6459.724 4309.349

 

Problème avec APC-3.1.8 et Debian Squeeze

J'ai pas approfondi donc je sais pas si ça vient de Debian Squeeze ou d'APC-3.1.8 mais en tout cas cette combinaison ne marche pas. Je me retrouve avec des erreurs :

PHP Fatal error:  require_once(): Failed opening required

sur des projets WordPress.

Donc pour le moment j'utilise toujours APC-3.1.7.

Un petit lien pour le télécharger : {filelink=2}

Si quelqu'un à une idée sur le pourquoi ...

A lire aussi

http://blog.processus.org/fr/node/178
http://www.php.net/manual/en/apc.configuration.php