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:) running
oder 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.
quelle
dmesg
Ausgabe erzählen ?/proc/<pid>/stack
(und/proc/<pid>/task/*/stack
)? Hat dieser Prozess mehrere Threads?Antworten:
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:
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:
Beginnen wir mit dem Senden dieser Ausgabe. Ich werde den Beitrag nach Bedarf aktualisieren.
quelle