Ein Prozess, der abstürzt, SIGKILL ignoriert, ausgeführt werden kann (kein Zombie oder unterbrechungsfreier Schlaf). In welchem ​​Zustand ist es?

17

Ich habe einen Prozess, der jetzt mehrmals nicht mehr reagiert und vollständig blockiert zu sein scheint. Es reagiert nicht auf den Versuch, mit gdb zu spähen (gdb hängt nur an einem wait4 () - Syscall). Der Prozess kann ausgeführt werden und wartet nicht auf einen Systemaufruf (/ proc / X / syscall:) runningoder im ununterbrochenen Ruhezustand (/ proc / X / status:) State: R (running).

In welchem ​​Zustand befindet sich dieser Prozess genau? Handelt es sich möglicherweise um einen Kernel-Bug?

Der Prozess ist neu, und das ist jetzt ein paar Mal passiert. Das Einzige, was den Prozess zum Erliegen bringen kann, scheint ein Neustart zu sein. OS ist Cent 7.

Bearbeiten: Kernel-Version ist 3.10.0-123.13.2.el7.x86_64. Versucht ein Update auf 3.10.0-229.11.1.el7, um festzustellen, ob dies einen Unterschied macht.

alienth
quelle
Welche Version von GDB verwendet es? Laut stackoverflow.com/questions/8978777/… könnte eine neuere Version besser funktionieren.
Greg Bray
Momentan sieht es so aus, als wäre die Untersuchung aufgrund der besonderen Art und Weise, in der sie hängt, eher kernel-seitig, aber wenn es Ihnen nichts ausmacht, könnten Sie ein paar Redis-spezifische Informationen hinzufügen? Was der Prozess tut, während er blockiert und solche Dinge. Ich habe ein paar Informationen von Nick Craver über Twitter erhalten. Anscheinend lädt Redis einen großen Datensatz, wenn dies passiert. Wird der Datensatz gerade neu geladen oder auf andere Weise (z. B. über DEBUG RELOAD oder Pipelining großer Datenmengen) )? Vielen Dank.
@antirez Der Datensatz wird von einer RDB-Kopie einer anderen Redis-Instanz geladen. Die Überbrückungen treten auf, nachdem Redis gestartet und die Riesen-RDB eingelesen hat. Bemerkenswerterweise kommt es dabei nicht immer zu Abstürzen, nur manchmal.
Alienth
1
Ich hatte nur solche Probleme, wenn ich E / A-Fehler hatte. Könnten Sie uns bitte etwas über die dmesgAusgabe erzählen ?
Ho1
3
Was enthält /proc/<pid>/stack(und /proc/<pid>/task/*/stack)? Hat dieser Prozess mehrere Threads?
Stéphane Chazelas

Antworten:

2

wait4 ist ein Systemaufruf, der angibt, dass der Prozess auf eine seiner untergeordneten Beendigungen wartet. Dies kann auf ein Problem mit der Signalverarbeitung hinweisen.

Ein bisschen brutal, aber du kannst versuchen zu töten , die Hierarchie der App: kill -15 -$YourRedisPID. Das - vor der PID bedeutet "die PID und ihre Kinder". Da es auf die Beendigung eines Kindes zu warten scheint, wird es möglicherweise entsperrt.

Wenn es nicht funktioniert, lassen Sie uns genauer prüfen: Finden Sie Ihren Signalprozessstatus mit grep ^Sig /proc/$YourRedisPID/status

Sie werden einige Dinge sehen wie:

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

Wie in "fs / proc / array.c" der Kernelquelle definiert, ist "SigQ" die Anzahl der anstehenden Signale / die Grenze der anstehenden Signale.

Wenn die Anzahl der Signale zu hoch ist, weist dies möglicherweise darauf hin, dass Ihr "SIGKILL" überhaupt nicht verarbeitet wird. Ich überprüfe immer noch die Datei "kernel / signal.c", um die Signalverwaltung dieser speziellen Signale zu verstehen.

Probieren Sie diesen Einzeiler aus, um ein direktes Verständnis der Ausgabe zu erhalten: awk 'BEGIN{print "ibase=16;obase=2;"} /^Sig...:/{ print toupper($2)}' /proc/$YourRedisPID/status | BC_LINE_LENGTH=0 bc

Das gibt mich aus:

0
0
10000000
110000000000000000100000000100011

Beginnen wir mit dem Senden dieser Ausgabe. Ich werde den Beitrag nach Bedarf aktualisieren.

Adrien M.
quelle
Der Prozess ist nicht in wait4 (), gdb hängt an wait4 (), wenn versucht wird, auf den Prozess zuzugreifen. Der Prozess selbst ist in keinem Systemanruf. Auch der Hung-Prozess hat keine Kinder. Leider musste ich die Box neu starten. Ich werde die von Ihnen angeforderten Daten sammeln, sobald das Problem erneut auftritt.
Alienth
Hier ausgeben : gist.githubusercontent.com/alienth/23685ad2ea46a7eade56/raw/… Auch hier ignoriert proc SIGKILL. Es ist nicht in einem Syscall. Proc ignoriert auch SIGTERM.
24.