在 Debian(以及其它 Linux 发行版)上,readdir 读取“慢”通常是综合因素导致的,而不是 readdir 本身函数慢。下面按常见原因从最可能到较少见说明:
readdir 本身是逐条返回目录项,但如果:
就会非常慢,因为:
getdents 系统调用✅ 验证:
ls -1 | wc -l
✅ 解决:
a/, b/, c/)不同文件系统对大目录支持差异很大:
| 文件系统 | 大目录性能 |
|---|---|
| ext4 | 一般(大目录会变慢) |
| xfs | 较好 |
| btrfs | 视情况 |
| tmpfs | 很快 |
| NFS | 非常慢 |
✅ 查看:
df -T
✅ NFS 特别慢:
readdir 要网络往返stat 更慢很多人这样写:
while ((ent = readdir(dir))) {
stat(ent->d_name, &st);
}
问题:
readdir 不返回文件类型(某些 FS)stat → 大量磁盘 IO✅ 优化:
readdir + d_type // 如果支持
或:
getdents64 + statx
如果:
readdir 会触发大量磁盘读取。
✅ 查看缓存:
free -h
cat /proc/sys/vm/vfs_cache_pressure
在 Debian 上:
auditd 开启会导致:
✅ 检查:
systemctl status auditd
例如:
noatime 未开启
sync
dirsync
会显著增加目录读取成本。
✅ 建议挂载选项:
noatime,nodiratime
os.listdir()Files.listscandir这些可能:
比原生 getdents64 慢很多。
如果目的是:
accessfindtime ls -1 dir | wc -l
strace -e trace=file your_program
如果你愿意,可以告诉我:
我可以给你针对性优化方案或代码示例。