<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>D状态 on Zero Day Notes</title>
        <link>https://blog.5772447.xyz/tags/d%E7%8A%B6%E6%80%81/</link>
        <description>Recent content in D状态 on Zero Day Notes</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh</language>
        <lastBuildDate>Fri, 10 Jul 2026 07:00:00 +0000</lastBuildDate><atom:link href="https://blog.5772447.xyz/tags/d%E7%8A%B6%E6%80%81/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>一次NFS存储服务端故障导致客户端进程陷入D状态业务整体假死的排查记录</title>
            <link>https://blog.5772447.xyz/posts/5961e223/</link>
            <pubDate>Fri, 10 Jul 2026 07:00:00 +0000</pubDate>
            <guid>https://blog.5772447.xyz/posts/5961e223/</guid>
            <description>&lt;h2 id=&#34;一问题背景&#34;&gt;&lt;a href=&#34;#%e4%b8%80%e9%97%ae%e9%a2%98%e8%83%8c%e6%99%af&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;一、问题背景&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;公司一套 OA 系统的附件服务，把用户上传的合同、扫描件等文件统一写到一台 NAS 上，客户端以 NFS 方式把 NAS 的 export 挂载到应用服务器的 &lt;code&gt;/data/attachment&lt;/code&gt; 目录。这套架构运行了两年多，平时应用线程只要 &lt;code&gt;write()&lt;/code&gt; 一下就能落盘，开发同学几乎忘了&amp;quot;本地磁盘&amp;quot;和&amp;quot;网络存储&amp;quot;的区别。&lt;/p&gt;&#xA;&lt;p&gt;变故发生在一次周二的上午。运维群里突然弹出一连串告警：附件服务 HTTP 接口 P99 耗时从平时的 200ms 涨到 30s 以上，超时率飙到 40%，连带依赖附件的审批流接口也开始大面积 5xx。但诡异的是，监控大盘上这台应用服务器的 &lt;strong&gt;CPU 利用率只有 15% 左右，内存也富余&lt;/strong&gt;，唯一异常的是 &lt;code&gt;load average&lt;/code&gt;——从平时的 4 左右一路爬到了 300 多。第一反应是&amp;quot;是不是被打了&amp;quot;，但 iptables 连接数、入口流量都正常，事情没那么简单。&lt;/p&gt;&#xA;&lt;h2 id=&#34;二故障现象&#34;&gt;&lt;a href=&#34;#%e4%ba%8c%e6%95%85%e9%9a%9c%e7%8e%b0%e8%b1%a1&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;二、故障现象&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;把现场能串起来的现象摊开看，至少有四条明显对不上&amp;quot;常规高负载&amp;quot;：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;接口超时但资源空闲&lt;/strong&gt;：应用 HTTP 层大量 &lt;code&gt;Read timed out&lt;/code&gt; / &lt;code&gt;AsyncRequestTimeoutException&lt;/code&gt;，然而 &lt;code&gt;top&lt;/code&gt; 里 CPU 大多数时间在 &lt;code&gt;id&lt;/code&gt;（空闲），&lt;code&gt;us&lt;/code&gt;/&lt;code&gt;sy&lt;/code&gt; 都不高——说明不是计算密集，而是线程&amp;quot;卡住&amp;quot;了。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;load average 离谱地高&lt;/strong&gt;：1 分钟负载一度冲到 380，但进程数并没有暴增。load 高通常意味着&amp;quot;运行队列 + 不可中断睡眠&amp;quot;的进程多，而这里明显是后者。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;部分命令直接卡死&lt;/strong&gt;：运维上机后想用 &lt;code&gt;df -h&lt;/code&gt; 看磁盘，&lt;code&gt;df&lt;/code&gt; 命令输出了本地盘后就&lt;strong&gt;卡住不动&lt;/strong&gt;，过了好几分钟才勉强结束；&lt;code&gt;ls /data/attachment&lt;/code&gt; 同样无响应。说明某个挂载点把进程&amp;quot;吸&amp;quot;住了。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;&lt;code&gt;kill -9&lt;/code&gt; 杀不掉&lt;/strong&gt;：把几个明显不干活的应用 worker &lt;code&gt;kill -9&lt;/code&gt; 之后，进程&lt;strong&gt;依然存在&lt;/strong&gt;，状态栏显示一个 &lt;code&gt;D&lt;/code&gt;。这是整件事最关键的反常信号——连 SIGKILL 都杀不掉的进程，只可能处于不可中断睡眠。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;三排查过程&#34;&gt;&lt;a href=&#34;#%e4%b8%89%e6%8e%92%e6%9f%a5%e8%bf%87%e7%a8%8b&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;三、排查过程&#xD;&#xA;&lt;/h2&gt;&lt;h3 id=&#34;1-先确认是不是进程卡死而非忙死&#34;&gt;&lt;a href=&#34;#1-%e5%85%88%e7%a1%ae%e8%ae%a4%e6%98%af%e4%b8%8d%e6%98%af%e8%bf%9b%e7%a8%8b%e5%8d%a1%e6%ad%bb%e8%80%8c%e9%9d%9e%e5%bf%99%e6%ad%bb&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;1. 先确认是不是进程&amp;quot;卡死&amp;quot;而非&amp;quot;忙死&amp;quot;&#xD;&#xA;&lt;/h3&gt;&lt;p&gt;用 &lt;code&gt;top&lt;/code&gt; 按状态过滤，立刻看到一大片状态为 &lt;code&gt;D&lt;/code&gt;（即 &lt;code&gt;D = uninterruptible sleep&lt;/code&gt;，不可中断睡眠）的进程，而且这些进程的 &lt;code&gt;COMMAND&lt;/code&gt; 几乎都是 Java 应用的工作线程、日志滚动脚本，以及刚才那个卡住的 &lt;code&gt;df&lt;/code&gt;：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;top -b -n1 | awk &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;$8==&amp;#34;D&amp;#34;{print}&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ps -eo pid,ppid,stat,wchan:32,cmd | awk &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;$3==&amp;#34;D&amp;#34;&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;关键看 &lt;code&gt;WCHAN&lt;/code&gt; 列（进程当前睡眠在内核的哪个函数上），这些 D 状态进程清一色停在 &lt;code&gt;nfs&lt;/code&gt;、&lt;code&gt;rpc_wait_bit_killable&lt;/code&gt; 或 &lt;code&gt;fuse&lt;/code&gt; 相关的等待点上——&lt;strong&gt;全部和 NFS 客户端等待服务端回包有关&lt;/strong&gt;。再补一刀确认：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat /proc/&amp;lt;pid&amp;gt;/wchan      &lt;span style=&#34;color:#75715e&#34;&gt;# 输出类似于 nfs_wait_bit_killable&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat /proc/&amp;lt;pid&amp;gt;/stack      &lt;span style=&#34;color:#75715e&#34;&gt;# 内核栈能看到 nfs 调用链&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;h3 id=&#34;2-锁定吸住的挂载点&#34;&gt;&lt;a href=&#34;#2-%e9%94%81%e5%ae%9a%e5%90%b8%e4%bd%8f%e7%9a%84%e6%8c%82%e8%bd%bd%e7%82%b9&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;2. 锁定&amp;quot;吸住&amp;quot;的挂载点&#xD;&#xA;&lt;/h3&gt;&lt;p&gt;既然 &lt;code&gt;df -h&lt;/code&gt; 会卡在挂载点，用 &lt;code&gt;mount&lt;/code&gt; 列出 NFS 挂载，并单独测试它：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mount | grep nfs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 10.20.30.40:/volume1/oa_attach on /data/attachment type nfs ...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;df -h /data/attachment     &lt;span style=&#34;color:#75715e&#34;&gt;# 直接卡住&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;再开一个终端用 &lt;code&gt;strace&lt;/code&gt; 跟踪一个卡住的进程系统调用，看到它停在：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;stat(&amp;#34;/data/attachment&amp;#34;,  &amp;lt;detached ...&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;符号非常明确：进程在 &lt;code&gt;stat()&lt;/code&gt; 这个 NFS 挂载点时，永远等不到服务端回复，于是挂在内核的 NFS 等待逻辑里。&lt;/p&gt;&#xA;&lt;h3 id=&#34;3-把怀疑下沉到-nfs-服务端&#34;&gt;&lt;a href=&#34;#3-%e6%8a%8a%e6%80%80%e7%96%91%e4%b8%8b%e6%b2%89%e5%88%b0-nfs-%e6%9c%8d%e5%8a%a1%e7%ab%af&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;3. 把怀疑下沉到 NFS 服务端&#xD;&#xA;&lt;/h3&gt;&lt;p&gt;既然客户端在等服务端，那就看服务端（NAS，10.20.30.40）是否还&amp;quot;活&amp;quot;：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ping 10.20.30.40                 &lt;span style=&#34;color:#75715e&#34;&gt;# 能通，网络层没断&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rpcinfo -p 10.20.30.40           &lt;span style=&#34;color:#75715e&#34;&gt;# 卡住，无响应&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;showmount -e 10.20.30.40         &lt;span style=&#34;color:#75715e&#34;&gt;# 同样卡住&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;&lt;code&gt;rpcinfo&lt;/code&gt; 和 &lt;code&gt;showmount&lt;/code&gt; 都走 RPC（端口 111 / 20048），它们卡住说明 &lt;strong&gt;NFS 服务端的 rpcbind / mountd / nfsd 已经不响应了&lt;/strong&gt;。再在客户端抓包确认请求是不是&amp;quot;肉包子打狗&amp;quot;：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tcpdump -nn -i any host 10.20.30.40 and port &lt;span style=&#34;color:#ae81ff&#34;&gt;2049&lt;/span&gt; -c &lt;span style=&#34;color:#ae81ff&#34;&gt;50&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 客户端不断发 NFS READ/WRITE，但服务端没有任何 ACK 回包&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;最后翻客户端内核日志，印证判断：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dmesg -T | grep -i nfs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# [Tue Jul  7 10:12:03] nfs: server 10.20.30.40 not responding, still trying&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# [Tue Jul  7 10:12:31] nfs: server 10.20.30.40 not responding, still trying&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;日志里 &lt;code&gt;not responding, still trying&lt;/code&gt; 反复刷，是典型的 NFS 服务端无响应、客户端按 hard 语义死等的表现。&lt;/p&gt;&#xA;&lt;h3 id=&#34;4-服务端侧根因事后复盘&#34;&gt;&lt;a href=&#34;#4-%e6%9c%8d%e5%8a%a1%e7%ab%af%e4%be%a7%e6%a0%b9%e5%9b%a0%e4%ba%8b%e5%90%8e%e5%a4%8d%e7%9b%98&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;4. 服务端侧根因（事后复盘）&#xD;&#xA;&lt;/h3&gt;&lt;p&gt;登录 NAS 带外管理口查看，发现是&lt;strong&gt;一块磁盘出现介质错误，nfsd 工作线程在向后端文件系统刷写时被卡在底层 IO 上&lt;/strong&gt;，所有 nfsd 线程被这块坏盘拖死，对外不再响应任何新的 NFS 请求。也就是说：坏盘 → nfsd 线程阻塞 → NFS 服务端&amp;quot;假死&amp;quot; → 客户端 hard 挂载无限等待 → 进程 D 状态。&lt;/p&gt;&#xA;&lt;h2 id=&#34;四解决方案&#34;&gt;&lt;a href=&#34;#%e5%9b%9b%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;四、解决方案&#xD;&#xA;&lt;/h2&gt;&lt;h3 id=&#34;1-先止血把挂载点从客户端摘掉&#34;&gt;&lt;a href=&#34;#1-%e5%85%88%e6%ad%a2%e8%a1%80%e6%8a%8a%e6%8c%82%e8%bd%bd%e7%82%b9%e4%bb%8e%e5%ae%a2%e6%88%b7%e7%ab%af%e6%91%98%e6%8e%89&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;1. 先止血：把挂载点从客户端摘掉&#xD;&#xA;&lt;/h3&gt;&lt;p&gt;当务之急是让几十上百个 D 状态进程解除阻塞。按风险从低到高：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 优先用 lazy umount，断开挂载点与目录的关联，正在等待的进程会拿到错误返回而解除 D 状态&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;umount -l /data/attachment&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 若仍不奏效，再尝试强制卸载&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;umount -f /data/attachment&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;&lt;code&gt;umount -l&lt;/code&gt;（lazy）是关键招：它不要求当前没有进程使用该挂载点，而是立刻把挂载点从命名空间摘下，之后等待中的进程在下次 IO 时会收到 I/O error 而醒来（虽仍可能被应用层重试逻辑再次卡住，但至少解除了内核层的死等）。执行后 &lt;code&gt;top&lt;/code&gt; 里 D 状态进程数迅速归零，load average 从 380 一路回落到个位数，HTTP 接口超时率也在几分钟内降到正常。&lt;/p&gt;&#xA;&lt;h3 id=&#34;2-恢复业务&#34;&gt;&lt;a href=&#34;#2-%e6%81%a2%e5%a4%8d%e4%b8%9a%e5%8a%a1&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;2. 恢复业务&#xD;&#xA;&lt;/h3&gt;&lt;p&gt;临时把附件写入切到本地盘（&lt;code&gt;mount --bind&lt;/code&gt; 一个本地目录顶上，或改应用配置指向本地路径），让审批流先恢复；同时通知 NAS 管理员重启 &lt;code&gt;nfs-server&lt;/code&gt; 服务、隔离坏盘、修复 RAID。服务端 nfsd 恢复响应后，再重新挂载：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mount -t nfs 10.20.30.40:/volume1/oa_attach /data/attachment&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;h2 id=&#34;五根因分析&#34;&gt;&lt;a href=&#34;#%e4%ba%94%e6%a0%b9%e5%9b%a0%e5%88%86%e6%9e%90&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;五、根因分析&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;整条故障链的源头有两点，缺一不可：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;服务端侧&lt;/strong&gt;：NAS 单盘故障导致 nfsd 线程被后端 IO 阻塞，NFS 服务整体失去响应能力，且服务端本身没有对 nfsd 线程做隔离/超时保护。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;客户端侧（更关键的放大因素）&lt;/strong&gt;：Linux NFS 客户端&lt;strong&gt;默认是 hard 挂载&lt;/strong&gt;（&lt;code&gt;hard&lt;/code&gt; 而非 &lt;code&gt;soft&lt;/code&gt;）。hard 模式下，NFS 请求如果得不到服务端确认，客户端会&lt;strong&gt;无限重试、永不放弃&lt;/strong&gt;，对应进程进入 &lt;code&gt;TASK_UNINTERRUPTIBLE&lt;/code&gt;（D 状态）。一旦进入 D 状态，&lt;code&gt;SIGKILL&lt;/code&gt; 也无效——因为内核不允许进程在等待关键 IO 时被中途掐掉。结果就是：一个服务端故障，被 hard 语义放大成客户端成百上千个进程永久卡死、load 爆表、业务整体假死。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;换句话说，这不是&amp;quot;客户端扛不住&amp;quot;，而是&lt;strong&gt;客户端对存储故障缺乏兜底&lt;/strong&gt;：它把&amp;quot;网络存储临时不可用&amp;quot;当成了&amp;quot;必须无限等待&amp;quot;的硬约束。&lt;/p&gt;&#xA;&lt;h2 id=&#34;六预防措施&#34;&gt;&lt;a href=&#34;#%e5%85%ad%e9%a2%84%e9%98%b2%e6%8e%aa%e6%96%bd&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;六、预防措施&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;这次故障之后，我们从客户端、服务端、架构三层做了加固：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;客户端挂载加容错参数&lt;/strong&gt;：把默认 hard 改为 soft 并加超时与重试，避免无限等待：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# /etc/fstab 示例（注意 soft + timeo + retrans + retry）&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;10.20.30.40:/volume1/oa_attach  /data/attachment  nfs  soft,timeo&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;30,retrans&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;3,retry&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;2,_netdev  &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;  &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;&lt;code&gt;timeo=30&lt;/code&gt; 表示每次 RPC 超时 3 秒（单位是 0.1s），&lt;code&gt;retrans=3&lt;/code&gt; 重试 3 次后返回错误，&lt;code&gt;retry=2&lt;/code&gt; 限制挂载阶段重试。这样 NFS 不可用时进程会&lt;strong&gt;快速失败&lt;/strong&gt;而不是永久 D 住。&lt;code&gt;_netdev&lt;/code&gt; 保证网络就绪后再挂载、关机时先 umount。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;监控要能抓到 D 状态&lt;/strong&gt;：在 Node Exporter 之外补充采集 &lt;code&gt;D&lt;/code&gt; 状态进程数和 &lt;code&gt;load1&lt;/code&gt;，一旦 D 状态进程数 &amp;gt; 0 持续超过阈值就告警——这是 NFS 类故障最早的信号，比 HTTP 超时早得多。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;对挂载点做存活探测&lt;/strong&gt;：用 &lt;code&gt;timeout&lt;/code&gt; 包裹的 &lt;code&gt;stat&lt;/code&gt; 定时探 &lt;code&gt;/data/attachment&lt;/code&gt;，或部署监控脚本在探测超时时自动 &lt;code&gt;umount -l&lt;/code&gt; 兜底，避免人工响应不及时。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;服务端高可用&lt;/strong&gt;：NAS 侧对 nfsd 做进程级健康检查与自动重启；重要业务改用双机 + 共享存储（如 DRBD）或直接使用对象存储（S3/S3 兼容）替代 NFS 共享，从根本上消除&amp;quot;单存储挂掉拖垮应用&amp;quot;的强耦合。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;应用层解耦&lt;/strong&gt;：附件写入增加本地缓冲队列与异步刷盘，NFS 不可用时先落本地、恢复后再同步，避免业务线程直接同步阻塞在远程存储上。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;七总结&#34;&gt;&lt;a href=&#34;#%e4%b8%83%e6%80%bb%e7%bb%93&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;七、总结&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;这次故障最&amp;quot;反直觉&amp;quot;的地方在于：&lt;strong&gt;监控上 CPU、内存都正常，业务却整体假死&lt;/strong&gt;。根因不在算力，而在 NFS 客户端默认的 hard 挂载语义——它把&amp;quot;存储暂时不可用&amp;quot;翻译成了&amp;quot;进程永久等待&amp;quot;。排查的关键三步是：&lt;code&gt;top&lt;/code&gt; 抓 D 状态进程 → &lt;code&gt;wchan&lt;/code&gt;/&lt;code&gt;stack&lt;/code&gt; 确认卡在 NFS 等待 → &lt;code&gt;rpcinfo&lt;/code&gt;/&lt;code&gt;tcpdump&lt;/code&gt;/&lt;code&gt;dmesg&lt;/code&gt; 证明服务端无响应。止血用 &lt;code&gt;umount -l&lt;/code&gt; 立竿见影。&lt;/p&gt;&#xA;&lt;p&gt;记住一条运维铁律：&lt;strong&gt;凡是跨网络的文件系统挂载，默认 hard 都是隐患；要么加 soft + 超时重试，要么让应用在存储故障时能快速失败而不是永久等待。&lt;/strong&gt; 否则，一个远端的坏盘，就足以让你的整台应用服务器&amp;quot;活着但死了&amp;quot;。&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
