Ubuntu ha un cron job impostato che cerca ed elimina le vecchie sessioni 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
Il mio problema è che l'esecuzione di questo processo richiede molto tempo, con un sacco di I / O su disco. Ecco il mio grafico di utilizzo della CPU:

La corsa di pulizia è rappresentata dai picchi dell'alzavola. All'inizio del periodo, i lavori di pulizia di PHP erano programmati alle ore predefinite di 09 e 39 minuti. Alle 15:00 ho rimosso i 39 minuti di cron, quindi un lavoro di pulizia due volte più grande viene eseguito la metà delle volte (puoi vedere che i picchi diventano due volte più larghi e la metà più frequenti).
Ecco i grafici corrispondenti per il tempo di I / O:

E operazioni su disco:

Al picco in cui erano attive circa 14.000 sessioni, si può vedere che la pulizia è in esecuzione per 25 minuti interi, apparentemente usando il 100% di un core della CPU e quello che sembra essere il 100% dell'IO del disco per l'intero periodo. Perché è così intenso in termini di risorse? Una lsdirectory della sessione /var/lib/php5richiede solo una frazione di secondo. Allora perché ci vogliono 25 minuti interi per tagliare le vecchie sessioni? C'è qualcosa che posso fare per accelerare questo?
Il filesystem per questo dispositivo è attualmente ext4, in esecuzione su Ubuntu Precise 12.04 64-bit.
EDIT: sospetto che il carico sia dovuto al processo insolito "fuser" (dal momento che mi aspetto che un semplice rmsia uno spettacolo dannatamente più veloce delle prestazioni che sto vedendo). Ho intenzione di rimuovere l'uso del fusore e vedere cosa succede.


