在 Ubuntu(Linux)上 readdir() 慢,通常不是 readdir() 本身慢,而是目录结构、文件系统、缓存状态或调用方式导致的。下面按常见原因从高到低说明,并给出排查和优化建议。
readdir() 本身是 O(1) 一次调用,但要遍历完整个目录就是 O(N)。
✅ 检查:
ls -1 | wc -l
✅ 解决:
Linux 有 page cache / dentry cache:
readdir:要从磁盘读 inode✅ 测试:
time ls dir
time ls dir # 第二次通常快很多
✅ 解决:
vmtouch 预热目录readdir() 而不是 getdents()readdir() 是 libc 封装getdents64() 批量读取,更快✅ 建议:
getdents64()os.scandir()(比 os.listdir() 快)| 文件系统 | readdir 性能 |
|---|---|
| ext4 | 中等 |
| xfs | 好 |
| btrfs | 目录大时慢 |
| NFS | 非常慢 |
| overlayfs | 慢(Docker) |
✅ 检查:
df -T
✅ Docker 特别慢原因:
readdir 在 NFS 上是灾难级慢:
✅ 解决:
--readdirplusLinux 对“目录里的目录”处理更慢:
✅ 解决:
find -maxdepth 1while ((ent = readdir(dir))) {
stat(ent->d_name, &st); // 每个文件都 stat
}
while ((ent = readdir(dir))) {
// 只用 d_type
}
或:
getdents64(fd, buf, sizeof(buf));
# 目录文件数
ls -1 | wc -l
# 是否 NFS
df -T
# 缓存命中
free -h
cat /proc/sys/vm/vfs_cache_pressure
# 实际系统调用耗时
strace -T ls dir
Ubuntu 上
readdir慢,90% 是因为“目录太大 + 未缓存 + 文件系统不合适”。
如果你愿意,可以告诉我:
我可以直接给你针对性优化方案。