Kilitlenen, SIGKILL'i göz ardı eden işlem çalıştırılabilir (zombi değil veya kesintisiz uykuda). Hangi eyalette?


17

Birkaç kez yanıt vermiyor ve tamamen kilitli gibi görünen bir süreç var. Gdb ile strace veya peeking girişimlerine yanıt vermez (gdb sadece wait4 () sistem çağrısında asılı kalır). İşlem çalıştırılabilir ve bir sistem çağrısında (/ proc / X / sistem çağrısı:) runningveya kesintisiz uykuda (/ proc / X / durum :) beklemiyor State: R (running).

Bu süreç tam olarak hangi durumda? Bu muhtemelen bir tür çekirdek hatası mı?

Süreç yeniden, ve bu şimdi birkaç kez oldu. Süreci öldürebilecek tek şey yeniden başlatma gibi görünüyor. İşletim Sistemi Cent 7'dir.

Düzenleme: Çekirdek sürümü 3.10.0-123.13.2.el7.x86_64. Bunun herhangi bir fark yaratıp yaratmadığını görmek için 3.10.0-229.11.1.el7 sürümüne güncelleme yapmayı deneyin.


Hangi GDB sürümünü kullanıyor? Stackoverflow.com/questions/8978777/… ' a göre daha yeni bir sürüm daha iyi çalışabilir.
Greg Bray

Şu anda, özel olarak askıda kalması nedeniyle araştırmanın çekirdek tarafı olduğu anlaşılıyor, ancak sakıncası yoksa, birkaç Redis'e özgü bilgi ekleyebilir misiniz? Süreç engellenirken ne yapıyor ve bunun gibi şeyler. Nick Craver'dan Twitter üzerinden birkaç bilgi aldım, görünüşe göre Redis bu olduğunda büyük bir veri kümesi yüklüyor, veri kümesi sadece işlemi yeniden başlatıyor veya başka bir şekilde yüklüyor (örneğin DEBUG RELOAD aracılığıyla veya büyük miktarda veri boru hattı oluşturuyor) )? Teşekkürler.

@antirez Veri kümesi başka bir redis örneğindeki rdb kopyası tarafından yükleniyor. Kilitlenmeler, yeniden başlatma başlatıldıktan ve dev rdb'de okunduktan sonra gerçekleşir. Özellikle, bu bazen her zaman kilitlenmez.
Alienth

1
IO hataları yaparken sadece bu tür sorunlar yaşadım. Bize dmesgçıktıdan bahseder misiniz ?
Ho1

3
Ne içerir /proc/<pid>/stack(ve /proc/<pid>/task/*/stack)? Bu işlemin birkaç iş parçacığı var mı?
Stéphane Chazelas

Yanıtlar:


2

wait4, sürecin çocuk sonlandırılmasından birini beklediğini gösteren bir sistemdir. Bu, sinyal işleme ile ilgili bazı sorunlara işaret edebilir.

Bir acımasız bit, ancak öldürmeye çalışabilir hiyerarşi uygulamasının: kill -15 -$YourRedisPID. - PID aracı "PID ve çocuklar" önce. Bir çocuk fesih bekliyor gibi görünüyor, kilidini açabilir.

Çalışmıyorsa daha derinlemesine kontrol edelim: sinyal işlem durumunuzu grep ^Sig /proc/$YourRedisPID/status

Gibi bazı şeyler göreceksiniz:

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

Çekirdek kaynağının "fs / proc / array.c" de tanımlandığı gibi, "SigQ" bekleyen sinyallerin sayısı / bekleyen sinyallerin sınırıdır.

Sinyal sayısı çok yüksekse, "SIGKILL" cihazınızın hiç ele alınmadığını gösterebilir. Hala bu özel sinyallerin sinyal yönetimini anlamak için "kernel / signal.c" dosyasını kontrol ediyorum.

Çıktıyı doğrudan anlamak için şu tek astarı deneyin: awk 'BEGIN{print "ibase=16;obase=2;"} /^Sig...:/{ print toupper($2)}' /proc/$YourRedisPID/status | BC_LINE_LENGTH=0 bc

Bu beni şöyle çıkarır:

0
0
10000000
110000000000000000100000000100011

Bize bu çıktıyı göndererek başlayalım. Gönderiyi gerektiği gibi güncelleyeceğim.


İşlem wait4 () içinde değil, gdb sürece erişmeye çalışırken wait4 () üzerine asıldı. Sürecin kendisi herhangi bir sistemde değildir. Ayrıca, asılı sürecin çocuğu yoktur. Ne yazık ki kutuyu yeniden başlatmak zorunda kaldım. Sorun tekrarlandıktan sonra istediğiniz verileri toplayacağım.
alienth

Buradan çıktı: gist.githubusercontent.com/alienth/23685ad2ea46a7eade56/raw/… Bir kez daha, proc SIGKILL'i görmezden geliyor. Bir sistem çağrısında değil. Proc ayrıca SIGTERM'i de yok sayar.
alienth
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.