在 CentOS(以及大多数 Linux 发行版)上,readdir(更准确说是 getdents / getdents64 系统调用,glibc 的 readdir() 只是其封装)慢,通常不是“函数本身慢”,而是目录本身或使用方式导致。下面按常见原因从高到低说明。
ls 卡住、find 慢、程序 readdir 很久才返回readdir 会顺序遍历目录项✅ 拆分目录
data/202601/01/xxx
data/202601/02/xxx
✅ 单目录控制在 1万以内 最佳
while ((entry = readdir(dir))) {
if (strcmp(entry->d_name, "xxx") == 0) break;
}
stat() / access()| 文件系统 | 大目录表现 |
|---|---|
| ext4 | 一般 |
| xfs | 较好 |
| nfs | 非常慢 |
| gluster / cephfs | 极慢 |
readdir 要 网络往返✅ 建议:
如果:
readdir 会受牵连。
iostat -x 1
df -i
readdir 边 create / unlink→ 导致缓存失效,反复读磁盘
在 CentOS 上:
可能对目录访问做额外检查
getenforce
systemctl status auditd
readdir() 是逐条返回getdents64 一次读一批如果你:
opendir / readdir / closedir
→ 开销叠加✅ 建议:
page cache 为空 → 读磁盘vmtouch -v /path/to/dir
ls -1 | wc -l
df -i
iostat -x 1
mount | grep dir
CentOS 上 readdir 慢,90% 是因为“目录太大”或“在慢文件系统(NFS)上”。
如果你愿意,可以告诉我:
我可以给你针对性优化方案或代码级建议。