在 Debian(及其他 Linux 发行版)上,readdir 性能瓶颈通常不在于 readdir() 本身,而在于目录大小、文件系统、缓存状态和应用调用方式。下面按“见效快慢”给你一套实用提速方案。
ls -la /path/to/dir >/dev/null
或
find /path/to/dir -maxdepth 1 >/dev/null
第一次 readdir 慢,通常是因为:
反复访问的目录一定要热起来。
sysctl -w vm.vfs_cache_pressure=50
(默认 100,越小越倾向保留 dentry/inode)
长期可写:
/etc/sysctl.d/99-vfs.conf
vm.vfs_cache_pressure=50
readdir 是 O(n) 的,目录里:
✅ 解决方案:
a/b/c/abcxxxx
2026/01/20/xxx
| 文件系统 | readdir 表现 |
|---|---|
| ext4 | 好(默认推荐) |
| xfs | 大目录更好 |
| btrfs | 小文件多时不友好 |
| tmpfs | 极快(仅内存) |
大目录场景建议:
mkfs.xfs /dev/sdX
getdents64 而不是 readdirreaddir() 是一次读一个:
while ((de = readdir(dir)))
更快方式:
getdents64(fd, buf, BUFSIZ);
或使用:
fdopendir + readdir很多人这样写:
readdir()
-> stat()
这是 10 倍性能杀手
✅ 正确做法:
d_type(DT_REG / DT_DIR)de->d_type
openat() + 缓存 fdint dfd = open(path, O_DIRECTORY);
dir = fdopendir(dfd);
避免路径解析开销。
mount -o remount,noatime /data
fstab:
/dev/sdX /data ext4 noatime 0 2
dir_index(ext4)tune2fs -O dir_index /dev/sdX
e2fsck -f /dev/sdX
让大目录用 htree 索引。
mount -t tmpfs tmpfs /fast
当文件 > 100 万,目录不是正确工具
如果你愿意,可以告诉我:
我可以给你针对性代码级优化示例。