Score:2

ดิสก์ ZFS ที่มี Postgresql แยกส่วนอย่างรวดเร็วด้วยแอปพลิเคชันที่มีการเขียนสูง

ธง in

ฉันกำลังใช้งานแอปพลิเคชันที่มีการเขียนสูง ซึ่งฉันจัดเก็บ Postgresql ไว้บน ZFSโดยทั่วไปมันใช้งานได้ดี แต่ฉันพบว่าพูล ZFS ของฉันมีการแยกส่วนอย่างหนัก ฉันยังสร้างพูล ZFS ใหม่และย้ายข้อมูลไปที่นั่นโดยใช้ zfs send / recv เพื่อจัดเรียงข้อมูลเต็มพื้นที่และลองใช้การตั้งค่าใหม่ที่อาจจำกัดการแยกส่วน แต่ก็ไม่มีประโยชน์

ฉันไม่แน่ใจว่าเกิดอะไรขึ้น แอปพลิเคชันกำลังทำการ UPDATE เป็นส่วนใหญ่ แต่ Postgres ควรสามารถนำพื้นที่ที่มีอยู่แล้วในดิสก์กลับมาใช้ใหม่ได้ ฉันเห็นว่าพื้นที่ที่จัดสรรส่วนใหญ่ยังคงเท่าเดิม ดังนั้นจึงไม่เพิ่มการใช้งานดิสก์ อย่างไรก็ตาม ลักษณะ COW ของ ZFS ดูเหมือนว่าจะทำให้ระบบไฟล์ใช้พื้นที่ว่างและแยกส่วนอย่างหนัก

ดังนั้น หลังจากการเขียนอย่างหนักประมาณ 15 ล้านครั้ง การกระจายตัวของพูล ZFS จึงเปลี่ยนจาก 0% (เริ่มต้น) เป็น 14% นี่ไม่ใช่สิ่งที่ควรจะเป็น:

ขนาดชื่อ ALLOC ฟรี CKPOINT ขยาย Z FRAG CAP DEDUP HEALTH ALTROOT
postgres_data 149G 89.0G 60.0G - - 14% 59% 1.00x ออนไลน์ -
postgres_wal 9.50G 289M 9.22G - - 0% 2% 1.00x ออนไลน์ -

(หมายเหตุ: ตอนที่ฉันเขียนบทความนี้ การกระจายตัวได้เพิ่มขึ้นถึง 16% มีบางอย่างไม่ถูกต้องที่นี่)

หมายเหตุบางประการเกี่ยวกับการใช้งานของฉัน:

  • ฉันมี WAL ในพูลแยกต่างหาก ตามทฤษฎีแล้วการเขียนค่าคงที่ไปยัง WAL จะไม่แยกส่วนที่เก็บข้อมูลหลัก เห็นได้ชัดว่านี่ใช้งานไม่ได้
  • ฉันยังได้พยายามตั้งค่าด้วย ซิงค์=ปิดใช้งาน ตามทฤษฎีที่ว่า ZIL กำลังทำให้ดิสก์ของฉันกลายเป็นชีสสวิส ยังไม่สร้างความแตกต่าง
  • ฉันกำลังใช้อยู่ logbias = ปริมาณงาน. ฉันเคยเห็นคำแนะนำที่ขัดแย้งกันเกี่ยวกับเรื่องนี้ เอกสารอย่างเป็นทางการแนะนำว่าควรใช้สำหรับ postgres ปริมาณงาน, ในขณะที่ คู่มือที่มีประโยชน์มาก บอกว่า "logbias=throughput จะแยกส่วนทุกๆ เดี่ยว บล็อก เขียนลงในพูลของคุณ" ดังนั้น ในกลุ่มเริ่มต้นของฉัน (ตอนนี้ไม่ได้ใช้งานแล้ว เนื่องจากมีการแยกส่วนมากถึง 80%) ฉันจึงใช้ logbias = เวลาแฝง แต่นั่นทำให้ดิสก์ทั้งหมดแยกส่วนอย่างชัดเจน
  • ฉันใช้ ซิงค์=9 เนื่องจากดิสก์จริง (นี่คือที่เก็บข้อมูลบนคลาวด์) มีขนาดบล็อก 512

การตั้งค่า zfs ทั้งหมดของฉัน:

ชื่อทรัพย์สิน มูลค่า แหล่งที่มา
postgres_data/ระบบไฟล์ประเภทข้อมูล -
postgres_data/การสร้างข้อมูล อังคาร 17 พฤษภาคม 23:36 2565 -
postgres_data/data ใช้ 88.9G -
postgres_data/ข้อมูลที่มีอยู่ 55.4G -
postgres_data/data อ้างอิง 88.9G -
postgres_data/data อัตราส่วนการบีบอัด 1.98x -
postgres_data/data ติดตั้ง ใช่ -
postgres_data/data โควต้าไม่มีค่าเริ่มต้น
postgres_data/data การจองไม่มีค่าเริ่มต้น
postgres_data/data recordsize 8K สืบทอดมาจาก postgres_data
postgres_data/data mountpoint /var/lib/postgresql ในเครื่อง
postgres_data/data sharenfs เป็นค่าเริ่มต้น
postgres_data/data checksum เป็นค่าเริ่มต้น
postgres_data/การบีบอัดข้อมูล zstd สืบทอดมาจาก postgres_data
postgres_data/data atime off สืบทอดมาจาก postgres_data
postgres_data/data อุปกรณ์เป็นค่าเริ่มต้น
postgres_data/data exec เป็นค่าเริ่มต้น
postgres_data/data setuid เป็นค่าเริ่มต้น
postgres_data/data แบบอ่านอย่างเดียวเป็นค่าเริ่มต้น
postgres_data/data แบ่งโซนเป็นค่าเริ่มต้น
postgres_data/data snapdir ค่าเริ่มต้นที่ซ่อนอยู่
postgres_data/data aclmode ละทิ้งค่าเริ่มต้น
postgres_data/data aclinherit ค่าเริ่มต้นที่จำกัด
postgres_data/data createtxg 619 -
postgres_data/data สามารถเมาท์ตามค่าเริ่มต้น
postgres_data/data xattr sa สืบทอดมาจาก postgres_data
postgres_data/data คัดลอก 1 ค่าเริ่มต้น
postgres_data/data รุ่น 5 -
postgres_data/data utf8only off -
postgres_data/data normalization ไม่มี -
postgres_data/data casesensitivity ละเอียดอ่อน -
postgres_data/data vscan ปิดค่าเริ่มต้น
postgres_data/data nbmand ปิดค่าเริ่มต้น
postgres_data/datasharemb ปิดค่าเริ่มต้น
postgres_data/data refquota ไม่มีค่าเริ่มต้น
postgres_data/data reservation ไม่มีค่าเริ่มต้น
postgres_data/data guid 10551245409099064921 -
postgres_data/data แคชหลักเป็นค่าเริ่มต้นทั้งหมด
postgres_data/data แคชรองเริ่มต้นทั้งหมด
postgres_data/data ที่ใช้โดย snapshots 0B -
postgres_data/ข้อมูลที่ใช้โดยชุดข้อมูล 88.9G -
postgres_data/ข้อมูลที่เด็กใช้ 0B -
postgres_data/data ที่ใช้โดย rereservation 0B -
postgres_data/data logbias ปริมาณงานในเครื่อง
postgres_data/data objsetid 595 -
postgres_data/data dedup เป็นค่าเริ่มต้น
postgres_data/data mlslabel ไม่มีค่าเริ่มต้น
postgres_data/การซิงค์ข้อมูลปิดใช้งานในเครื่อง
postgres_data/data dnodesize ค่าเริ่มต้นดั้งเดิม
postgres_data/data refcompressratio 1.98x -
postgres_data/ข้อมูลที่เขียน 88.9G -
postgres_data/data ใช้ตรรกะ 176G -
postgres_data/data logicalreferenced 176G -
postgres_data/data volmode ค่าเริ่มต้น
postgres_data/data filesystem_limit ไม่มีค่าเริ่มต้น
postgres_data/data snapshot_limit ไม่มีค่าเริ่มต้น
postgres_data/data filesystem_count ไม่มีค่าเริ่มต้น
postgres_data/data snapshot_count ไม่มีค่าเริ่มต้น
postgres_data/data snapdev ค่าเริ่มต้นที่ซ่อนอยู่
postgres_data/data acltype ปิดค่าเริ่มต้น
postgres_data/data บริบทไม่มีค่าเริ่มต้น
postgres_data/data fscontext ไม่มีค่าเริ่มต้น
postgres_data/data defcontext ไม่มีค่าเริ่มต้น
postgres_data/data rootcontext ไม่มีค่าเริ่มต้น
postgres_data/data relatime ปิดค่าเริ่มต้น
postgres_data/data redundant_metadata ส่วนใหญ่สืบทอดมาจาก postgres_data
postgres_data/data overlay เป็นค่าเริ่มต้น
postgres_data/การเข้ารหัสข้อมูลเป็นค่าเริ่มต้น
postgres_data/data keylocation ไม่มีค่าเริ่มต้น
postgres_data/data รูปแบบคีย์ไม่มีค่าเริ่มต้น
postgres_data/data pbkdf2iters 0 เริ่มต้น
postgres_data/data special_small_blocks 0 เริ่มต้น
Score:1
ธง ng

เศษ ไม่ได้หมายความตามที่คุณคิด

เป็นตัวแทนของความแตกแยกของพื้นที่ว่างของคุณ ไม่ใช่วิธีแสดงว่าข้อมูลจริงของคุณแยกส่วนอย่างไร

ในทางปฏิบัติ ไม่ต้องกังวลกับค่านี้ เว้นแต่ว่าคุณมีพื้นที่จำกัดจริงๆ หรือประสบปัญหาด้านประสิทธิภาพ

คุณควรสำรองการเปลี่ยนแปลงบางส่วน เนื่องจากอาจส่งผลเสียต่อปริมาณงานจริงของคุณ

ขนาดเร็กคอร์ด 8k ขนาดเล็กยังมีส่วนช่วยในเรื่องนี้ด้วย (พิจารณาค่าเริ่มต้น 128k หรือบางอย่างที่ใหญ่กว่า 8k)

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

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

in flag
ใช่ ฉันทราบดีว่าเป็นการแยกส่วนของพื้นที่ว่าง ฉันประหลาดใจที่มันสูงขึ้นมาก ฉันเคยมีปัญหาด้านความเร็วมาก่อนในการอัปเดตตารางหลักของฉัน และฉันก็มั่นใจ (อาจจะไม่ถูกต้อง?) ว่าการกระจายตัวของพื้นที่ว่างมีส่วนทำให้เกิดสิ่งนี้ RE: ขนาดเรคคอร์ด มันควรจะตรงกับขนาดหน้าของ PostgreSQL นั่นเป็นปัญหาหรือไม่?
ewwhite avatar
ng flag
โปรดดูลิงก์ฉันไม่แนะนำค่าขนาดบันทึก ZFS 8k สำหรับ Postgres

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา