温馨提示×

centos readdir何时会阻塞

小樊
49
2026-10-09 01:32:02
栏目: 智能运维

在 CentOS(以及一般 Linux 系统)上,readdir()(以及相关的 readdir_r()、getdents() 等)是否阻塞,主要取决于底层文件系统类型和当时的 I/O 状态。下面分情况说明。


一、正常情况下:readdir 通常不阻塞

对于本地普通文件系统(如 ext4、xfs):

  • opendir() 打开目录
  • readdir() 从内核缓存或磁盘读取目录项
  • 大部分情况下是非阻塞或极短暂的

只要目录内容已经在页缓存中,readdir 几乎立刻返回。


二、readdir 会“阻塞”的常见场景

1️⃣ 目录元数据不在内存(首次访问)

第一次读取一个大目录或刚启动的系统:

  • 目录的 inode / block 不在 page cache
  • 需要真正读磁盘
  • 此时 readdir 会阻塞,直到磁盘 I/O 完成

✅ 这是最常见的“阻塞”原因
✅ 跟 CentOS 版本无关,是 Linux VFS 行为


2️⃣ 网络文件系统(NFS / CIFS / GlusterFS)

NFS-mounted 目录
  • readdir 实际是 RPC 调用
  • 如果:
    • 网络延迟高
    • NFS server 无响应
    • 发生 timeout / retransmit

➡️ readdir 会长时间阻塞

常见表现:

  • ls 卡住
  • find 挂起
  • 进程处于 D 状态(不可中断睡眠)

3️⃣ 目录非常大(几万~几百万文件)

  • 目录项需要多次 getdents
  • 每次都可能触发磁盘 I/O
  • 在 HDD 上尤其明显

表现:

  • readdir 返回慢
  • 看起来像“阻塞”

4️⃣ 文件系统异常 / 磁盘故障

  • 坏块
  • RAID 降级
  • 存储设备无响应

➡️ readdir 可能永久阻塞(进程进入 D 状态)


5️⃣ FUSE / 自定义文件系统

如果是:

  • FUSE
  • 容器 overlay
  • 自研文件系统

readdir 是否阻塞完全取决于实现


三、如何判断 readdir 是否阻塞

查看进程状态

ps -eo pid,stat,comm | grep your_proc
  • S:可中断睡眠(正常)
  • D:不可中断睡眠(通常卡在 I/O)

查看调用栈

cat /proc/<pid>/stack

strace 观察

strace -p <pid>

常见阻塞点:

getdents64(...)

四、CentOS 上的特殊情况(小提示)

  • CentOS 6/7/8 都使用 glibc + Linux VFS
  • readdir 本质是 getdents64 系统调用
  • CentOS 本身不会额外引入阻塞逻辑

五、总结一句话

CentOS 上 readdir 在“目录数据需要从磁盘或网络获取时”才会阻塞,本地缓存命中时不会。

如果你有具体场景(比如 NFS、ls 卡死、Docker 卷、某目录特别慢),可以贴出来,我可以帮你精确定位原因。

0 踩