लेखन प्रदर्शन के लिए PostgreSQL को कॉन्फ़िगर करना


30

मेरा एक PostgreSQL सर्वर कई (1-3) डेटाबेस होस्ट करता है जो डेटा की एक निरंतर स्ट्रीम प्राप्त करते हैं। डेटा विशेष रूप से संरचित नहीं है, यह वर्तमान समय और उस विशेष इंस्टेंट के लिए अवलोकन किए गए डेटा की एक किस्म है। डेटा दर काफी अधिक है; यह एक डेटाबेस के लिए एक दिन में एक गीगाबाइट के बारे में काम करता है, दसवें के बारे में दूसरे के लिए। मुझे इस दर में वृद्धि की उम्मीद नहीं है। पढ़ें प्रदर्शन बहुत कम प्राथमिकता है और वर्तमान में स्वीकार्य है।

लॉग में मेरे पास यह संदेश है:

LOG:  checkpoints are occurring too frequently (15 seconds apart)
HINT:  Consider increasing the configuration parameter "checkpoint_segments".

यह मान वर्तमान में 16 पर सेट है, जो शिष्टाचार है pgtune

लेखन प्रदर्शन को बेहतर बनाने के लिए मुझे किन सेटिंग्स पर विचार करना चाहिए? मैं ज्यादा से ज्यादा सेफ्टी रखना पसंद करूंगा। जब तक डेटा की मात्रा को ध्यान में रखते हुए, मैं हाल ही में कुछ डेटा को एक विफलता में खोने के रूप में स्वीकार कर सकता था जब तक कि डेटा का थोक बरकरार नहीं था।

संपादित करें: मैं अभी के लिए PostgreSQL 9.0 का उपयोग कर रहा हूं, लेकिन मुझे 9.1 में अपग्रेड करने की योजना है। मैं हार्डवेयर विवरण पोस्ट नहीं कर रहा हूं क्योंकि जब मैं उनके महत्व को स्वीकार करता हूं, तो मुझे अंततः बहुत ही विविध हार्डवेयर के साथ कई मशीनों पर इस अनुकूलन को बनाने की आवश्यकता होगी। यदि हार्डवेयर उत्तर के लिए आवश्यक है, तो कृपया मुझे सामान्य जानकारी दें ताकि मैं विभिन्न हार्डवेयर कॉन्फ़िगरेशन के साथ मशीनों पर उत्तर लागू कर सकूं।


क्या आप अपने संस्करण को पोस्ट कर सकते हैं और अधिमानतः अपने भंडारण हार्डवेयर के बारे में कुछ विवरण दे सकते हैं?
जैक डगलस

क्या आपने checkpoint_segmentsसिफारिश के अनुसार वृद्धि की? क्या हुआ?
a_horse_with_no_name

3
इस तरह के सवालों के लिए एक और उत्कृष्ट संसाधन ग्रेगरी स्मिथ की पुस्तक PostgreSQL 9.0 उच्च प्रदर्शन है
जेपी

जवाबों:


24

1 गीगाबाइट एक दिन ऐसा नहीं है जो लिखने के भार से अधिक है। दिन भर में फैला है, कि एक दूसरे के बारे में 50kbytes के लिए बाहर आता है। एक धीमी USB अंगूठे ड्राइव कि संभाल सकता है। मैं मान रहा हूँ कि यह अधिक धमाकेदार है। जैसा कि a_horse_with_no_name सुझाव देता है, चेकपॉइंट सेगमेंट बढ़ाएं। 100 या तो सामान्य से बाहर नहीं है।

फिर अपने checkpoint_timeout1 घंटे को बढ़ाएं , साथ ही अपने checkpoint_completion_targetको 1.0 (100%) के करीब बढ़ाने के लिए देखें। पूरा होने का लक्ष्य पोस्टग्रैसक्यूएल बताता है कि पृष्ठभूमि में लिखने के लिए आक्रामक तरीके से कैसे लिखें ताकि चेकपॉइंट चलाने से पहले यह एक्स% पूरा हो, जो सभी डेटा को एक बार में वाल से लिखने के लिए मजबूर करता है और सिस्टम को क्रॉल करने के लिए धीमा कर देगा, जबकि यह हो रहा है।

जिस कारण से आप आमतौर पर इसे 100% पर सेट नहीं करते हैं, वह यह है कि एक ही ब्लॉक को एक से अधिक बार लिखना बहुत आम है, और देरी से मुख्य स्टोर के लिए लिखता है, आप उसी ब्लॉक को दो बार बिना किसी कारण के लिखे जाने से रोकते हैं।

यदि यह संभावना नहीं है कि आप अपने टाइमआउट होने से पहले एक से अधिक बार एक ही ब्लॉक में लिख रहे हैं, यानी आप जो भी करते हैं वह सम्मिलित होता है तो इसे बहुत अधिक सेट करने से इसे 0.9 या इसके ऊपर उठाने के लिए समझ में आता है। सबसे बुरी बात यह है कि आप थोड़ा और अधिक बार लिखेंगे जो आपको अन्यथा आवश्यकता हो सकती है, लेकिन चौकियों का प्रभाव बहुत कम हो जाएगा।


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

1
ठीक है, अगर दर एक दिन में 1G है और यह चिकनी है, तो लगभग कोई भी सबसिस्टम राइट लोड को संभाल सकता है, आप बस इसे सुचारू रखना चाहते हैं, जो कि चौकी पूरा होने का लक्ष्य 1.0 के पास निर्धारित किया जा रहा है और एक लंबी चौकी आपको मिलनी चाहिए।
स्कॉट मारलो

10

बहुत 'राइट हैवी' सिस्टम में, आपको उस दर से सीमित होने की संभावना है, जिसे पीक गतिविधि के दौरान वाल लिखा जा सकता है।

यदि आप वास्तव में "विफलता में कुछ हाल के डेटा को खोने को स्वीकार कर सकते हैं" तो आप सिंक्रोनस कमिट को बंद कर सकते हैं :

एक उपयोगी विकल्प हो सकता है जब लेनदेन के स्थायित्व के बारे में सटीक निश्चितता से अधिक महत्वपूर्ण है

यदि आप अपना हार्डवेयर बदलने में सक्षम हैं, तो आप इनमें से किसी को भी लिखने के लिए अनुकूलित करने पर विचार कर सकते हैं:

  • RAID5 पर RAID10
  • स्पिंडल के बहुत सारे (उदाहरण के लिए 3.5 के बजाय "2.5 का मतलब हो सकता है")
  • एसएटीए पर एसएएस
  • 10K ड्राइव पर 15K
  • एसएसडी

--edit

@ स्कॉट के उत्कृष्ट उत्तर पर आपकी टिप्पणी के आधार पर : "लिखने की मात्रा वास्तव में लगभग पूरी तरह से समान है", और "50kbytes a second" की निहित डेटा दर, मुझे संदेह है कि आपको कुछ भी करने की आवश्यकता है जो डेटा हानि का जोखिम उठाती है। शायद यह जानने में मदद मिलेगी कि आपके कुछ अन्य कॉन्फ़िगरेशन पैरामीटर क्या सेट हैं।


3
यदि प्रदर्शन के मामले लिखें, तो OS और कताई हार्ड ड्राइव के बीच एक बैटरी समर्थित नियंत्रक एक बड़ा अंतर बना सकता है।
स्कॉट मारलो

5

आप अपने कमिट की आवृत्ति / आकार की भी जांच कर सकते हैं: मैं हाल ही में एक मुद्दे पर भाग गया था जिसमें मैं एक ही लेनदेन में 1 मिलियन रिकॉर्ड अपडेट करने की कोशिश कर रहा था। मुझे ओपी द्वारा वर्णित लोगों के समान लॉग संदेश मिले, लेकिन लेनदेन कई घंटों के बाद भी पूरा नहीं हो सका। जब मैंने लेखन को कई छोटे लेनदेन (10,000 रिकॉर्ड या तो) में तोड़ दिया, तो कुल आवश्यक समय लगभग 15 मिनट हो गया।

मुझे लगता है कि यह हुआ कि Postgres ने लॉगइन को लिखने में इतना समय बिताया कि checkpoint_timeout बीतने से पहले ही रिकॉर्ड को बचाने के लिए पर्याप्त प्रगति कर सकता था। मुझे यकीन नहीं हो रहा है कि अगर स्पष्टीकरण हो। मुझे अभी भी चेतावनियाँ मिलती हैं, लेकिन सभी लेखन अंततः संसाधित होते हैं। हालाँकि, मुझे डेटाबेस में सुधार की आवश्यकता के बजाय एक प्रोग्रामेटिक वर्कअराउंड (और पाया गया) की आवश्यकता थी।

यह भी देखें Http://www.postgresql.org/docs/9.3/static/wal-configuration.html देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.