在 CentOS(或其他 Linux 系统)上优化 readdir(目录遍历)性能,通常可以从系统调用方式、文件系统、目录结构、缓存、硬件等多个层面入手。下面按实用程度给你一个系统性的优化清单。
readdir 本身的开销getdents64 而非多次 readdirreaddir() 是 libc 封装,默认一次返回一项getdents / getdents64 一次读取多个目录项,系统调用次数更少示例(伪代码):
syscall(SYS_getdents64, fd, buf, bufsize);
很多语言(Python / Go)底层已经用了
getdents,但仍可避免不必要的封装层
readdir 受 BUFSIZ 限制opendir + readdir_r 或 getdents 时,缓冲区越大越好建议:
这是 readdir 慢的最常见原因
| 目录文件数 | 性能 |
|---|---|
| < 1k | 极快 |
| 10k | 正常 |
| 100k+ | 明显变慢 |
| 1M+ | 灾难 |
✅ 优化方案:
/data/2026/01/15/ab/cd/xxx
stat 每个文件常见错误:
while (readdir)
stat(file);
优化:
readdir,不 statd_type(仅 ext4/xfs 支持)if (entry->d_type == DT_REG) ...
CentOS 7/8 默认:
查看:
df -T
如果是 ext4:
tune2fs -O dir_index /dev/sdX
e2fsck -f /dev/sdX
noatime避免每次访问更新 atime:
mount -o remount,noatime /data
/etc/fstab:
/dev/sdb1 /data xfs defaults,noatime 0 0
echo 3 > /proc/sys/vm/drop_caches查看缓存命中:
free -h
cat /proc/meminfo | grep -i cached
vmtouch -t /data/bigdir
超大目录场景:
sysctl -w fs.file-max=1000000
ulimit -n 1000000
stat?如果你愿意,可以告诉我:
我可以直接给你针对性代码或参数。