【现象】
CentOS 7.2 kernel 3.10
系统内执行df 命令,查看文件系统挂载,然后卡着没反应,也不能中断。
系统报kernel:INFO:task df:107547 blocked for more than 120 seconds.
【原因分析】
df 命令无法执行完成,此命令查看文件系统的挂载情况。
执行mount,显示出系统内所有挂载项:
单独执行 mount /boot , mount /home , 均可正常挂载系统目录。
sar -u
sar -r
sar -d 历史性能都是正常的
Strace df 追查df命令执行细节。
Systemd -l on /proc/sys/fs/binfmt_misc 发现执行到此挂载条目无法继续。造成120秒进程超时 blocked。
查细此文件系统含义:
这个内核功能允许您通过在shell中输入其名称来调用几乎所有程序。这包括例如编译的Java(TM),Python或Emacs程序。
要实现这一点,您必须告诉binfmt_misc必须使用哪个二进制文件调用哪个解释器。Binfmt_misc通过将文件开头的某些字节与您提供的魔术字节序列(屏蔽掉指定的位)进行匹配来识别二进制类型。Binfmt_misc还可以识别文件名扩展名aka .com或.exe。
扩展解释
https://www.kernel.org/doc/html/latest/admin-guide/binfmt-misc.html
【分析结论】
df 卡住问题在本质上还是由于 systemd 和 kernel 之间存在竞争而引起的, 导致其它程序访问挂载点的时候出现 hang 住的现象,
- systemctl restart proc-sys-fs-binfmt_misc.automount;
- 升级到最新 systemd-219-57 版本;
- 按照红帽知识库的步骤对 proc-sys-fs-binfmt_misc.automount 进行 mask 操作, 只进行静态的 mount 操作
https://access.redhat.com/solutions/3346491#
执行第1条,进行资源释放后,df 命令恢复正常。