在 CentOS(本质就是 Linux)上,readdir 性能慢,通常不是 readdir 函数本身的问题,而是目录规模、文件系统、缓存、调用方式等因素决定的。下面从原理 → 排查 → 优化手段系统说明。
readdir 本身是逐条读取目录项,慢通常来自:
ls -l 比 ls 慢很多ls -1 | wc -l
或
getdents 测试
第一次:
time ls dir
第二次:
time ls dir
如果第二次快很多 → 缓存命中问题
df -T dir
常见:
❌ 错误:
/data/logs/ <- 100 万文件
✅ 正确:
/data/logs/2026/01/21/
建议:
CentOS 7/8 推荐:
mkfs.xfs /dev/sdX
XFS 对:
❌ 慢:
while (readdir)
stat()
✅ 快:
readdir()
或
ls(不要 -l)
如果必须 stat:
stat() 批量getdents64readdir 是 glibc 封装,有额外开销
示例(简化):
#include <sys/syscall.h>
#include <linux/dirent.h>
syscall(SYS_getdents64, fd, buf, size);
好处:
CentOS 默认已启用:
cat /proc/sys/vm/vfs_cache_pressure
默认值 100,可调低:
sysctl -w vm.vfs_cache_pressure=50
增加 inode/dentry 缓存:
sysctl -w vm.dirty_*
如果是 NFS:
mount -o nocto,noatime,nodiratime
避免:
ls -lfind如果是:
/data/01
/data/02
...
用:
❌ 慢:
os.listdir + os.stat
✅ 快:
os.scandir() # Python 3.5+
用:
Files.newDirectoryStream
而不是 File.list()
readdir 提速 = 少文件 + XFS + 不 stat + 缓存命中 + 避免 NFS
如果你愿意,可以告诉我:
我可以直接给你针对性优化方案或代码。