如何将 NFSv4 callback 进程设置为 D 状态

118 天前
 PyTx

背景:一个奇怪的问题,本地 NFS Server 系统里面,NFSv4 callback 状态为 D,并且存在 mount nfs 的进程 D 状态,重启 nfs server 进程之后,其他 client 能正常 mount nfs ,但 nfs server 一直无法在本地挂载,只能重启服务器才能恢复正常

初步日志检查:重启前,nfs server 本地挂载会堵塞在 nfs4_try_mount 这一步;重启服务器之后,挂载日志能看到 nfs4_try_mount 之后就开始 get client cookie 以及之后的操作,并且挂载正常

目的:打算模拟将 NFSv4 callback 进程设置为 D 状态,然后重启 nfs server 进程,看是否能复现上面情况

已测试的无效操作,下面操作有单独操作,也有组合操作过:

  1. 停止 nfs server 进程,本地执行大批量 df/mount -t nfs xxxx 的命令
  2. 通过 stress-ng 将本地 cpu 、io 等负载打满,然后再批量 mount
  3. 手动 strace 、gdb 等命令指向 NFSv4 callback 进程,打算手动 sleep ,但提示无法找到对应进程(测试机,root 权限)

待解决:是否有其他方案能定位原因?

877 次点击
所在节点    Linux
2 条回复
alvinbone88
117 天前
关于 D 状态: https://stackoverflow.com/questions/223644/what-is-an-uninterruptible-process
strace 、 GDB 之类底层用的是 ptrace 信号,对于这种情况完全没用
要定位原因的话,应该自行编译 debug 版内核调试
https://www.kernel.org/doc/html/latest/dev-tools/gdb-kernel-debugging.html
LGA1150
117 天前
显示 D 状态进程的调用栈:
echo w > /proc/sysrq-trigger

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1008919

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX