错误描述
一个Node.js应用运行时出现了错误 , Error: ENOSPC: no space left on device
使用df查看,磁盘上的空间还很大,此时只占用了20GB空间,为什么呢?
应用场景: Linux ext4, 在某个目录下,会经常写入一个小文件,数量是很大的,百万级别。
按照网上的一些线索:
(1) 使用 docker system prune -af
这个只是去删除docker images
(2) 修改linux fs 最大user watches数量
默认为 8*1024=8192
cat /proc/sys/fs/inotify/max_user_watches
后来发现systemlog里报错,
EXT4-fs warning
index full, reach max htree level :2
Large directory feature is not enabled on this filesystem
原来问题是:
This "large directory" feature allows for exceeding the current limit of roughly 10 million entries allowed in a single directory with EXT4. The revised limit wasn't mentioned.
large_dir
This feature increases the limit on the number of files
per directory by raising the maximum size of directories
and, for hashed b-tree directories (see dir_index), the
maximum height of the hashed b-tree used to store the
directory entries.
// 查看是否打开了large directory feature
sudo tune2fs -l /dev/sdc | grep large_dir
// 打开 large directory feature , /dev/sdc为磁盘的设备名称
sudo tune2fs -O large_dir /dev/sdc
运行后,问题似乎解决了。
xfs文件系统由于是Dynamically Allocated inodes, 似乎也支持目录下的无限个文件。