मार -9 एक पोस्टग्रेज प्रक्रिया है


25

हमारे DB सर्वर पर सेलेक्ट क्वेरी क्वेरी नियंत्रण से बाहर हो गई और मेमोरी से बाहर निकलने तक टन मेमोरी और स्वैप करना शुरू कर दिया। मैं विशेष प्रक्रिया के माध्यम से पाया ps aux | grep postgresऔर भाग गया kill -9 pid। इसने इस प्रक्रिया को मार दिया और स्मृति अपेक्षित रूप से मुक्त हो गई। शेष प्रणाली और पोस्टग्रेज क्वेरीज़ अप्रभावित दिखाई दिए। यह सर्वर SLES 9 SP4 पर 9.1.3 पोस्टग्रेट्स चला रहा है।

हालांकि, हमारे डेवलपर्स में से एक ने मुझे पोस्टग्रेज प्रक्रिया को मारने के लिए बाहर चबाया kill -9, यह कहते हुए कि यह पूरी पोस्टग्रेज सेवा को नीचे ले जाएगा। वास्तव में, यह नहीं था। मैंने ऐसा कुछ समय से पहले किया है और इसका कोई नकारात्मक दुष्प्रभाव नहीं देखा है।

उस के साथ कहा, और आगे पढ़ने के बाद, ऐसा लगता है कि kill pidबिना झंडे के एक भगोड़ा पोस्टग्रेज प्रक्रिया को मारने का पसंदीदा तरीका है, लेकिन पोस्टग्रेज समुदाय में अन्य उपयोगकर्ताओं के अनुसार, यह भी लगता है कि पोस्टग्रेजों ने पिछले कुछ वर्षों में "बेहतर" प्राप्त किया है kill -9एक व्यक्तिगत क्वेरी प्रक्रिया / थ्रेड पर अब मौत की सजा नहीं है।

क्या कोई मुझे भगोड़ा पोस्टग्रेज प्रक्रिया को मारने के लिए उचित तरीके से बता सकता kill -9है और साथ ही इन दिनों पोस्टग्रेज के साथ कितना विनाशकारी (या सौम्य) उपयोग कर रहा है? अंतर्दृष्टि के लिए धन्यवाद।

जवाबों:


31

voretaq7 का उत्तर मुख्य बिंदुओं को शामिल करता है, जिसमें बैकएंड को समाप्त करने का सही तरीका शामिल है, लेकिन मैं थोड़ा और स्पष्टीकरण जोड़ना चाहूंगा।

kill -9(यानी SIGKILL) कभी भी, कभी भी, कभी भी आपकी पहली पसंद डिफ़ॉल्ट होना चाहिए । जब प्रक्रिया अपने सामान्य शटडाउन अनुरोधों का जवाब नहीं देती है, तो आपका अंतिम उपाय होना चाहिए और SIGTERM( kill -15) का कोई प्रभाव नहीं पड़ा है। यह Pg का सच है और बहुत अधिक सब कुछ।

kill -9 मारे गए प्रक्रिया को कोई भी सफाई करने का कोई मौका नहीं देता है।

जब यह PostgreSQL की बात आती है, तो Pg एक ऐसे बैकअप को देखता है kill -9जिसे एक समर्थित क्रैश के रूप में समाप्त किया जाता है । यह जानता है कि बैकएंड ने साझा की गई मेमोरी को दूषित कर दिया है - क्योंकि आपने शम में पेज लिखने या किसी एक को संशोधित करने के माध्यम से इसे आधे रास्ते से बाधित किया हो सकता है, उदाहरण के लिए - तो यह समाप्त हो जाता है और अन्य सभी बैकेंड को पुनरारंभ करता है जब यह नोटिस होता है कि बैकएंड अचानक गायब हो गया है और एक गैर-शून्य त्रुटि कोड के साथ बाहर निकल गया।

आप इस रिपोर्ट को लॉग में देखेंगे।

यदि यह कोई नुकसान नहीं करता है, तो ऐसा इसलिए है क्योंकि Pg दुर्घटना के बाद सब कुछ फिर से शुरू कर रहा है और आपका एप्लिकेशन खोए हुए कनेक्शनों से सफाई से ठीक हो रहा है। यह एक अच्छा विचार नहीं है। अगर कुछ और बैकएंड क्रैश Pg के सामान्य-कामकाजी भागों की तुलना में कम अच्छी तरह से जांचे जाते हैं और बहुत अधिक जटिल / विविध होते हैं, तो बैकएंड क्रैश हैंडलिंग और रिकवरी में बग की संभावना अधिक होती है।

BTW, यदि आप kill -9पोस्टमास्टर को हटाते हैं postmaster.pidऔर इसे फिर से शुरू करते हैं , तो सुनिश्चित करें कि हर postgresबैकेंड चला गया है, बहुत खराब चीजें हो सकती हैं । यह आसानी से हो सकता है यदि आपने गलती से एक बैकेंड के बजाय पोस्टमास्टर को मार दिया, तो देखा कि डेटाबेस नीचे चला गया था, इसे फिर से शुरू करने की कोशिश की, पुनरारंभ होने पर "बासी" .पीआईडी ​​फ़ाइल को हटा दिया, और फिर से पुनरारंभ करने का प्रयास किया। यही एक कारण है कि आपको kill -9Pg के चारों ओर घूमने से बचना चाहिए , और नहीं हटना चाहिए postmaster.pid

प्रदर्शन:

यह देखने के लिए कि kill -9बैकएंड होने पर क्या होता है , इन सरल चरणों को आज़माएं। ओपन दो टर्मिनलों, प्रत्येक में खुला psql, और प्रत्येक समय में SELECT pg_backend_pid();। एक और टर्मिनल kill -9में पीआईडी ​​में से एक। अब SELECT pg_backend_pid();दोनों psql सत्र में फिर से चलाएँ । ध्यान दें कि उन दोनों ने अपने कनेक्शन कैसे खो दिए?

सत्र 1, जिसे हमने मार दिया:

$ psql regress
psql (9.1.4)
Type "help" for help.

regress=# select pg_backend_pid();
 pg_backend_pid 
----------------
           6357
(1 row)

[kill -9 of session one happens at this point]

regress=# select pg_backend_pid();
server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.
The connection to the server was lost. Attempting reset: Succeeded.
regress=# select pg_backend_pid();
 pg_backend_pid 
----------------
           6463
(1 row)

सत्र 2, जो संपार्श्विक क्षति थी:

$ psql regress
psql (9.1.4)
Type "help" for help.

regress=# select pg_backend_pid();
 pg_backend_pid 
----------------
           6283
(1 row)

[kill -9 of session one happens at this point]

regress=# select pg_backend_pid();
WARNING:  terminating connection because of crash of another server process
DETAIL:  The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.
HINT:  In a moment you should be able to reconnect to the database and repeat your command.
server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.
The connection to the server was lost. Attempting reset: Succeeded.
regress=# select pg_backend_pid();
 pg_backend_pid 
----------------
           6464
(1 row)

देखें कि कैसे दोनों सत्र टूट गए थे? यही कारण है कि आप kill -9एक बैकेंड नहीं है।


1
यहाँ सभी बहुत अच्छे उत्तर, और बहुत ही विनम्रता से मैं जोड़ सकता हूँ। मैं उन सभी को स्वीकृत के रूप में चिह्नित कर सकता था, लेकिन @ क्रेग रिंगर के यहां कुछ अतिरिक्त बिंदु हैं और वास्तव में इसे होम ड्राइव करता है। मेरी बुरी आदतों की सफाई के लिए फिर से एसएफ!
बंजर

2
@ क्रेग: क्या शानदार प्रतिक्रिया है; और एक प्रदर्शन को शामिल करने के लिए, मैं चाहता हूं कि मैं इस 100x वोट कर सकता हूं। मैं एक सॉफ्टवेयर डेवलपर हूं जो 6.x दिनों से पीजी के साथ दैनिक काम करता है और आपकी प्रतिक्रिया हाजिर है! अच्छा!
किलो

2
अच्छा जवाब। एक परिशिष्ट: यदि आपके पास एक बैकएंड प्रक्रिया है जो बिल्कुल नहीं मरेगी - नहीं के साथ pg_terminate_backend, सर्वर स्टैक पुनरारंभ के साथ नहीं, किसी भी चीज़ के साथ नहीं, आप इसे अपनी इच्छा के अनुसार मार सकते हैं, लेकिन सुनिश्चित करें कि आपके पास अपने डेटाबेस का एक काम करने वाला बैकअप है। आप ऐसा कर सकते हैं कि कुछ तरीके: आप अपनी डेटा निर्देशिका का बैकअप लेने के लिए pg_basebackupया (या सिर्फ rsyncऔर सिर्फ pg_start\stop_backup) का उपयोग कर सकते हैं ( जारी रखने से पहले बैकअप का परीक्षण कर सकते हैं!), या आप pg_dump[all]अपने डेटा का निस्तारण करने के लिए उपयोग कर सकते हैं । तभी आपको विचार करना चाहिए kill -9, या एक रिबूट, या जो भी हो।
ज़ैक बी

1
@ZacB हां, और यदि आप इसे मारते हैं तो सुनिश्चित करें कि सभी बैकेंड मर जाते हैं। ज्यादातर, कभी नहीं हटा postmaster.pid। कभी।
क्रेग रिंगर

29

I found the particular process via ps aux | grep postgres and ran kill -9 pid.
नहीं! खराब! वापसी से कदम को रोकें!

गंभीरता से - इस तरह से बैकग्राउंड को न मारें - TERRIBLE चीजें हो सकती हैं (यहां तक ​​कि 7.x दिनों के बाद से की गई सभी स्थिरता वृद्धि के साथ) जो आपके पूरे DB को कचरा कर सकती है, और आपका डेवलपर चबाने के लिए काफी सही है आप ऐसा करने के लिए बाहर हैं।

वास्तव में, Postgres के भीतर से ऐसा करने का एक धन्य और स्वीकृत तरीका है - यह Postgres मैनुअल में भी है, हालांकि SO पोस्ट इसे समझाने का एक बेहतर काम करता है ...

SELECT pg_cancel_backend(pid)
एक SIGINTनिर्दिष्ट बैकेंड को रद्द ( ) संकेत भेजता है , जो वर्तमान में चल रहे प्रश्न को रद्द करता है।

select pg_terminate_backend(pid)
SIGTERMनिर्दिष्ट बैकेंड के लिए एक टर्मिनेट ( ) संकेत भेजता है , जो क्वेरी को रद्द कर देता है और बैकएंड को रोक देता है (इसके कनेक्शन को छोड़ देता है)।

बैकएंड आईडी pg_stat_activityतालिका से प्राप्त किया जा सकता है (या ps)


4
यदि किसी की भयानक चीजों के बारे में किसी भी तरह की सोच हो, तो यह देखते हुए कि kill -9प्रणाली को अचानक से बंद करने की शक्ति नहीं है, जहां तक ​​कि मारे गए प्रक्रिया का संबंध है: Pg बैकएंड क्रैश (जैसे kill -9) के लिए बहुत सहनशील है और इसमें कभी भी डेटा भ्रष्टाचार नहीं होना चाहिए। वहाँ होगा भ्रष्टाचार करता है, तो तुम्हें मार हो पोस्टमास्टर , निकालें postmaster.pid, और भी पहले हर बैकएंड की हत्या के बिना इसे पुनः आरंभ करें। जो आपके डेटाबेस को नष्ट कर देगा, लेकिन kill -9एक बैकएंड की तुलना में बहुत अधिक लेता है । kill -9पोस्टमास्टर को बैकेंड्स को मारने का समय नहीं देता है, यही कारण है कि यह खतरनाक है।
क्रेग रिंगर

2
... एक आपातकालीन परामर्श मामले की तरह मैंने पिछले सप्ताह किया था। अपने डेटाबेस को खराब रूप से दूषित कर दिया, दो दिनों के काम को खो दिया क्योंकि उनके बैकअप विफल हो रहे थे (और वे अपने पुनर्स्थापना को ऑटो-टेस्ट नहीं करते थे), 48 घंटों के लिए नीचे थे। हटाओ मत postmaster.pid
क्रेग रिंगर

8

PostgreSQL क्लाइंट प्रक्रिया को मारना ठीक होना चाहिए। PostgreSQL डेमन प्रक्रिया को मारना आपको डांट सकता है।

चूँकि SQL डेमोंस में आंतरिक प्रक्रिया नियंत्रण भी होता है, इसलिए पसंदीदा तरीका यह है कि पहले उस चैनल का उपयोग करके देखें।

देखें बंद करो (लंबी) PostgreSQL में SQL क्वेरी चल रहा है ... StackOverflow से।


4
kill -9वैसे भी आपकी डिफ़ॉल्ट पसंद कभी नहीं होनी चाहिए, यह एक अंतिम उपाय है। एक या सादे के SIGTERMसाथ भेजें और यदि प्राप्तकर्ता थोड़ी देर बाद जवाब नहीं देता है, तो केवल आपको विचार करना चाहिए ( )। kill -TERMkillkill -KILLkill -9
क्रेग रिंगर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.