Ubuntu a une configuration de tâche cron qui recherche et supprime les anciennes sessions PHP:
# Look for and purge old sessions every 30 minutes
09,39 * * * * root [ -x /usr/lib/php5/maxlifetime ] \
&& [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 \
-maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) ! -execdir \
fuser -s {} 2> /dev/null \; -delete
Mon problème est que ce processus prend très longtemps à s'exécuter, avec beaucoup d'E / S de disque. Voici mon graphique d'utilisation du processeur:
Le nettoyage en cours d'exécution est représenté par les pointes sarcelles. Au début de la période, les travaux de nettoyage de PHP étaient programmés aux heures par défaut de 09 et 39 minutes. À 15h00, j'ai supprimé le temps de 39 minutes de cron, donc un travail de nettoyage deux fois plus grand s'exécute deux fois plus souvent (vous pouvez voir les pics devenir deux fois plus larges et deux fois plus fréquents).
Voici les graphiques correspondants pour le temps d'E / S:
Et opérations sur disque:
Au pic où il y avait environ 14000 sessions actives, le nettoyage peut être exécuté pendant 25 minutes complètes, utilisant apparemment 100% d'un cœur du CPU et ce qui semble être 100% des E / S du disque pour toute la période. Pourquoi est-il si gourmand en ressources? Un ls
répertoire de session ne /var/lib/php5
prend qu'une fraction de seconde. Alors, pourquoi faut-il 25 minutes pour couper les anciennes sessions? Puis-je faire quelque chose pour accélérer cela?
Le système de fichiers de cet appareil est actuellement ext4 et fonctionne sur Ubuntu Precise 12.04 64 bits.
EDIT: je soupçonne que la charge est due au processus inhabituel "fuser" (car je m'attends à ce qu'un simple rm
soit un sacrément plus rapide que les performances que je vois). Je vais supprimer l'utilisation de l'unité de fusion et voir ce qui se passe.