El proceso que se bloquea, ignora SIGKILL, es ejecutable (no es un zombie o está en modo ininterrumpido). ¿En qué estado es en?

17

Tengo un proceso que varias veces ha dejado de responder y parece estar de cierre por completo. No responde a cualquier intento de strace o se asoma con gdb (BGF sólo cuelga de una llamada al sistema wait4 ()). El proceso es ejecutable, y no está esperando en una syscall (/ proc / X / syscall: running) o en el sueño ininterrumpible (/ proc / X / estado: State: R (running)).

¿En qué estado se encuentra este proceso exactamente? ¿Es esto posiblemente un error del kernel de algún tipo?

El proceso es redis, y esto ha sucedido algunas veces ahora. Parece que lo único que puede matar el proceso es un reinicio. El sistema operativo es Cent 7.

Editar: la versión del kernel es 3.10.0-123.13.2.el7.x86_64. Intentando actualizar a 3.10.0-229.11.1.el7 para ver si eso hace alguna diferencia.

alienth
fuente
¿Qué versión de GDB está usando? Según stackoverflow.com/questions/8978777/…, una versión más nueva podría funcionar mejor.
Greg Bray
Actualmente parece que la investigación es más cara del núcleo debido a la forma especial que se cuelga, pero si no te importa, ¿podría añadir algunas informaciones específicas Redis? Qué hace el proceso mientras bloquea y cosas así. Tengo una información de unos pocos de Nick Craver a través de Twitter, al parecer Redis está cargando un gran conjunto de datos cuando esto sucede, es el conjunto de datos cargado simplemente reiniciar el proceso o de alguna otra manera (por ejemplo a través de depuración recarga, o la canalización de grandes cantidades de datos )? Gracias.
@antirez El conjunto de datos está siendo cargado por una copia rdb de otro ejemplo redis. Los bloqueos se producen después de Redis arranca y se lee en el RDB gigante. Cabe destacar que no siempre se bloquean durante esto, solo a veces.
Alienth
1
Solo tuve este tipo de problemas cuando tuve errores de E / S. ¿Podrías contarnos sobre la dmesgsalida?
Ho1
3
¿Qué contiene /proc/<pid>/stack(y /proc/<pid>/task/*/stack)? ¿Ese proceso tiene varios hilos?
Stéphane Chazelas

Respuestas:

2

wait4 es una llamada al sistema indicando que el proceso está esperando por uno de su cese niño. Esto puede indicar algún problema con el manejo de la señal.

Un poco brutal, pero puede tratar de matar a la jerarquía de la aplicación: kill -15 -$YourRedisPID. El - antes del PID significa "el PID y sus hijos". Por lo que parece estar esperando a una terminación niño, puede desbloquearlo.

Si no funciona, revisemos más a fondo: encuentre el estado de su proceso de señal con grep ^Sig /proc/$YourRedisPID/status

Verás algunas cosas como:

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

Como se define en "fs / proc / array.c" de la fuente del núcleo, el "SigQ" es el número de señales pendientes / el límite de señales pendientes.

Si el número de señal es demasiado alto, puede indicar que su "SIGKILL" no se maneja en absoluto. Todavía estoy revisando el archivo "kernel / signal.c" para comprender la gestión de la señal de estas señales especiales.

Para una comprensión directa de la salida, intente esta línea: awk 'BEGIN{print "ibase=16;obase=2;"} /^Sig...:/{ print toupper($2)}' /proc/$YourRedisPID/status | BC_LINE_LENGTH=0 bc

Esto me da salida:

0
0
10000000
110000000000000000100000000100011

Vamos a empezar por el envío de esta salida. Voy a actualizar el registro según se requiera.

Adrien M.
fuente
El proceso no está en wait4 (), gdb se cuelga en wait4 () cuando intenta acceder al proceso. El proceso en sí no está en ninguna llamada al sistema. Además, el proceso colgado no tiene hijos. Lamentablemente tuve que reiniciar la caja. Recopilaré los datos que solicitó una vez que vuelva a ocurrir el problema.
Alienth
Salida aquí: gist.githubusercontent.com/alienth/23685ad2ea46a7eade56/raw/... Una vez más, proc está ignorando SIGKILL. No está en una llamada al sistema. Proc también ignora SIGTERM.
Alienth