问题
盯日志,发现如下信息
1 | 2021-12-20T06:29:06.112829+08:00 test-server kernel: [17763482.361803] EXT4-fs warning (device dm-1): ext4_dx_add_entry:2190: Directory (ino: 17956865) index full, reach max htree level :2 |
Directory (ino: 17956865) index full
第一反应哪个分区的inode满, 实际查看并没有
1 | root@test-server[test]:~# df -ih |
查看device dm-1
具体指哪个设备udevadm info -q all --name='/dev/dm-1'
并根据相关信息确认其挂载点
关键信息如下: LVM分区/dev/vg_test/lv_home, 挂载点/home
1 | P: virtual dm-1 |
找出存在大量文件的目录ino: 17956865
1 | root@test-server[test]:~# find /home/ -inum 17956865 |
或直接暴力统计
1 | for i in `ls`; do echo $/home/$i; find /home/$i/ -type f | wc -l ; done |
发现/home/test/deloy
目录下存在1000多万文件
结合日志输出Large directory feature is not enabled on this filesystem
, 翻man ext4
,man tune2fs
,一些关键特性
- large_dir
- large_file
- dir_index
- dir_nlink
- … …
结合tune2fs -l /dev/mapper/vg_test-lv_home
关键输出
1 | Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize |
描述看以下方式可以解决问题(不建议,需最终确认这种场景是不是正常)
1 | tune2fs -O large_dir /dev/mapper/vg_test-lv_home |
疑问:inode既然没满,为什么会有告警?
继续翻和搜https://en.wikipedia.org/wiki/Ext4,发现关键信息: 大概意思就是
- ext4自身没有做相关方面的限制
- Linux 2.6.23以后引入的HTree索引做的,2-level HTree索引限定了约10-12 million(百万)
- Linux 4.12后largedir特性开启的话3-level限定了约6 billion(十亿)
1 | Unlimited number of subdirectories |
有兴趣的可继续翻翻具体怎么做的限定… …