PostgreSQL चेकपॉइंट में क्या होता है?


22

यहाँ मेरे चेकपॉइंट लॉग का हिस्सा है:

2014-03-26 11:51:29.341 CDT,,,18682,,532854fc.48fa,4985,,2014-03-18 09:15:24 CDT,,0,LOG,00000,"checkpoint complete: wrote 15047 buffers (1.4%); 0 transaction log file(s) added, 0 removed, 30 recycled; write=68.980 s, sync=1.542 s, total=70.548 s; sync files=925, longest=0.216 s, average=0.001 s",,,,,,,,,""
2014-03-26 11:56:05.430 CDT,,,18682,,532854fc.48fa,4987,,2014-03-18 09:15:24 CDT,,0,LOG,00000,"checkpoint complete: wrote 16774 buffers (1.6%); 0 transaction log file(s) added, 0 removed, 31 recycled; write=72.542 s, sync=17.164 s, total=89.733 s; sync files=885, longest=3.812 s, average=0.019 s",,,,,,,,,""
2014-03-26 12:01:21.650 CDT,,,18682,,532854fc.48fa,4989,,2014-03-18 09:15:24 CDT,,0,LOG,00000,"checkpoint complete: wrote 14436 buffers (1.4%); 0 transaction log file(s) added, 0 removed, 33 recycled; write=122.350 s, sync=5.212 s, total=127.676 s; sync files=924, longest=3.740 s, average=0.005 s",,,,,,,,,""
2014-03-26 12:06:25.028 CDT,,,18682,,532854fc.48fa,4991,,2014-03-18 09:15:24 CDT,,0,LOG,00000,"checkpoint complete: wrote 13277 buffers (1.3%); 0 transaction log file(s) added, 0 removed, 29 recycled; write=126.217 s, sync=5.733 s, total=131.991 s; sync files=894, longest=1.859 s, average=0.006 s",,,,,,,,,""
2014-03-26 12:10:41.958 CDT,,,18682,,532854fc.48fa,4993,,2014-03-18 09:15:24 CDT,,0,LOG,00000,"checkpoint complete: wrote 20765 buffers (2.0%); 0 transaction log file(s) added, 0 removed, 28 recycled; write=88.015 s, sync=10.818 s, total=98.872 s; sync files=881, longest=2.690 s, average=0.012 s",,,,,,,,,""

मैंने देखा कि कभी-कभी हमारा डेटाबेस बहुत धीमा होता है - आप बहुत अधिक संख्या में सामान्य प्रश्नों को देख सकते हैं जो अब की तुलना में बहुत लंबे समय तक अटके हुए हैं। यह स्पष्ट अपराधी के बिना नियमित रूप से होता है।

प्रश्न: क्या चौकी इसकी वजह बन सकती है? चेकपॉइंट के "सिंक" चरण में क्या होता है?

जवाबों:


32

अपने ऑपरेशन के दौरान, PostgreSQL रिकॉर्ड लॉग फ़ाइलों में लेन-देन में परिवर्तन करता है, लेकिन यह उन्हें वास्तविक डेटाबेस तालिकाओं में तुरंत फ्लश नहीं करता है। यह आमतौर पर स्मृति में परिवर्तन रखता है, और जब अनुरोध किया जाता है, तब तक उन्हें मेमोरी से वापस कर देता है, जब तक कि रैम पूरी नहीं होने लगती है और इसे उन्हें लिखना पड़ता है।

इसका मतलब यह है कि अगर यह क्रैश हो जाता है, तो डिस्क टेबल पर तारीख नहीं होगी। इसे ऑन-डिस्क तालिकाओं में परिवर्तन लागू करने से पहले, लेन-देन लॉग को फिर से खेलना होगा, इससे पहले कि यह वापस शुरू हो सके। एक बड़े, व्यस्त डेटाबेस के लिए कुछ समय लग सकता है।

उस कारण से, और ताकि लेन-देन लॉग हमेशा के लिए नहीं बढ़े, पोस्टग्रेक्यूएल समय-समय पर एक चेकपॉइंट करता है जहां यह सुनिश्चित करता है कि डीबी एक साफ स्थिति में है। यह डिस्क में सभी लंबित परिवर्तनों को फ्लश करता है और उन लेनदेन लॉग को पुन: चक्रित करता है जिनका उपयोग परिवर्तनों का क्रैश रिकवरी रिकॉर्ड रखने के लिए किया जा रहा था।

यह फ्लश दो चरणों में होता है:

  • तालिकाओं write()के गंदे बफ़र shared_buffers; तथा
  • fsync() प्रभावित फ़ाइलों के लिए सुनिश्चित करें कि परिवर्तन वास्तव में डिस्क को हिट करते हैं

वे दोनों डिस्क I / O लोड बढ़ा सकते हैं। इन राइट्स के कारण होने वाला कॉन्ट्रैक्ट रीड को धीमा कर सकता है, और लेन-देन करने के लिए आवश्यक वाल सेगमेंट के फ्लशिंग को भी धीमा कर सकता है।

यह एक लंबी चुनौती है, लेकिन यह बदतर हो रहा है क्योंकि हम सिस्टम को अधिक से अधिक रैम के साथ देखते हैं ताकि वे अधिक डेटा को बफर कर सकें और इसे लिखने में अधिक समय ले सकें। इस LWN.net लेख में चर्चा की गई है कि वर्तमान में लिनक्स और PostgreSQL समुदायों के बीच इस पर कैसे व्यवहार किया जाए, इस पर चर्चा हो रही है । (LWN.net इस तरह के महान काम को लिखने में सक्षम नहीं होगा यदि लोग सदस्यता नहीं लेते हैं। मैं एक ग्राहक हूं और इस लिंक को साझा कर रहा हूं क्योंकि यह उपयोगी और जानकारीपूर्ण है। कृपया सदस्यता लेने पर विचार करें यदि आप इसे और अधिक देखना चाहते हैं। लगभग वैसी चीज़।)

मुख्य बात यह है कि आप इस समय चौकियों के प्रभाव को कम करने के लिए चेकपॉइंट गतिविधि को बढ़ाकर checkpoint_completion_targetबाहर कर सकते हैं ताकि अंतिम चेकपॉइंट आने के समय तक अधिक डेटा लिखा जा सके। इसकी एक लागत है, हालांकि - यदि आप किसी पृष्ठ (कहते हैं) को दस बार अपडेट करते हैं, तो यह एक उच्च समापन लक्ष्य के साथ चेकपॉइंट से पहले कई बार डिस्क पर लिखा जा सकता है, भले ही इसे केवल कड़ाई से क्रैश सुरक्षा के लिए एक बार लिखा जाना था। एक उच्च पूरा होने वाला लक्ष्य स्मूथ आई / ओ पैटर्न के लिए बनाता है, लेकिन अधिक समग्र आई / ओ ओवरहेड।

दूसरी चीज़ जो आप मदद कर सकते हैं, वह यह बताती है कि आपके ऑपरेटिंग सिस्टम को तुरंत डेटा लिखना शुरू करना है जब वह बफर हो जाता है। यह सेटिंग के कर्नेल पक्ष की तरह है checkpoint_completion_targetऔर इसका समान ट्रेड-ऑफ है। देखें linux वीएम प्रलेखन , विशेष रूप से dirty_background_bytes, dirty_background_ratio, dirty_expire_centisecs


लेखन लंबे समय से फैला हुआ है और मुझे नहीं लगता कि यह मुद्दों का कारण बन रहा है। सिंक के बारे में क्या, यह किसी भी तरह के ऑपरेशन की दुनिया भर में रोक है?
कोनराड गार्स 27'14

@KonradGarus सिंक को किसी भी प्रकार का विश्वव्यापी ऑपरेशन नहीं होना चाहिए , लेकिन यह वैसे भी अक्सर होता है। लेख मैं ऊपर से जुड़ा हुआ है, यह एक बहुत ही समय पर और मुद्दों का उपयोगी सारांश है, एक काफी तकनीकी दृष्टिकोण से। लघु संस्करण "fsync () लिनक्स पर है, fsync ()" के साथ किसी भी I / O समवर्ती के प्रदर्शन को पूरी तरह से रद्द कर देता है। आप उस राशि को कम करने के लिए ऊपर सूचीबद्ध ट्यूनिंग विकल्पों के साथ एक fsync द्वारा फ्लश किया जा सकता है।
क्रेग रिंगर

1

गंदा ओएस फाइल सिस्टम से अधिक की वजह से बफ़र्स निस्तब्धता dirty_bytesया dirty_ratio है एक अग्रभूमि आपरेशन अवरुद्ध!

कर्नेल tunables dirty_bytes, dirty_background_bytes, dirty_ratio, dirty_background_ratioऔर dirty_centisecsनियंत्रण गंदा ओएस फाइल सिस्टम बफ़र्स की डिस्क पर निस्तब्धता। dirty_bytesबाइट्स dirty_ratioमें दहलीज है, कुल मेमोरी के अनुपात के रूप में दहलीज है। dirty_background_bytesऔर dirty_background_ratioइसी तरह की थ्रेशोल्ड हैं, लेकिन फ्लशिंग बैकग्राउंड में होता है और जब तक यह पूरा नहीं होता तब तक अन्य रीड / राइट ऑपरेशन को ब्लॉक नहीं करता है। dirty_centisecsएक फ्लश शुरू होने से पहले कितने सेंटीसेकंड गुजर सकते हैं।

हाल ही में इन ट्यूनाबल्स के लिए चूक को लिनक्स में कम किया गया था, क्योंकि आधुनिक मशीनों के लिए मेमोरी का आकार नाटकीय रूप से बढ़ गया है। के लिए 5 और 10% की भी अनुपात dirty_background_ratioऔर dirty_ratioएक 256 जीबी मशीन पर एक आई / ओ प्रणाली भर सकते हैं।

ट्यूनिंग dirty_background_bytesया dirty_background_ratioपृष्ठभूमि में गंदे बफ़र्स को फ्लश करना शुरू करना मुश्किल है। सौभाग्य से आप इन सेटिंग्स को पोस्टग्रेएसक्यूएल या होस्ट को बंद करने के लिए बिना उचित फ़ाइलों के नए मानों को गूँज कर सकते हैं:

$ sudo echo [int value of bytes] > /proc/sys/vm/dirty_background_bytes

एक पृष्ठभूमि फ्लश को ट्रिगर करने के लिए गंदगी बाइट्स की संख्या निर्धारित करने के लिए उदाहरण के लिए। आप एक बैटरी समर्थित, संधारित्र समर्थित, या फ्लैश मेमोरी RAID कार्ड (आप उपयोग कर रहे हैं है आप करते हैं, एक दुर्घटना के मामले में अपने डेटा रखना चाहते हैं नहीं?) ट्यूनिंग द्वारा शुरू dirty_background_bytes1/2 लिखने कैश बफर आकार करने के लिए और dirty_bytes3/4 आकार। Iostats के साथ अपनी I / O प्रोफ़ाइल की निगरानी करें और यदि आप अभी भी विलंबता के मुद्दों को देख रहे हैं, जिसका अर्थ है कि आपका डेटाबेस लोड लोड अभी भी फ़ाइल बफ़र कैश फ़्लश को दबा रहा है। जब तक विलंबता में सुधार नहीं होता है या अपने I / O सबसिस्टम को अपग्रेड करने पर विचार करें, तब तक मानों को नीचे ले जाएं। फ्यूजनियो कार्ड और एसएसडी चरम आई / ओ थ्रूपुट के लिए दो संभावनाएं हैं।

सौभाग्य!


"गंदा" डेटा पर आपकी टिप्पणी धीमापन के लिए एक प्रासंगिक बिंदु है। अनिवार्य रूप से: गंदे अनुपात जितना बड़ा होता है, उतने अधिक बफर को किकिंग फ्लश करने से पहले गंदे डेटा के लिए आवंटित किया जाता है। इस प्रकार, फ्लशिंग देरी को कम करने का मतलब है कि गंदा बफर को बढ़ाना, या समय को बढ़ाकर गंदा डेटा मेमोरी में बना रह सकता है।
पीटर तेह
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.