Mari matikan ruang hampa ?! Alexey Lesovsky

Decoding laporan 2018 oleh Alexei Lesovsky "Ayo matikan ruang hampa?!"


Catatan Editor: Setiap rekomendasi untuk mengubah parameter harus selalu dibandingkan dalam laporan lain.


Panggilan seperti itu sering muncul ketika masalah muncul di PostgreSQL, dan tersangka utama adalah vacuum(selanjutnya hanya "vakum"). Dari pengalaman, banyak yang menginjak rake ini, dan kolega Data Egret saya dan saya sering harus mengais konsekuensinya, karena semuanya menjadi lebih buruk. Tetapi jika Anda memperhatikan kekosongan itu sendiri, maka, mungkin, tidak ada orang seperti itu yang akan menggunakan Postgres, dan pada saat yang sama tidak tahu apa-apa tentang dia. Lagi pula, sejarah kekosongan dimulai relatif lama, dan di Internet Anda dapat menemukan banyak posting lama dan baru tentang kekosongan, diskusi yang banyak di milis. Terlepas dari kenyataan bahwa topik vakum dijelaskan secara rinci dalam dokumentasi resmi untuk PostgreSQL, posting baru dan diskusi baru akan terus muncul. Mungkin itu sebabnya banyak mitos, dongeng, cerita horor dan kesalahpahaman dikaitkan dengan kekosongan. Sementara itu, vakum adalah salah satu komponen terpenting dari PostgreSQL,dan karyanya secara langsung mempengaruhi produktivitas. Tidak mungkin untuk mengatakan segalanya tentang vakum dalam satu laporan, tetapi saya ingin mengungkapkan poin-poin penting yang terkait dengan vakum, seperti struktur internal, pendekatan dasar untuk penyetelannya, pemantauan kinerja, pemantauan, dan apa yang harus dilakukan ketika vakum adalah hal utama tersangka semua masalah. Yah, dan, tentu saja, saya ingin menghilangkan mitos dan kesalahpahaman umum yang terkait dengan kekosongan.Saya ingin menghilangkan mitos dan kesalahpahaman umum yang terkait dengan kekosongan.Saya ingin menghilangkan mitos dan kesalahpahaman umum yang terkait dengan kekosongan.




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



, , , . , . , , , .



, , ?



: « , . - . , ».


? , . , , , – 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 . , , , , . . . - – . .


, . - ?


Ada fungsi terpisah dalam kode postgres yang mengumpulkan statistik tentang distribusi data dalam tabel. Ini adalah subsistem autovacuum yang terpisah. Bunyinya data sampel ukuran terbatas dari tabel. Dan atas dasar itu membangun distribusi data. Dan dia menyimpan informasi ini dalam katalog sistem pg_statisticatau dalam tampilan sistem pg_stats. Dan ketika perencana membangun rencana kueri, ia membaca informasi dari direktori ini. Dan atas dasar membuat rencana. Dan kemudian dia memilih yang terbaik.


All Articles