在 CentOS(以及一般 Linux)上,readdir() / readdir64() 性能差,通常不是单一原因,而是多个因素叠加。下面按最常见 → 较少见的顺序说明。
ls、find、readdir 都很慢readdir() 本质是顺序遍历目录项✅ 解决方向:
dir_indextune2fs -l /dev/sdX | grep "directory index"
如果没有 dir_index:
✅ 解决:
tune2fs -O dir_index /dev/sdX
readdir() 本身不慢很多程序在 readdir() 后立刻调用:
stat()
lstat()
例如:
ls -lfindrsync这会导致:
readdir → stat → 磁盘随机 IO
✅ 验证:
strace -e trace=file your_program
✅ 优化:
getdents() + 批量处理opendir + readdir + fileno 方式减少系统调用readdir 会触发:
✅ 检查:
iostat -x 1
✅ 优化:
auditctl -l
如果监控了目录:
-w /data/logs -p r
readdir 会被严重拖慢
✅ 临时验证:
setenforce 0
如果是:
readdir 性能天然差:
✅ 优化:
readdir 实现效率一般✅ 升级:
# 目录大小
ls -1 | wc -l
# 文件系统
df -T
# IO 情况
iostat -x 1
# 系统调用
strace -e trace=file your_app
# SELinux
getenforce
CentOS 上 readdir 慢,90% 是因为“目录太大 + 后续 stat + 磁盘 IO”,而不是
readdir本身。
如果你愿意,可以告诉我:
我可以给你具体优化方案或代码示例。