Возможные причины ошибки полного заполнения PHP /var/lib/php/session
У меня проблема с сеансами PHP, и я понятия не имею, как это исправить.
>> df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vglocal20120426-root00 36274176 32885458 3388718 91% /
tmpfs 6176642 1 6176641 1% /dev/shm
/dev/sda1 64000 47 63953 1% /boot
/dev/mapper/vglocal20120426-tmp00 131072 1703 129369 2% /tmp
а также
>> df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vglocal20120426-root00 545G 248G 270G 48% /
tmpfs 24G 0 24G 0% /dev/shm
/dev/sda1 243M 31M 199M 14% /boot
/dev/mapper/vglocal20120426-tmp00 2.0G 802M 1.1G 42% /tmp
и у меня есть эта сумасшедшая статистика
drwx-wx-wt 2 root root 1016389632 Jul 9 08:13 session
iNodes уже 91% и продолжает расти каждую секунду. Проблема в том, что у меня нет большого трафика (на основе аналитики в реальном времени) на мой сайт. Я не уверен, что здесь происходит. Как отследить проблему и предотвратить ее повторение.
Мы отключили сборщик мусора PHP и вместо этого использовали cronjob каждые 8 часов для удаления старых сессий.
Прямо сейчас служба технической поддержки запускает скрипт для удаления файлов сеанса, он работает вечно, так что это как бесконечный процесс.
Ценю, если кто-нибудь может помочь мне здесь. Спасибо
1 ответ
Ну, да, вы попали в правильный беспорядок. Проблема заключается в том, что в каталоге много файлов, и на их удаление могут уйти буквально недели. Вы не хотите cronjob (пока) - они, вероятно, просто накапливаются друг с другом и усугубляют проблему в настоящее время. Вы также хотите быть осторожным с тем, как именно вы делаете удаление - у вас не может быть ничего, что пытается сделать глобальные или иным образом перечислить все файлы, потому что это займет много времени и займет много памяти, прежде чем вы действительно удалите что-нибудь; вместо этого вы хотите сценарий, который будет readdir
и удалить, как они приходят (я подозреваю, хотя я не уверен, что find -delete
может сделать это; когда мне пришлось удалить несколько миллионов файлов, я использовал маленький скрипт ruby).
Как только вы вернули проблему под контроль (через несколько недель), вы можете запускать cronjob каждый час, чтобы уничтожить все, что старше, чем несколько дней / недель / что угодно. Полагаю, у вас там есть файлы сессий за годы. Будь я проклят, если я знаю, как, по моему опыту, PHP не так уж и плох в контроле над такими вещами.