प्रक्रिया जो लॉक अप करती है, SIGKILL को नजरअंदाज करती है, वह रननीय है (एक ज़ोंबी या अबाधित नींद में नहीं)। यह किस राज्य में है?


17

मेरे पास एक प्रक्रिया है जो कई बार अब जवाब देना बंद कर चुकी है और पूरी तरह से लॉक हो रही है। यह gdb के साथ स्ट्रेस या पीकिंग पर किसी भी प्रयास का जवाब नहीं देता है (gdb बस एक वेट 4 () syscall पर लटका हुआ है)। प्रक्रिया चल रही है, और एक syscall (/ proc / X / syscall:) runningया अबाधित नींद (/ proc / X / स्थिति :) में प्रतीक्षा नहीं कर रही है State: R (running)

यह प्रक्रिया किस अवस्था में है? क्या यह संभवतः किसी प्रकार का कर्नेल बग है?

प्रक्रिया लाल रंग की है, और यह अब कुछ समय हुआ है। केवल एक चीज जो प्रक्रिया को मार सकती है वह एक रिबूट है, ऐसा लगता है। OS 7 Cent है।

संपादित करें: कर्नेल संस्करण 3.10.0-123.13.2.el7.x86_64 है। 3.10.0-229.11.1.el7 के अपडेट को देखने की कोशिश करना कि क्या इससे कोई फर्क पड़ता है।


GDB किस संस्करण का उपयोग कर रहा है? के अनुसार stackoverflow.com/questions/8978777/... बेहतर एक नए संस्करण हो सकता है काम करते हैं।
ग्रेग ब्रे

वर्तमान में ऐसा लग रहा है कि विशेष तरीके से लटकाए जाने के कारण जांच अधिक कर्नेल पक्ष है, लेकिन यदि आप बुरा नहीं मानते हैं, तो क्या आप कुछ रेडिस विशिष्ट सुझाव जोड़ सकते हैं? यह ब्लॉक और उस तरह की चीजों के दौरान क्या प्रक्रिया कर रहा है। मुझे ट्विटर के माध्यम से निक क्रेवर से कुछ जानकारी मिली, जाहिरा तौर पर रेडिस एक बड़ा डेटा सेट लोड कर रहा है जब ऐसा होता है, क्या डेटा सेट सिर्फ प्रक्रिया को पुनः आरंभ करने या किसी अन्य तरीके से लोड किया जाता है (उदाहरण के लिए DEBUG RELOAD, या बड़ी मात्रा में डेटा का पाइपलाइन करना) )? धन्यवाद।

@antirez डेटा सेट को एक अन्य रेडिस उदाहरण से rdb कॉपी द्वारा लोड किया जा रहा है। रेडअप शुरू होने और विशालकाय आरडीबी में पढ़ने के बाद लॉकअप होता है। विशेष रूप से यह हमेशा इस दौरान लॉकअप नहीं करता है, बस कभी-कभी।
अलिंथ

1
IO त्रुटियां होने पर मेरे पास केवल इस प्रकार के मुद्दे थे। क्या आप कृपया हमें dmesgआउटपुट के बारे में बता सकते हैं ?
1

3
क्या /proc/<pid>/stack(और /proc/<pid>/task/*/stack) शामिल है? क्या उस प्रक्रिया को कई सूत्र मिले हैं?
स्टीफन चेज़लस

जवाबों:


2

Wait4 एक syscall है जो यह दर्शाता है कि प्रक्रिया उसके बच्चे की समाप्ति के लिए प्रतीक्षा कर रही है। यह सिग्नल हैंडलिंग के साथ कुछ समस्या को इंगित कर सकता है।

थोड़ा क्रूर, लेकिन आप एप्लिकेशन के पदानुक्रम को मारने की कोशिश कर सकते हैं kill -15 -$YourRedisPID:। - पीआईडी का अर्थ है "पीआईडी और उसके बच्चों" से पहले। जैसा कि यह एक बच्चे की समाप्ति की प्रतीक्षा कर रहा है, यह इसे अनलॉक कर सकता है।

यदि यह काम नहीं कर रहा है, तो आइए गहराई से जाँचें: अपनी सिग्नल प्रक्रिया की स्थिति जानें grep ^Sig /proc/$YourRedisPID/status

आपको कुछ सामान दिखाई देंगे जैसे:

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

जैसा कि कर्नेल स्रोत के "fs / proc / array.c" में परिभाषित किया गया है, "SigQ" लंबित संकेतों की संख्या / लंबित संकेतों की सीमा है।

यदि सिग्नल की संख्या बहुत अधिक है, तो यह संकेत दे सकता है कि आपका "SIGKILL" हैंडल नहीं है। मैं अभी भी इन विशेष सिग्नलों के सिग्नल प्रबंधन को समझने के लिए "कर्नेल / सिग्नल.सी" फ़ाइल की जाँच कर रहा हूँ।

आउटपुट की प्रत्यक्ष समझ के लिए, यह वन-लाइनर आज़माएँ: awk 'BEGIN{print "ibase=16;obase=2;"} /^Sig...:/{ print toupper($2)}' /proc/$YourRedisPID/status | BC_LINE_LENGTH=0 bc

यह मुझे आउटपुट करता है:

0
0
10000000
110000000000000000100000000100011

चलिए शुरू करते हैं हमें यह आउटपुट भेजकर। मैं आवश्यकतानुसार पोस्ट अपडेट करूंगा।


प्रक्रिया प्रतीक्षा 4 () में नहीं है, प्रक्रिया को एक्सेस करने का प्रयास करते समय gdb को प्रतीक्षा 4 () पर लटका दिया जाता है। प्रक्रिया स्वयं किसी भी syscall में नहीं है। इसके अलावा, त्रिशंकु प्रक्रिया की कोई संतान नहीं है। दुर्भाग्य से मुझे बॉक्स को रिबूट करना पड़ा। समस्या के पुनः दर्ज होने के बाद मैंने आपके द्वारा अनुरोधित डेटा एकत्रित किया जाएगा।
अलिंथ

यहाँ आउटपुट: gist.githubusercontent.com/alienth/23685ad2ea46a7eade56/raw/… एक बार फिर, खरीद SIGKILL की अनदेखी कर रहा है। यह एक syscall में नहीं है। प्रोक भी SIGTERM की अनदेखी करता है।
अलिंथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.