在 CentOS(及其他 Linux 发行版) 里,readdir() / readdir_r() 本身是 POSIX 标准函数,其底层依赖内核的 getdents() / getdents64() 系统调用。是否“阻塞”取决于 文件系统的实现和当前状态,而不是 CentOS 本身。
下面按常见情况说明 readdir 什么时候会阻塞。
此时 readdir 只是从内核缓存里取数据,非常快,不阻塞。
readdir✅ 会阻塞,可能持续几百 ms 到数秒
CentOS 7/8 上大目录 readdir 慢是常见问题
这是 最常见的阻塞来源
readdir 需要向 NFS Server 发请求readdirplus → 更慢✅ readdir 可能阻塞数秒甚至更久
以下情况会导致 readdir 阻塞:
rename()unlink()mkdir()✅ 短时间在 inode->i_rwsem 上等待
例如:
此时:
readdir 可能永久阻塞ps 会看到 D 状态(不可中断睡眠)ps -eo pid,stat,comm | grep D
readdir 实际是调用用户程序✅ 用户态逻辑慢 → readdir 阻塞
opendir() 已打开readdir 循环遍历(非一次性)cat /proc/<pid>/stack
若看到:
getdents
iterate_dir
说明卡在 readdir
strace -p <pid>
看到:
getdents64(...) = 0
且长时间不返回 → 阻塞
lookupcache=positivereaddirgetdents64 + 批量读取如果你愿意,可以告诉我:
我可以给你 更具体的分析和解决方案。