Proses yang mengunci, mengabaikan SIGKILL, dapat dijalankan (bukan zombie atau dalam keadaan tidur tanpa gangguan). Dalam kondisi apa?

17

Saya memiliki proses yang beberapa kali sekarang berhenti merespons dan tampaknya benar-benar terkunci. Itu tidak menanggapi upaya strace atau mengintip dengan gdb (gdb hanya hang pada syscall wait4 ()). Proses ini dapat dijalankan, dan tidak menunggu pada syscall (/ proc / X / syscall:) runningatau dalam kondisi tidur tanpa gangguan (/ proc / X / status:) State: R (running).

Bagaimana tepatnya proses ini? Apakah ini semacam bug kernel?

Prosesnya redis, dan ini sudah terjadi beberapa kali sekarang. Satu-satunya hal yang dapat mematikan proses adalah reboot, tampaknya. OS adalah Sen 7.

Sunting: Versi kernel adalah 3.10.0-123.13.2.el7.x86_64. Mencoba pembaruan ke 3.10.0-229.11.1.el7 untuk melihat apakah itu ada bedanya.

alienth
sumber
GDB versi apa yang digunakannya? Menurut stackoverflow.com/questions/8978777/… versi yang lebih baru mungkin berfungsi lebih baik.
Greg Bray
Saat ini sepertinya penyelidikan lebih bersifat kernel karena cara khusus hang, tetapi jika Anda tidak keberatan, dapatkah Anda menambahkan beberapa informasi spesifik Redis? Apa yang dilakukan proses itu sementara itu memblokir dan hal-hal seperti itu. Saya mendapat beberapa info dari Nick Craver melalui Twitter, rupanya Redis memuat set data besar ketika ini terjadi, apakah set data dimuat hanya memulai kembali proses atau dengan cara lain (misalnya melalui DEBUG RELOAD, atau pipelining sejumlah besar data )? Terima kasih.
@antirez Kumpulan data sedang dimuat oleh salinan rdb dari instance redis lainnya. Penguncian terjadi setelah redis dimulai dan membaca di rdb raksasa. Khususnya itu tidak selalu terkunci selama ini, hanya kadang-kadang.
alienth
1
Saya hanya memiliki masalah seperti ini ketika mengalami kesalahan IO. Bisakah Anda memberi tahu kami tentang dmesghasilnya?
Ho1
3
Apa yang mengandung /proc/<pid>/stack(dan /proc/<pid>/task/*/stack)? Sudahkah proses itu mendapat beberapa utas?
Stéphane Chazelas

Jawaban:

2

wait4 adalah syscall yang menunjukkan proses sedang menunggu salah satu pemutusan anaknya. Ini mungkin menunjukkan beberapa masalah dengan penanganan sinyal.

Sedikit brutal, tapi Anda dapat mencoba untuk membunuh hirarki dari aplikasi: kill -15 -$YourRedisPID. The - before PID berarti "PID dan anak-anaknya". Karena tampaknya sedang menunggu pemutusan anak, itu mungkin membukanya.

Jika tidak berfungsi, mari periksa lebih dalam: cari status proses sinyal Anda grep ^Sig /proc/$YourRedisPID/status

Anda akan melihat beberapa hal seperti:

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

Sebagaimana didefinisikan dalam "fs / proc / array.c" dari sumber kernel, "SigQ" adalah jumlah sinyal yang tertunda / batas sinyal yang tertunda.

Jika jumlah sinyal terlalu tinggi, ini mungkin mengindikasikan "SIGKILL" Anda tidak ditangani sama sekali. Saya masih memeriksa file "kernel / signal.c" untuk memahami manajemen sinyal dari sinyal-sinyal khusus ini.

Untuk pemahaman langsung tentang output, cobalah one-liner ini: awk 'BEGIN{print "ibase=16;obase=2;"} /^Sig...:/{ print toupper($2)}' /proc/$YourRedisPID/status | BC_LINE_LENGTH=0 bc

Ini menghasilkan saya:

0
0
10000000
110000000000000000100000000100011

Mari kita mulai dengan mengirimkan output ini kepada kami. Saya akan memperbarui pos sesuai kebutuhan.

Adrien M.
sumber
Proses tidak dalam wait4 (), gdb digantung pada wait4 () ketika mencoba mengakses proses. Prosesnya sendiri tidak ada dalam syscall. Juga, proses digantung tidak memiliki anak. Sayangnya saya harus me-reboot kotak itu. Saya akan mengumpulkan data yang Anda minta begitu masalah terulang kembali.
alienth
Keluaran di sini: gist.githubusercontent.com/alienth/23685ad2ea46a7eade56/raw/… Sekali lagi, proc mengabaikan SIGKILL. Itu tidak dalam syscall. Proc juga mengabaikan SIGTERM.
alienth