某服务器系统日志报“Directory index full”,本文件记录了该问题的分析处理过程。
一、问题现象
1、现象
某台服务器无法访问,网络正常,业务中断,远程无法访问。
2、排查
连接到服务器控制台,发现系统根目录空间已满,深度排查,发现是/var/log/messages文件过大,把系统根目录占满,无法正常IO,系统内存快速耗尽,导致故障。
3、初步处理
强制重启服务器,重启后系统可以操作,对根目录空间进行部分清理,,排查系统var/log/messages日志文件
发现日志文件很大,核查文件内容,发现系统日志基本上全是以下告警信息:
二、问题分析
问题日志为目录索引满,于是从空间、inode、索引方面进行分析检查
1、初步检查
本服务器非常老旧了,操作系统还是centos6
[root@CentOS-6 ~]# cat /etc/redhat-release
CentOS release 6.5 (Final)
[root@CentOS-6 ~]# uname -a
Linux CentOS-6.5 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
根目录清理后各文件系统空间占用、inode占用
[root@CentOS-6 ~]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vg_centos6-lv_root
ext4 21G 18G 2.7G 87% /
tmpfs tmpfs 24G 388K 24G 1% /dev/shm
/dev/sda1 ext4 485M 40M 421M 9% /boot
/dev/mapper/appvg-lvapp
ext4 1.9T 391G 1.4T 22% /mysql
[root@CentOS-6 ~]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vg_centos6-lv_root
1384448 159702 1224746 12% /
tmpfs 6178438 46 6178392 1% /dev/shm
/dev/sda1 128016 39 127977 1% /boot
/dev/mapper/appvg-lvapp
127508480 35772692 91735788 29% /mysql
可见现在文件系统空间占用和inode已无问题
2、使用AI对日志进行问题分析
EXT4是Linux系统常用的一个文件系统类型。这个警告的意思是,在设备dm-2
上的一个目录的索引(directory index)已经满了。
在EXT4文件系统中,目录实际上是一种特殊类型的文件,用于存储子目录和文件的名称以及对应的inode号(inode是文件系统中存储文件元数据的区域)。为了加速目录的查找操作,EXT4使用了哈希索引(directory hash index)来组织目录项。当这个索引满了,文件系统就不能再向这个目录中添加新的条目了,于是就会发出这样的警告。
这个问题通常发生在以下几种情况:
-
目录内文件过多:当目录内包含的文件或子目录数量非常多时,索引可能会被填满。
-
文件系统碎片化:文件系统的碎片化也可能导致索引效率降低,最终可能耗尽可用的索引空间。
-
文件系统设计限制:EXT4文件系统在创建目录时,会为索引分配一定的空间。如果当初分配的空间不足以容纳后续的目录条目,就可能出现这个问题。
解决这个问题通常有以下几种方法:
-
重新组织目录结构:如果可能的话,将目录中的一部分文件或子目录移动到其他位置,以减少单个目录中的条目数量。
-
重新格式化文件系统:如果问题严重且无法通过重新组织目录结构解决,可能需要备份数据,重新格式化文件系统并恢复数据。
-
调整文件系统参数:在重新格式化文件系统时,可以调整相关参数,如inode大小、inode数量等,以适应未来的需求。
-
使用其他文件系统:如果EXT4文件系统不能满足需求,可以考虑使用其他类型的文件系统,如XFS或Btrfs,它们可能更适合处理大量文件和目录。
3、继续分析
定位问题目录:
[root@CentOS-6 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
sdb 8:16 0 2T 0 disk
└─appvg-lvapp (dm-2) 253:2 0 1.9T 0 lvm /mysql
sda 8:0 0 24G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 23.5G 0 part
├─vg_centos6-lv_root (dm-0) 253:0 0 21.1G 0 lvm /
└─vg_centos6-lv_swap (dm-1) 253:1 0 2.4G 0 lvm [SWAP]
可见问题设备dm-2实际上是应用侧的mysql数据文件目录/mysql,对应前面的逻辑设备为/dev/mapper/appvg-lvapp,/mysql实为挂载点。而目前该目录空间和inode均有较大空余。
4、再次重启服务器
在/mysql下进行创建文件并编写文件测试,发现文件创建及写入均正常。于是手动再次重启服务器,重启后检查服务器
[root@CentOS-6 ~]# tail -f /var/log/messages
Apr 28 11:05:02 CentOS-6 ntpd[2105]: 0.0.0.0 c012 02 freq_set kernel 61.610 PPM
Apr 28 11:05:02 CentOS-6 xinetd[2097]: xinetd Version 2.3.14 started with libwrap loadavg labeled-networking options compiled in.
Apr 28 11:05:02 CentOS-6 xinetd[2097]: Started working: 0 available services
Apr 28 11:05:12 CentOS-6 abrtd: Init complete, entering main loop
Apr 28 11:05:13 CentOS-6 sshd[2153]: Accepted password for AAAA from 10.227.16.188 port 59856 ssh2
Apr 28 11:05:19 CentOS-6 sshd[2522]: error: Bind to port 4422 on 0.0.0.0 failed: Address already in use.
Apr 28 11:05:19 CentOS-6 sshd[2522]: error: Bind to port 4422 on :: failed: Address already in use.
Apr 28 11:05:19 CentOS-6 sshd[2522]: fatal: Cannot bind any address.
Apr 28 11:05:22 CentOS-6 polkitd[2858]: started daemon version 0.96 using authority implementation `local' version `0.96'
Apr 28 11:05:23 CentOS-6 rtkit-daemon[2869]: Sucessfully made thread 2867 of process 2867 (/usr/bin/pulseaudio) owned by '42' high priority at nice level -11.
Apr 28 11:06:37 CentOS-6 kernel: NET: Unregistered protocol family 36
Apr 28 11:06:38 CentOS-6 kernel: Removing vmci device
Apr 28 11:06:38 CentOS-6 kernel: Resetting vmci device
Apr 28 11:06:38 CentOS-6 kernel: Unregistered vmci device.
Apr 28 11:06:38 CentOS-6 kernel: vmci 0000:00:07.7: PCI INT A disabled
Apr 28 11:07:43 CentOS-6 kernel: Probing for vmci/PCI.
Apr 28 11:07:43 CentOS-6 kernel: vmci 0000:00:07.7: PCI INT A -> GSI 16 (level, low) -> IRQ 16
Apr 28 11:07:43 CentOS-6 kernel: Found vmci/PCI at 0x1080, irq 16.
Apr 28 11:07:43 CentOS-6 kernel: VMCI: using capabilities 0xc.
Apr 28 11:07:43 CentOS-6 kernel: Registered vmci device.
Apr 28 11:07:44 CentOS-6 kernel: NET: Registered protocol family 36
Apr 28 11:08:17 CentOS-6 ntpd[2105]: 0.0.0.0 c615 05 clock_sync
...
系统日志文件恢复正常,系统已恢复。
三、问题总结
服务器系统日志报“Directory index full”,系因该日志文件对应目录文件数太多,目录索引满所致。对该目录进行小文件删除及空间回收后,需要再次重启服务器,操作系统才能完成目录索引结构重构,该错误才能消除,当然,还需及时对小文件生成的原因进行排查,避免异常生成大量小文件,快速占满目录索引。