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

Ошибка «На устройстве не осталось места» при записи определенных имен файлов сеансов

У меня есть имена файлов (файлов сеанса), которые нельзя записать («На устройстве не осталось места»). Другие имена файлов (тот же каталог) в порядке. Диск не заполнен. Файловая система ext3

PHP выдает ошибку при попытке создать файлы, но ошибку можно воспроизвести в командной строке:

# less /path/to/session_data/sess_u2q1pfelfr0jof3mp38jb2eaj1
/path/to/session_data/sess_u2q1pfelfr0jof3mp38jb2eaj1: No such file or directory
# touch /path/to/session_data/sess_u2q1pfelfr0jof3mp38jb2eaj1
touch: cannot touch `/path/to/session_data/sess_u2q1pfelfr0jof3mp38jb2eaj1': No space left on device
# touch /path/to/session_data/sess_u2q1pfelfr0jof3mp38jb2eaj0
# less /path/to/session_data/sess_u2q1pfelfr0jof3mp38jb2eaj0
# ls -al /path/to/session_data/sess_u2q1pfelfr0jof3mp38jb2eaj1
ls: /path/to/session_data/sess_u2q1pfelfr0jof3mp38jb2eaj1: No such file or directory

Обратите внимание на разные имена файлов. Кажется, что здесь нет никакого шаблона, но он влияет только на определенные имена файлов, и, похоже, они никогда не могут быть записаны.

Чтобы еще больше усложнить ситуацию, это сервер OpenVZ, но вы не можете писать / создавать эти имена файлов ни с виртуального сервера, ни с аппаратного узла.

В этом каталоге много файлов (18 456 002 на момент написания), но проблем с индексными дескрипторами нет, и диск определенно не заполнен.

По запросу df выводит:

[root@web1 session_data]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/simfs            2.7T  2.1T  495G  81% /
/dev/root             2.7T  2.1T  495G  81% /path/to/session_data
[root@web1 session_data]# df -i
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/simfs           726761472 22843560 703917912    4% /
/dev/root            726761472 22843560 703917912    4% /path/to/session_data

(Я отредактировал путь к данным сеанса, но он действительно монтируется отдельно таким образом, чтобы разрешить совместное использование данных сеанса между несколькими виртуальными серверами)

Ext3 выполняет хеширование имен файлов / каталогов.
С таким количеством файлов в одном каталоге я не удивлюсь, если у вас возникнут проблемы с хеш-коллизией.
Если все имена файлов имеют одинаковую длину и одинаковую структуру, вероятность коллизии еще больше.

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

У меня нет опыта в подобных вещах, поэтому я не могу дать вам более подробный совет.
(Однажды мы столкнулись с аналогичной проблемой в офисе, и резидентный гуру Linux использовал некоторую магию tunefs, чтобы решить эту проблему. Я так и не получил точных сведений о том, что он сделал. Просто это было связано с хэш-коллизиями в именах файлов .)

Очевидно, вы можете установить поведение хеширования с помощью tunefs. Существует также расширение ext3, называемое "dirindex", которое действительно помогает работать с каталогами, содержащими так много файлов.