我有一个进程现在多次停止响应并且似乎完全锁定。它不会响应任何 strace 尝试或使用 gdb 进行查看(gdb 只是挂在 wait4() 系统调用上)。该进程是可运行的,并且没有等待系统调用(/proc/X/syscall:)running
或处于不间断睡眠(/proc/X/status:)State: R (running)
。
这个过程到底处于什么状态?这可能是某种类型的内核错误吗?
该进程是redis,这种情况已经发生过几次了。看来唯一可以终止该进程的就是重新启动。操作系统是 Cent 7。
编辑:内核版本是3.10.0-123.13.2.el7.x86_64。尝试更新到 3.10.0-229.11.1.el7,看看是否有任何区别。
答案1
wait4 是一个系统调用,指示进程正在等待其子终止之一。这可能表明信号处理存在一些问题。
有点残酷,但你可以尝试杀人等级制度应用程序的:kill -15 -$YourRedisPID
.这-PID 之前的意思是“PID 及其子进程”。由于它似乎正在等待子进程终止,因此它可能会解锁它。
如果它不起作用,让我们更深入地检查:使用以下命令查找您的信号处理状态grep ^Sig /proc/$YourRedisPID/status
你会看到一些类似的东西:
SigQ: 8/62777
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000080
SigCgt: 0000000180004023
根据内核源代码“fs/proc/array.c”中的定义,“SigQ”是待处理信号的数量/待处理信号的限制。
如果信号数量太高,则可能表明您的“SIGKILL”根本没有被处理。我仍在检查“kernel/signal.c”文件以了解这些特殊信号的信号管理。
要直接了解输出,请尝试以下一行:
awk 'BEGIN{print "ibase=16;obase=2;"} /^Sig...:/{ print toupper($2)}' /proc/$YourRedisPID/status | BC_LINE_LENGTH=0 bc
这输出我:
0
0
10000000
110000000000000000100000000100011
让我们首先向我们发送这个输出。我会根据需要更新帖子。