ฉันกำลังใช้งานแอปพลิเคชันที่มีการเขียนสูง ซึ่งฉันจัดเก็บ 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 เริ่มต้น