在 CentOS(以及其他 Linux 发行版)上,readdir(更准确说是 opendir + readdir/getdents 系统调用)慢,通常不是 readdir 函数本身慢,而是目录规模、文件系统、内核/glibc 实现、以及使用方式共同导致的。下面按常见原因逐一说明。
ls 卡、find 慢、程序 readdir 慢readdir 是顺序遍历整个目录项readdir 还可能触发 page cache missls -f(不排序)find 代替 lsdir_index(Htree)检查:
tune2fs -l /dev/sdX | grep "Filesystem features"
应有:
dir_index
readdir 很慢检查:
free -h
vmstat 1
优化:
echo 3 > /proc/sys/vm/drop_cachesreaddir 不是一次系统调用读一个文件getdents64但:
while ((ent = readdir(dir))) {
// 只 readdir,不 stat
}
如果这样很快,但加 stat 就慢,说明是 metadata IO 问题。
readdir 在 NFS 目录特别慢actimeo 小,缓存短优化:
mount -o actimeo=60,nodiratime
检查:
getenforce
ps aux | grep audit
while ((e = readdir(dir))) {
stat(e->d_name, &st); // 非常慢
}
readdir + d_type(如果支持)if (e->d_type == DT_REG) { ... }
| 版本 | 说明 |
|---|---|
| CentOS 6 | 老内核,文件系统性能差 |
| CentOS 7 | 3.10 内核,还行 |
| CentOS 8 | 4.18,较好 |
| Stream 9 | 5.x,最好 |
# 目录大小
ls -1 | wc -l
# 是否 NFS
mount | grep <dir>
# 文件系统
df -T
# IO 情况
iostat -x 1
# 是否缓存问题
time ls -f > /dev/null
time ls -f > /dev/null
CentOS 上
readdir慢,90% 是因为“目录太大 + 元数据 IO + 使用方式不对”,而不是 readdir 本身。
如果你愿意,可以告诉我:
stat我可以给你更具体的优化方案或代码示例。