在 Debian(以及一般的 Linux)系统上,readdir() 或 readdir_r() 出现“卡顿 / 慢 / 阻塞”,通常不是 readdir 本身的问题,而是目录内容、文件系统、或底层 I/O导致的。下面按常见原因逐一说明,并给出排查方法。
readdir() 本身只是从内核缓存或目录项中取一条记录,但如果:
就会非常慢,表现为卡顿。
✅ 验证:
ls -1 | wc -l
✅ 解决:
a/, b/...)getdents64() + 自定义缓存以下文件系统极易卡顿:
✅ 验证:
df -T 目录
mount | grep 目录
✅ 解决:
actimeo、noatime 等挂载参数很多人这样写:
while ((entry = readdir(dir))) {
stat(entry->d_name, &st); // ❌ 这里慢
}
真正的瓶颈是 stat(),不是 readdir()
✅ 验证:
strace 看到大量 stat()✅ 解决:
d_type(如果支持)entry->d_type == DT_REG
openat() + fstatat(AT_SYMLINK_NOFOLLOW)第一次访问目录时:
表现为:
✅ 验证:
free -h
vmstat 1
iostat -x 1
✅ 解决:
vfs_cache_pressure 调低sysctl vm.vfs_cache_pressure=50
✅ 验证:
dmesg | grep error
journalctl -p err
smartctl -a /dev/sdX
Debian 使用 glibc:
readdir() 内部缓冲(通常 32KB)readdir vs getdents64# 1. 文件数量
ls -1 | wc -l
# 2. 文件系统类型
df -T .
# 3. 系统调用耗时
strace -T -e trace=readdir,getdents,stat ls 目录
# 4. 磁盘状态
iostat -x 1
dmesg | tail
✅ 更好性能:
int fd = open(dir, O_RDONLY | O_DIRECTORY);
struct dirent *ent;
while ((ent = readdir(dirp))) {
if (ent->d_type == DT_REG) {
// 不 stat
}
}
或直接使用:
getdents64()
你可以告诉我:
我可以直接帮你定位到具体原因。