Назад | Перейти на главную страницу

Нет места при ошибке устройства, но df сообщает, что доступно больше места

Мои сеансы PHP на моем веб-сервере Debian с использованием Apache2 с mod_php кажутся случайными ошибками, говоря, что нет места для их записи:

sudo tail -60 /var/log/apache2/error.log
[Fri Jan 30 15:55:35 2015] [error] [client xxx.xxx.xxx.xxx] PHP Warning:  session_start() [<a href='function.session-start'>function.session-start</a>]: open(/tmp/sess_555555555555555555, O_RDWR) failed: No space left on device (28) in /path/to-first-session-use/core/bootstrap.php on line 18

Когда я пытаюсь:

ls /tmp

Просто висит вечно, так что это плохо.

Но когда я проверяю свободное место и проверяю, что использование inode разумно ...

$ df -h

Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             150G  121G   22G  85% /
tmpfs                 2.0G     0  2.0G   0% /lib/init/rw
udev                   10M   16K   10M   1% /dev
tmpfs                 2.0G  4.0K  2.0G   1% /dev/shm

$ df -i

Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda1            19922944 11143605 8779339   56% /
tmpfs                 513524       4  513520    1% /lib/init/rw
udev                  513524     135  513389    1% /dev
tmpfs                 513524       3  513521    1% /dev/shm

Цифры кажутся хорошими. Конечно, 85% - это больше, чем мне хотелось бы, но это не 99% или что-то в этом роде.

Я подозревал, что это проблема из-за того, что компьютер не перезагружался в течение 5 лет и, возможно, было создано много небольших файлов, но информация об индексах, которую я получаю, как бы противоречит этому. Где мне вместо этого исследовать?

Редактировать:

ls -l /

drwxrwxrwt   4 root root 692M Feb  1 11:09 tmp/
drwxr-xr-x  10 root root 4.0K Jan  1  2013 usr/
drwxr-xr-x  14 root root 4.0K Oct  7  2010 var/
...etc

Может быть, /tmp/ сам каталог заполнен устаревшими сеансами PHP, которые не очищаются; это означает, что источник проблем может быть изолирован от /tmp/ сам каталог. Если это так, я бы просто удалил все /tmp/sess_* файлы. Сначала перечислите все sess_* такие файлы:

ls -la /tmp/sess_*

Или вы можете рассчитывать с wc как это:

ls -la /tmp/sess_* | wc -l

Теперь, когда вы получите какое-то подтверждение, что там какое-то безумное количество файлов, запустите эту команду, чтобы удалить /tmp/sess_* файлы:

sudo rm -rf /tmp/sess_*

И эфемерные файлы сеансов будут унесены ветром.

Но еще один грубый способ - но относительно безопасный - способ справиться с этим - сдуть /tmp каталог, воссоздайте /tmp каталог и перезагрузите сервер.

Поскольку /tmp Каталог - это, по сути, ручка для кодирования кэшированного материала, в нем нет ничего действительного. Поэтому мой лучший совет - запустить следующую команду, чтобы удалить и перестроить /tmp каталог.

rm -rf /tmp && mkdir /tmp/ && chown root:root /tmp && chmod 1777 /tmp

Теперь, когда один лайнер представляет собой список команд оболочки, соединенных && что сначала удалит /tmp, воссоздать /tmp, смените владельца /tmp вернуться к root:root а затем установите соответствующие разрешения для /tmp каталог. Если вы хотите, вы можете запускать каждую команду по очереди, если вы чувствуете себя безопаснее.

sudo rm -rf /tmp 
sudo mkdir /tmp
sudo chown root:root /tmp
sudo chmod 1777 /tmp

Как только это будет сделано, я бы рекомендовал перезагрузить сервер. Все должно быть спокойно, снова прояснено.

Иногда поврежденная файловая система может вызывать подобные эффекты - например, когда поврежден каталог / tmp. Или - когда файлов слишком много.

Для «быстрого» исправления:

mv /tmp /tmp.xxx
mkdir /tmp
chmod a+rwxt /tmp

Если это поможет - попробуйте перезагрузить систему и корневую файловую систему fsck. Если все в порядке - просто удалите каталог /tmp.xxx.

Другая возможность - когда / tmp является «другим» разделом или tmpfs (видно на vservers Linux), но он не отображается df (потому что df получает список разделов из файла / etc / mtab, что иногда неверно). Попробуйте проверить место на диске прямо в tmp командой:

df /tmp
df -i /tmp

Другой вариант, который обычно помогает в сессиях - это использование другого сессионного механизма. Если у вас много временных сессий, которые не должны быть очень постоянными, я бы порекомендовал использовать memcache для хранения сессий. Настроить его очень просто - вы должны установить php-memcache, memcached, а затем в php.conf настроить:

session.save_handler = memcache
session.save_path="tcp://server:port?persistent=1&weight=1&timeout=1&retry_interval=15"

Затем - сессии будут храниться в кэше памяти до определенного размера. над ним - старые будут автоматически удалены.

Для меня изменение fs.inotify.max_user_watches помогло.

root@grostruc:/# service ssh restart
Error: No space left on device
root@grostruc:/# sysctl fs.inotify.max_user_watches
fs.inotify.max_user_watches = 65536
root@grostruc:/# sysctl fs.inotify.max_user_watches=262144
fs.inotify.max_user_watches = 262144
root@grostruc:/# service ssh restart

Исправить измененное значение в /etc/sysctl.conf