चलो वैक्यूम को बंद करें! एलेक्सी लेसोव्स्की

अलेक्सई लेसोव्स्की द्वारा 2018 की रिपोर्ट का डिकोडिंग "चलो वैक्यूम को बंद करें?"


संपादक का नोट: बदलते मापदंडों के लिए किसी भी सिफारिश की तुलना हमेशा अन्य रिपोर्टों में की जानी चाहिए।


PostgreSQL में समस्याएं आने पर ऐसा कॉल अक्सर होता है, और मुख्य संदिग्ध है vacuum(इसके बाद बस "वैक्यूम")। अनुभव से, कई इस रेक पर कदम रख रहे हैं, और मेरे डेटा एग्रेस्ट सहयोगियों और मुझे अक्सर परिणामों में रेक करना पड़ता है, क्योंकि तब सब कुछ खराब हो जाता है। लेकिन अगर आप खुद वैक्यूम पर ध्यान देते हैं, तो, शायद, ऐसा कोई व्यक्ति नहीं है जो Postgres का उपयोग करेगा, और उसी समय उसके बारे में कुछ भी नहीं जानता था। आखिरकार, वैक्यूम का इतिहास अपेक्षाकृत बहुत पहले शुरू होता है, और इंटरनेट पर आप मेलिंग सूचियों पर वैक्यूम, स्वैच्छिक चर्चाओं के बारे में बहुत सारे पुराने और नए पोस्ट पा सकते हैं। इस तथ्य के बावजूद कि पोस्टग्रेएसक्यूएल के लिए आधिकारिक दस्तावेज में वैक्यूम के विषय का विस्तार से वर्णन किया गया है, नई पोस्ट और नई चर्चाएं जारी रहेंगी। शायद इसीलिए बहुत सारे मिथक, किस्से, डरावनी कहानियां और गलतफहमी वैक्यूम से जुड़ी हैं। इस बीच, वैक्यूम PostgreSQL के सबसे महत्वपूर्ण घटकों में से एक है,और उसका काम सीधे उत्पादकता को प्रभावित करता है। एक रिपोर्ट में वैक्यूम के बारे में पूरी तरह से सब कुछ बताना असंभव है, लेकिन मैं वैक्यूम से संबंधित मुख्य बिंदुओं को प्रकट करना चाहूंगा, जैसे कि इसकी आंतरिक संरचना, इसकी ट्यूनिंग के लिए मुख्य दृष्टिकोण, प्रदर्शन की निगरानी, ​​निगरानी, ​​और क्या करना है जब वैक्यूम मुख्य चीज है सभी परेशानियों का संदेह। खैर, और, ज़ाहिर है, मैं आम मिथकों और गलतफहमी को वैक्यूम से जुड़े लोगों को दूर करना चाहता हूं।मैं आम मिथकों और भ्रांतियों को निर्वात से जोड़ना चाहता हूं।मैं आम मिथकों और भ्रांतियों को निर्वात से जोड़ना चाहता हूं।




! . : , . , . , . , - , .



, , , . , . , , , .



, , ?



: « , . - . , ».


? , . , , , – 100 % ( ). , . - .



, . postgres’ . , . , . , . . - .



, . - , , , . . .



- / : « , ». , . - .



, , , iotop , . - . . .


. . , .



? , - . . . .



- - : « . – autovacuum. ».



, , , : , . . .


, .


  • ( DBA) – , . , . , .
  • , . . . .
  • , shared buffers, ( , ), . . - , shared buffers.
  • . . – .


. . : https://github.com/lesovsky/ConferenceStuff/tree/master/2016.highload


? pgbench . pgbench . . , . . . , .



. , . , , , - . , Postgres, ( , ). , .



, MVCC.


MVCC (Multi-Version Concurrency Control) – "" , Postgres', . . .


  • . . .
  • .
  • , ; ( ).


? . . (snapshot).



: , . , ( COMMIT ROLLBACK).



COMMIT, , . , " ". : PostgreSQL.


. , . - , «delete», «update». .. "" — dead tuples.



. – xmin. , . . . insert, xmin .


, . xmax , .


delete. . — xmax , .


, "" . , xmax . — , Postgres , . - - , .. , .



, ? , , , .


. , . .



«delete», «update» , / . , , - .



, . .



, , , . .



:


  • , , , "", , .
  • shared buffers .
  • bloat , .. — .


. ?


  • -, .
  • Postgres, . . . , , - , .
  • . . .
  • – . . . , .


  • - . , Postgres . , . , .
  • , .
  • , . 32 , . 4294967296. , . , , ( ). .. to prevent wraparound vacuum, . wraparound vacuum — .
  • , , . - . . . , . , .


  • . Postgres , Postgres , , Pentium, - , . - . , , , , - . . .
  • Postgres . . 9.6. , 9.6 , 9.6. ( , Postgres 12)


- . .



-, , .. — cost-based vacuum. .


, : . , ( ) — . .


, . .


. vacuum_cost_page_hit, vacuum_cost_page_miss, vacuum_cost_page_dirty, hit, miss, dirty.


Hit – , , shared buffers, . . . , .


Miss – shared buffers . . , . , shared buffers, (page cache) - . , .


Dirty – , , . .


. vacuum_cost_limit. .


vacuum_cost_delay. , cost limit . cost delay .


, , , . . .



-, . - , , .


  • , 32 , . , , autovacuum_max_workers 10-15 % .
  • autovacuum_naptime. , . 60 . . , 1 . , . , – . . . . , .
  • – , vacuum_cost_limit, , , . , vacuum_cost_limit .


-, , . , . – .


. autovacuum_vacuum_scale_factor. scale factor . - scale_factor 0.2, . . 20 %.


autovacuum_vacuum_threshold. - – 50 . , , .



, - 20 %. , autovacuum_vacuum_threshold , , 1-2-5 %.



, autovacuum_vacuum_scale_factor . . , 1 % — . autovacuum_vacuum_scale_factor 0. autovacuum_vacuum_threshold, . . , , . autovacuum_vacuum_scale_factor , autovacuum_vacuum_threshold.



, . 4-5 , HDD , . HDD . , , . , , , .


SSD . SSD . , .


SSD . , . , (, ), . – , .


NVMe , , . I/O . , . , - – - . , IO, , .



- . vacuum_cost_delay vacuum_cost_limit. . . . . . . – . .


, . , , .



vacuum_cost_delay = 0
vacuum_cost_page_hit = 0
vacuum_cost_page_miss = 5
vacuum_cost_page_dirty = 5
vacuum_cost_limit = 200
--
autovacuum_max_workers = 10
autovacuum_naptime = 1s
autovacuum_vacuum_threshold = 50
autovacuum_analyze_threshold = 50
autovacuum_vacuum_scale_factor = 0.05
autovacuum_analyze_scale_factor = 0.05
autovacuum_vacuum_cost_delay = 5ms
autovacuum_vacuum_cost_limit = -1

SSD , . , , .


: SSD.



. - , - "" , .


, storage parameters. tablespaces, . , .



, — , , , Postgres. , , pgcompacttable pg_repack.


bloat .


, , . – , ( ). .



, . - .


Postgres , , .


pg_stat_activity. , (view) , , .


, , , . . . pg_stat_atctivity ().



, , . , prevent wraparound . (autovacuum_max_workers)– .


– . , , , . — . .



, , pg_stat_progress_vacuum 9.6. .


, , . pg_stat_activity , , , , pg_stat_progress_vacuum .



https://github.com/lesovsky/uber-scripts/blob/master/postgresql/sql/vacuum_activity.sql


, , , . , 50 % . 3 , 3 .


— : , . , .



:


  • . .
  • . cost-based, cost-.
  • – . , , .


! ! . 9.6 , . , , , . - ? , - ?


. 9.6 freeze-, . postgres’ , wraparound vacuum. , . , , . , , . , 9.5 . , . , .


, buffer cache, read?


, autovacuum worker , buffer-. 32 , -. , .


?


, , buffer cache, page cache, , . . , page cache, shared buffers .


, ! , . , . time . 5 1 , . . , 5 100 % CPU, storage. .


– . – . CPU, - . – ? Ubuntu. Ubuntu powersave. . ., , 3,4 GHz, – 1,2. . performance . . , , , , , , . , , .


. , , . . - , . - bloat - , . .


! , . : . - autovacuum_vacuum_scale_factor autovacuum_vacuum_threshold . , , , . , naptime , analyze. Postgres . pg_class reltuples


.


. .


.


dead tuples community , 2ndQuadrant. – . analyze reltuples .


, . – . . , «idle in transactions», , . - . , . . , .


, ?


, MVCC . - , .


reltuples?


. .


( ) . , . : update, insert . . : , . tuples. .


, . . , . . reltuples . , , , , . . . - – . .


, . - ?


पोस्टग्रेज कोड में अलग-अलग फ़ंक्शन हैं जो तालिकाओं के भीतर डेटा के वितरण के बारे में आंकड़े एकत्र करते हैं। यह एक अलग ऑटोवैक्यूम सबसिस्टम है। यह तालिका से सीमित आकार का नमूना डेटा पढ़ता है। और इसके आधार पर डेटा के अनुसार वितरण का निर्माण करता है। और वह इस जानकारी को सिस्टम कैटलॉग pg_statisticया सिस्टम व्यू में सेव करता है pg_statsऔर जब योजनाकार क्वेरी प्लान बनाता है, तो वह इस निर्देशिका की जानकारी पढ़ता है। और उसके आधार पर योजनाएँ बनाता है। और फिर वह सबसे अच्छा एक चुनता है।


All Articles