在 CentOS(以及大多数 Linux 发行版)上,readdir()(或 opendir() + readdir())出现卡顿/慢,通常不是函数本身的问题,而是目录内容、文件系统、IO 或系统状态导致的。下面按常见原因逐一说明。
ls 也卡readdir() 第一次特别慢readdir() 需要顺序遍历目录项ls -1 | wc -l
getdents64() 批量读取(比 readdir 快)mount | grep 目录
readdirreaddir() 间歇性卡iowait 高top
iostat -x 1
readdir 慢vfs_cache_pressure 过大cat /proc/sys/vm/vfs_cache_pressure
free -m
sysctl -w vm.vfs_cache_pressure=50
getenforce
ps aux | grep audit
readdir() 需要网络往返while ((entry = readdir(dir)) != NULL) {
stat(entry->d_name, &st); // 每个文件都 stat
}
statscandir()(一次性)getdents64()# 1. 文件数量
ls -1 目录 | wc -l
# 2. 文件系统
df -T 目录
# 3. IO
iostat -x 1
# 4. 内核缓存
free -m
cat /proc/sys/vm/vfs_cache_pressure
# 5. 是否在 NFS
mount | grep 目录
CentOS 上
readdir卡顿,90% 是因为“目录太大 + 磁盘/网络 IO + 缓存不足”,不是readdir本身的问题。
如果你愿意,可以告诉我:
我可以给你更具体的优化方案。