Puncte:2

Disc ZFS cu fragmentare Postgresql rapidă cu aplicația grea de scriere

drapel in

Rulez o aplicație cu multă scriere în care îmi stochez Postgresql pe ZFS.În general, funcționează bine, dar constat că piscina mea ZFS se fragmentează puternic. Am creat chiar și un nou pool ZFS și am mutat datele acolo folosind zfs send / recv, pentru a defragmenta întregul spațiu și a încerca câteva setări noi care ar putea limita fragmentarea, dar fără rezultat.

Nu sunt sigur ce se întâmplă. Aplicația face în mare parte ACTUALIZĂRI, dar Postgres ar trebui să poată reutiliza spațiul deja de pe disc (deoarece face tuple moarte și le aspiră automat, va reutiliza acele pagini). Văd că spațiul alocat rămâne în mare parte același, deci nu crește utilizarea discului. Cu toate acestea, natura COW a ZFS pare să facă sistemul de fișiere să utilizeze spațiul liber și să îl fragmenteze puternic.

Deci, după aproximativ 15 mn de scrieri grele, fragmentarea pool-ului ZFS a trecut de la 0% (inițial) la 14%. Nu poate fi așa cum ar trebui să fie lucrurile:

NUME DIMENSIUNE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
postgres_data 149G 89.0G 60.0G - - 14% 59% 1.00x ONLINE -
postgres_wal 9.50G 289M 9.22G - - 0% 2% 1.00x ONLINE -

(Notă: în timpul în care am scris această postare, fragmentarea a crescut la 16%. Există ceva care nu este în regulă aici.)

Câteva note despre implementarea mea:

  • Am WAL-ul pe un pool separat, în teoria că scrierile constante în WAL nu vor fragmenta depozitul principal de date. Se pare că acest lucru nu funcționează.
  • Am încercat și eu să-l configurez sincronizare=dezactivat pe teoria că ZIL-ul îmi transformă discul în brânză elvețiană. De asemenea, nu face diferența.
  • Folosesc momentan logbias=debit. Am văzut sfaturi contradictorii în acest sens; documentele oficiale sugerează că pentru postgres ar trebui să se folosească debitului, in timp ce un ghid foarte util spune că „logbias=debitul va fragmenta fiecare. Singur. Bloc. Scris în pool-ul tău”. Deci, în pool-ul meu inițial (acum nu mai este folosit, pentru că s-a fragmentat până la 80%), am folosit inițial logbias=latenta dar asta a fragmentat în mod clar și întregul disc.
  • eu folosesc asincron=9 deoarece discul fizic (aceasta este stocarea în cloud) are o dimensiune de bloc de 512.

Setările mele complete zfs:

NUME PROPRIETATE VALOARE SURSA
sistem de fișiere de tip postgres_data/data -
postgres_data/data creation marți, 17 mai, 23:36 2022 -
postgres_data/date utilizate 88.9G -
postgres_data/date disponibile 55.4G -
date_postgres/date referite la 88.9G -
postgres_data/data compressratio 1,98x -
postgres_data/data montat da -
postgres_data/data quota nici unul implicit
postgres_data/data rezervare nici unul implicit
postgres_data/data recordsize 8K moștenit de la postgres_data
postgres_data/data mountpoint /var/lib/postgresql local
postgres_data/data sharenfs dezactivat implicit
postgres_data/data checksum implicit
postgres_data/data compression zstd moștenit de la postgres_data
postgres_data/data atime off moștenit de la postgres_data
postgres_data/dispozitive de date în mod implicit
postgres_data/data exec implicit
postgres_data/data setuid implicit
postgres_data/data readonly off default
postgres_data/data zoned off implicit
postgres_data/data snapdir implicit ascuns
postgres_data/data aclmode ignorare implicită
postgres_data/data aclinherit restricționat implicit
postgres_data/data createtxg 619 -
postgres_data/data poate monta implicit
postgres_data/data xattr sa moștenit de la postgres_data
postgres_data/data copiează 1 implicit
postgres_data/data versiunea 5 -
postgres_data/data utf8only off -
postgres_data/data normalization none -
postgres_data/data casesensibilitate -
postgres_data/data vscan dezactivat implicit
postgres_data/data nbmand dezactivat implicit
postgres_data/data sharesmb dezactivat implicit
postgres_data/data refquota nici unul implicit
postgres_data/data refreservation nici unul implicit
postgres_data/data guid 10551245409099064921 -
postgres_data/data primarycache toate implicite
postgres_data/data secondarycache toate implicite
postgres_data/data usedbysnapshots 0B -
postgres_data/data usedbydataset 88.9G -
postgres_data/date usedbychildren 0B -
postgres_data/date usedbyrefreservation 0B -
debitul postgres_data/data logbias local
postgres_data/data objsetid 595 -
postgres_data/data dedup dezactivat implicit
postgres_data/data mlslabel nici unul implicit
sincronizarea postgres_data/data dezactivată local
postgres_data/data dnodesize moștenire implicită
postgres_data/data refcompressratio 1,98x -
postgres_data/data scris 88.9G -
postgres_data/data logicused 176G -
postgres_data/data logicalreferenced 176G -
implicit postgres_data/data volmode
postgres_data/data filesystem_limit niciunul implicit
postgres_data/data snapshot_limit niciunul implicit
postgres_data/data filesystem_count niciunul implicit
postgres_data/data snapshot_count niciunul implicit
postgres_data/data snapdev implicit ascuns
postgres_data/data acltype dezactivat implicit
postgres_data/data context niciunul implicit
postgres_data/data fscontext niciunul implicit
postgres_data/data defcontext niciunul implicit
postgres_data/data rootcontext niciunul implicit
postgres_data/data relatime dezactivat implicit
postgres_data/data redundant_metadata cele mai moștenite de la postgres_data
suprapunerea postgres_data/data în mod implicit
criptare postgres_data/data dezactivată implicit
postgres_data/data keylocation nici unul implicit
postgres_data/data keyformat niciunul implicit
postgres_data/data pbkdf2iters 0 implicit
postgres_data/data special_small_blocks 0 implicit
Puncte:1
drapel ng

FRAG nu înseamnă ceea ce crezi că înseamnă.

Este o reprezentare a cât de fragmentat este spațiul tău liber. Nu este o modalitate de a arăta cât de fragmentate sunt datele dvs. reale.

În practică, nu vă faceți griji cu privire la această valoare decât dacă sunteți într-adevăr limitat de spațiu sau întâmpinați o problemă de performanță.

Ar trebui să renunțați la unele dintre modificări, deoarece acestea pot avea un impact negativ asupra volumului de lucru real.

Dimensiunea mică a înregistrărilor de 8k contribuie, de asemenea, la acest lucru (luați în considerare valoarea implicită 128k sau ceva mai mare decât 8k)

Vedea: https://utcc.utoronto.ca/~cks/space/blog/solaris/ZFSZpoolFragmentationMeaning

Vedea: https://bun.uptrace.dev/postgres/tuning-zfs-aws-ebs.html#zfs-recordsize

drapel in
Corect, sunt conștient de faptul că este fragmentarea spațiului liber. Sunt surprins că se ridică atât de sus. Am avut câteva probleme de viteză înainte cu actualizarea tabelului meu principal și am fost convins (poate incorect?) că fragmentarea spațiului liber contribuie la aceasta. RE: recordsize, este menit să se potrivească cu dimensiunea paginii PostgreSQL. Este o problemă?
ewwhite avatar
drapel ng
Vă rugăm să vedeți linkurile.Nu recomand o valoare a dimensiunii înregistrării ZFS de 8k pentru Postgres.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.