2015 年 2 月 3 日,freeshell 出现持续两个小时的 NFS 卡死问题。事实上,2014 年 8 月启用外部磁盘以来,就常常出现持续几十秒甚至几分钟的 NFS 卡死,卡死期间外部磁盘上的 freeshell 没法执行任何操做,有的 freeshell 还会由于磁盘操做超时而关机。以前一直觉得是 NFS bug 致使了死锁,没有定位到故障缘由,也没能重现。shell
2 月 3 日,经过 tcpdump 抓包和 strace nfsiod 进程的方法,查明 NFS server not responding 的问题是因为外部硬盘(一块希捷的 2T 绿盘)过于繁忙。服务器
在 NFS 卡死的时段,外部磁盘读的平均延迟可达 600ms,写的平均延迟是 1400ms。当初设置 NFS 挂载参数的时候,我没有考虑到磁盘繁忙的问题,只是想到了网络延迟不该当超过 1 秒,因而就设置了超时 timeo=10,表示 1 秒超时。一个 NFS 请求可能须要分解为多个磁盘读请求,这些请求的时间之和极可能超过 1 秒,也就是大部分读写请求还没来得及发给磁盘就超时了,造成了 NFS 服务器失去响应的假象。网络
下面是 早先的挂载参数:
vers=3,rw,rsize=32768,wsize=32768,tcp,timeo=10,retrans=5,soft,intr,sec=sys,lookupcache=all,ac,nocto
tcp
现将超时修改为 30 秒(timeo=300)。
vers=3,rw,rsize=32768,wsize=32768,tcp,timeo=300,retrans=5,soft,intr,sec=sys,lookupcache=all,ac,nocto
code
2 月 3 日已经修改 fstab,但因为挂载着的 NFS 不能修改挂载参数(见 man nfs),须要关闭全部外部磁盘上的虚拟机才能从新挂载 NFS。2 月 4 日恰好 1 号节点挂了,因而把全部其余节点也重启了一遍,NFS 参数就更新了。server