У меня есть имена файлов (файлов сеанса), которые нельзя записать («На устройстве не осталось места»). Другие имена файлов (тот же каталог) в порядке. Диск не заполнен. Файловая система 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", которое действительно помогает работать с каталогами, содержащими так много файлов.