Я запускал процесс Python, который создает огромное количество файлов в одном каталоге (я должен был быть умнее и объединять их в несколько каталогов, но это уже другая история).
Через некоторое время я заметил, что не могу идти дальше, и скрипт начал выдавать ошибку:
IOError: [Errno 28] No space left on device: /scr1/data/somefile_00023532.txt
После исследования я обнаружил, что наиболее распространенными причинами являются (1) раздел действительно не имеет свободного места и (2) все inode израсходованы. Тем не менее, df
показывает
$ df -h
...
/dev/sdb1 2.7T 1.2T 1.4T 46% /scr1
...
(/dev/sdb1 - рассматриваемый раздел) и
$ df -i
...
/dev/sdb1 183148544 17725595 165422949 10% /scr1
...
так что и космос, и иноды действительно доступны.
Там может быть слишком много файлов:
$ ls /scr1/data | wc
6468500 6468500 349747747
но ext4 должен справиться с этим.
Что может заставить Linux думать, что это место израсходовано?
ОБНОВЛЕНИЕ 1
Похоже, проблема возникает с конкретным именем файла. Например,
$ touch /scr1/data/somefilewithproblem.txt
touch: cannot touch ‘/scr1/data/somefilewithproblem.txt‘: No space left on device
но другие файлы с таким же шаблоном имени файла (я использую что-то мягкое, например, хэш в шестнадцатеричном формате, числовой идентификационный номер и т. д.) не имеют такой же проблемы.
ОБНОВЛЕНИЕ 2
ДУХ !! Похоже, файловая система как-то повреждена, и после запуска fsck.ext4
на соответствующем разделе проблема исчезла.
Большое спасибо тем, кто предложил мне помощь!