Eu tenho um processo que várias vezes agora parou de responder e parece estar completamente bloqueado. Ele não responde a nenhuma tentativa de rastrear ou espiar com o gdb (o gdb fica travado em um syscall wait4 ()). O processo é executável e não está aguardando um syscall (/ proc / X / syscall:) running
ou em suspensão ininterrupta (/ proc / X / status State: R (running)
:).
Em que estado esse processo está exatamente? Isso é possivelmente um bug do kernel de algum tipo?
O processo é redis, e isso já aconteceu algumas vezes agora. Parece que a única coisa que pode matar o processo é uma reinicialização. O SO é o Cent 7.
Editar: a versão do kernel é 3.10.0-123.13.2.el7.x86_64. Tentando atualizar para 3.10.0-229.11.1.el7 para ver se isso faz alguma diferença.
fonte
dmesg
saída?/proc/<pid>/stack
(e/proc/<pid>/task/*/stack
)? Esse processo tem vários threads?Respostas:
wait4 é um syscall indicando que o processo está aguardando a rescisão de um de seus filhos. Isso pode indicar algum problema com o tratamento do sinal.
Um pouco brutal, mas você pode tentar matar a hierarquia do app:
kill -15 -$YourRedisPID
. O - antes do PID significa "o PID e seus filhos". Como parece estar aguardando o término de um filho, ele pode desbloqueá-lo.Se não estiver funcionando, vamos verificar mais a fundo: encontre o status do processo de sinal com
grep ^Sig /proc/$YourRedisPID/status
Você verá coisas como:
Conforme definido em "fs / proc / array.c" da fonte do kernel, o "SigQ" é o número de sinais pendentes / o limite de sinais pendentes.
Se o número do sinal for muito alto, isso pode indicar que o seu "SIGKILL" não está sendo tratado. Ainda estou checando o arquivo "kernel / signal.c" para entender o gerenciamento de sinais desses sinais especiais.
Para uma compreensão direta da saída, tente este one-liner:
awk 'BEGIN{print "ibase=16;obase=2;"} /^Sig...:/{ print toupper($2)}' /proc/$YourRedisPID/status | BC_LINE_LENGTH=0 bc
Isso me mostra:
Vamos começar enviando essa saída. Atualizarei a postagem conforme necessário.
fonte