Mam proces, który kilka razy teraz przestał odpowiadać i wydaje się całkowicie blokować. Nie reaguje na żadną próbę śledzenia lub podglądania za pomocą gdb (gdb po prostu zawiesza się na wywołaniu systemowym wait4 ()). Proces można uruchomić i nie czeka on na wywołanie systemowe (/ proc / X / syscall:) running
lub nieprzerwany sen (/ proc / X / status:) State: R (running)
.
W jakim stanie jest dokładnie ten proces? Czy to jest jakiś błąd jądra?
Proces jest redis i zdarzyło się to już kilka razy. Wydaje się, że jedyną rzeczą, która może zabić ten proces, jest restart. System operacyjny to Cent 7.
Edycja: Wersja jądra to 3.10.0-123.13.2.el7.x86_64. Próbuję zaktualizować do wersji 3.10.0-229.11.1.el7, aby sprawdzić, czy to coś zmienia.
process
linux-kernel
redis
Alienth
źródło
źródło
dmesg
wynikach?/proc/<pid>/stack
(i/proc/<pid>/task/*/stack
)? Czy ten proces ma kilka wątków?Odpowiedzi:
wait4 to syscall wskazujący, że proces czeka na jedno z jego zakończeń potomnych. Może to wskazywać na pewien problem z obsługą sygnału.
Trochę brutalne, ale można próbować zabić hierarchii app:
kill -15 -$YourRedisPID
. Znak - przed PID oznacza „PID i jego dzieci”. Ponieważ wydaje się, że czeka na zakończenie dziecka, może je odblokować.Jeśli to nie działa, sprawdźmy głębiej: znajdź swój status procesu przetwarzania za pomocą
grep ^Sig /proc/$YourRedisPID/status
Zobaczysz takie rzeczy jak:
Jak zdefiniowano w „fs / proc / array.c” źródła jądra, „SigQ” jest liczbą oczekujących sygnałów / limitem oczekujących sygnałów.
Jeśli liczba sygnałów jest zbyt wysoka, może to oznaczać, że Twój „SIGKILL” nie jest w ogóle obsługiwany. Nadal sprawdzam plik „kernel / signal.c”, aby zrozumieć zarządzanie sygnałami tych specjalnych sygnałów.
Aby uzyskać bezpośrednie zrozumienie danych wyjściowych, wypróbuj ten jeden wiersz:
awk 'BEGIN{print "ibase=16;obase=2;"} /^Sig...:/{ print toupper($2)}' /proc/$YourRedisPID/status | BC_LINE_LENGTH=0 bc
To daje mi:
Zacznijmy od wysłania nam tego wyjścia. Zaktualizuję post zgodnie z wymaganiami.
źródło