В Ubuntu настроено задание cron, которое ищет и удаляет старые сессии 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
Моя проблема в том, что этот процесс занимает очень много времени, с большим количеством дискового ввода-вывода. Вот мой график использования процессора:
Ход очистки представлен шипами чирка. В начале периода работы PHP по очистке планировались по умолчанию 09 и 39 минут. В 15:00 я удалил 39-минутное время из cron, так что задание по очистке, в два раза превышающее размер, выполняется вдвое реже (вы можете видеть, что пики становятся в два раза шире и вдвое реже).
Вот соответствующие графики для времени ввода-вывода:
И дисковые операции:
На пике, где было около 14 000 активных сеансов, можно увидеть, что очистка выполняется в течение полных 25 минут, очевидно, используя 100% одного ядра ЦП и что, по-видимому, составляет 100% дискового ввода-вывода за весь период. Почему это так ресурсоемко? ls
Каталога сеанса /var/lib/php5
занимает всего долю секунды. Так почему же на обрезку старых сессий уходит целых 25 минут? Что я могу сделать, чтобы ускорить это?
Файловая система для этого устройства в настоящее время ext4, работает на 64-битной Ubuntu Precise 12.04.
РЕДАКТИРОВАТЬ: я подозреваю, что загрузка происходит из-за необычного процесса "fuser" (так как я ожидаю, что простой rm
будет чертовски быстрее, чем производительность, которую я вижу). Я собираюсь отказаться от использования термоэлемента и посмотреть, что произойдет.