O processo que bloqueia, ignora o SIGKILL, é executável (não é um zumbi ou está ininterrupto). Em que estado está?

17

Eu tenho um processo que várias vezes parou de responder e parece estar bloqueando completamente. Ele não responde a nenhuma tentativa de strace ou espreitar com o gdb (o gdb simplesmente fica em um wait4 () syscall). O processo é executável e não está aguardando em um syscall (/ proc / X / syscall: running ) ou em suspensão ininterrupta (/ proc / X / status: State: R (running) ).

Qual estado é esse processo exatamente? Isso é possivelmente um bug do kernel de algum tipo?

O processo é redis, e isso aconteceu algumas vezes agora. A única coisa que pode matar o processo é um reboot, parece. OS é o Cent 7.

Editar: A versão do kernel é 3.10.0-123.13.2.el7.x86_64. Tentando uma atualização para 3.10.0-229.11.1.el7 para ver se isso faz alguma diferença.

    
por alienth 04.08.2015 / 02:29

1 resposta

2

wait4 é um syscall indicando que o processo está aguardando uma finalização de seu filho. Isso pode apontar algum problema com o manuseio do sinal.

Um pouco brutal, mas você pode tentar matar a hierarquia do aplicativo: kill -15 -$YourRedisPID . O - antes do PID significa "o PID e seus filhos". Como parece estar à espera de um fim de criança, pode desbloqueá-lo.

Se não estiver funcionando, vamos conferir mais profundamente: encontre o status do seu processo de sinal com grep ^Sig /proc/$YourRedisPID/status

Você verá algumas coisas como:

SigQ:   8/62777
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000080
SigCgt: 0000000180004023

Como 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 de sinal for muito alto, isso pode indicar que seu "SIGKILL" não é tratado. Ainda estou verificando o arquivo "kernel / signal.c" para entender o gerenciamento de sinal 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:

0
0
10000000
110000000000000000100000000100011

Vamos começar enviando esta saída. Eu atualizarei a postagem conforme necessário.

    
por 13.08.2015 / 17:47