دعنا نطفئ الفراغ ؟! أليكسي ليسوفسكي

فك تشفير تقرير 2018 من قبل أليكسي ليسوفسكي "دعونا نوقف الفراغ؟!"


ملاحظة المحرر: يجب دائمًا مقارنة أي توصيات لتغيير المعلمات في تقارير أخرى.


غالبًا ما تنشأ مثل هذه الدعوة عندما تنشأ مشاكل في PostgreSQL ، والمشتبه به الرئيسي هو vacuum(فيما يلي ببساطة "الفراغ"). من التجربة ، يخطو العديد من هذا أشعل النار ، وزملائي في Data Egret غالبًا ما نضطر إلى تسريع العواقب ، لأن كل شيء يصبح أسوأ. ولكن إذا انتبهت إلى الفراغ نفسه ، فربما لا يوجد مثل هذا الشخص الذي سيستخدم Postgres ، وفي الوقت نفسه لم يكن يعرف شيئًا عنه. بعد كل شيء ، يبدأ تاريخ الفراغ منذ فترة طويلة نسبيًا ، وعلى الإنترنت يمكنك العثور على الكثير من المنشورات القديمة والجديدة حول الفراغ ، والمناقشات الضخمة على القوائم البريدية. على الرغم من حقيقة أن موضوع الفراغ موصوف بالتفصيل في الوثائق الرسمية لـ PostgreSQL ، ستستمر المشاركات الجديدة والمناقشات الجديدة في الظهور. ولعل هذا هو سبب ارتباط الكثير من الخرافات والحكايات وقصص الرعب والمفاهيم الخاطئة بالفراغ. وفي الوقت نفسه ، يعد الفراغ أحد أهم مكونات 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 . , , , , . . . - – . .


, . - ?


هناك وظائف منفصلة في رمز postgres تجمع إحصاءات حول توزيع البيانات داخل الجداول. هذا نظام فرعي أوتوماتيكي منفصل. يقرأ بيانات نموذجية ذات حجم محدود من الجدول. وعلى أساسه يبني توزيع البيانات. ويحفظ هذه المعلومات في كتالوج النظام pg_statisticأو في طريقة عرض النظام pg_stats. وعندما يبني المخطط خطط استعلام ، فإنه يقرأ المعلومات من هذا الدليل. وعلى أساسها تضع الخطط. ثم يختار الأفضل.


All Articles