最近,通过 ssh 连接 CentOs8 虚拟机变得极其缓慢。我检查了 top 命令,其中显示了以下内容:
load average: 30.09, 30.13, 30.09
Tasks: 403 total, 1 running, 364 sleeping, 0 stopped, 38 zombie
%Cpu(s): 2.4 us, 1.1 sy, 0.0 ni, 94.9 id, 0.0 wa, 1.4 hi, 0.2 si, 0.0 st
MiB Mem : 15853.6 total, 5322.0 free, 8791.9 used, 1739.7 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 6052.8 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 245460 8192 4132 D 0.0 0.1 662:05.04 systemd
43 root 39 19 0 0 0 D 0.0 0.0 15:06.70 khugepaged
56 root 20 0 0 0 0 D 0.0 0.0 68:38.87 kswapd0
34809 root 20 0 0 0 0 D 0.0 0.0 0:00.09 sh
41031 101 20 0 34248 25884 4 D 0.0 0.2 0:00.62 nginx
41309 root 20 0 93260 6740 5904 D 0.0 0.0 0:00.03 systemd-user-ru
44308 root 20 0 57184 3760 3340 D 0.0 0.0 0:00.01 ps
...etc
其他一些命令一旦我使用它就会立即进入“D”状态,例如 ps、pgrep。因此,如果我输入“ps aux”,终端将变得无响应,然后从其他终端重新登录,我可以看到新的“ps”命令已添加到“D”进程中。
All of the ps,grep D state process's and and systemd's stack trace:
[<0>] __access_remote_vm+0x5a/0x2d0
[<0>] proc_pid_cmdline_read+0x1a6/0x350
[<0>] vfs_read+0x91/0x140
[<0>] ksys_read+0x4f/0xb0
[<0>] do_syscall_64+0x5b/0x1b0
[<0>] entry_SYSCALL_64_after_hwframe+0x65/0xca
[<0>] 0xffffffffffffffff
khugepaged:
[<0>] collapse_huge_page+0x11f/0xdf0
[<0>] khugepaged+0xb4f/0x1140
[<0>] kthread+0x112/0x130
[<0>] ret_from_fork+0x35/0x40
[<0>] 0xffffffffffffffff
kswapd0:
[<0>] rpc_wait_bit_killable+0x1e/0x90 [sunrpc]
[<0>] _nfs4_proc_delegreturn+0x22e/0x330 [nfsv4]
[<0>] nfs4_proc_delegreturn+0x7c/0x130 [nfsv4]
[<0>] nfs_do_return_delegation+0x33/0x50 [nfsv4]
[<0>] nfs4_evict_inode+0x25/0x70 [nfsv4]
[<0>] evict+0xd2/0x1a0
[<0>] dispose_list+0x48/0x60
[<0>] prune_icache_sb+0x52/0x70
[<0>] super_cache_scan+0x123/0x1a0
[<0>] do_shrink_slab+0x118/0x270
[<0>] shrink_slab+0x187/0x2e0
[<0>] shrink_node+0xe4/0x440
[<0>] balance_pgdat+0x1e2/0x340
[<0>] kswapd+0x21a/0x400
[<0>] kthread+0x112/0x130
[<0>] ret_from_fork+0x35/0x40
[<0>] 0xffffffffffffffff
[<0>] prealloc_shrinker+0x6d/0x110
systemd-user-ru:
[<0>] sget_userns+0x2c0/0x4b0
[<0>] mount_nodev+0x2a/0xa0
[<0>] mount_fs+0x3b/0x167
[<0>] vfs_kern_mount.part.35+0x54/0x120
[<0>] do_mount+0x1fc/0xc80
[<0>] ksys_mount+0xb6/0xd0
[<0>] __x64_sys_mount+0x21/0x30
[<0>] do_syscall_64+0x5b/0x1b0
[<0>] entry_SYSCALL_64_after_hwframe+0x65/0xca
[<0>] 0xffffffffffffffff
我还应该寻找什么?他们是从这里恢复过来的一种方法吗?
答案1
一般来说,唯一可能的恢复是重新启动 - 最好通过 SysRq,这样您就有机会刷新文件系统并卸载那些未卡住的文件系统。做不是 sudo reboot
,因为当系统等待最后一个进程完成时它可能会挂起(它永远不会这样做)。
但有时还是可以逐渐退出这种状态的。就你而言,我将从 systemd 本身开始。如果无法恢复,重新启动是唯一的选择。所以尝试:
$ sudo systemctl daemon-reexec
这将分叉一个新的 systemd 副本,将当前状态交给它,并终止当前的 systemd 副本——希望能够解决它的所有问题。此命令可能会失败,要么像ps
以前那样变得不可中断,要么只是无法连接到现有的 systemd 实例。
如果你恢复了 systemd,你可以在其他守护进程上尝试类似的技巧:尝试重新启动它们。一些即使在“不间断”状态下也可能被杀死, 尝试kill -9
。
堆栈跟踪特别提到了文件系统和 NFS。 NFS 因此类问题而臭名昭著,因此请考虑不要将其用于根分区等重要事务。