在 CentOS 上排查 readdir(目录读取)相关问题,通常分为系统调用层面、文件系统层面、权限/SELinux 层面、性能层面几个方向。下面给你一套比较实用的排查思路。
先明确是哪种“readdir 问题”:
readdir() 很慢readdir() 返回错误(如 EACCES、ENOENT)ls / find 卡住ls -ld /path/to/dir
ls -l /path/to/dir | head
如果程序报错,先看 errno:
errno <错误号>
常见:
EACCES:权限不足ENOENT:目录不存在EMFILE / ENFILE:文件描述符耗尽strace -f -e trace=file -o /tmp/strace.log your_command
或只看 open / getdents:
strace -e trace=open,openat,getdents,getdents64 ls /path
strace ls /bigdir
如果卡在:
getdents64(...)
说明是内核读取目录项慢。
df -T /path
mount | grep path
dmesg | tail
journalctl -k | tail
ls /path | wc -l
或:
find /path -maxdepth 1 | wc -l
ext4 / xfs 对超大目录(几十万+)readdir 会明显变慢
namei -l /path/to/dir
getenforce
ls -Z /path
临时验证:
setenforce 0
(仅测试用)
如果是 NFS:
mount | grep nfs
nfsstat -c
常见:
readdir 慢 → NFS 服务端响应慢Stale file handle → NFS 状态异常top
iostat -x 1
df -i /path
perf top
| 现象 | 可能原因 |
|---|---|
| readdir 慢 | 目录文件过多 |
| 返回 EACCES | 权限 / SELinux |
| 卡在 getdents | 磁盘 IO / NFS |
| 程序随机失败 | fd 耗尽 |
| NFS 异常 | 服务端 / 网络 |
如果你能贴出:
我可以帮你更精准定位。