Возможные причины ошибки полного заполнения 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 не так уж и плох в контроле над такими вещами.

Другие вопросы по тегам