การกำหนดค่า PostgreSQL สำหรับประสิทธิภาพการเขียน


30

เซิร์ฟเวอร์ PostgreSQL ของฉันหนึ่งโฮสต์หลายฐานข้อมูล (1-3) ที่ได้รับกระแสข้อมูลคงที่ ข้อมูลไม่ได้ถูกจัดโครงสร้างโดยเฉพาะอย่างยิ่งมันเป็นจำนวนเวลาปัจจุบันและความหลากหลายของข้อมูลที่สังเกตสำหรับการทันทีนั้น อัตราข้อมูลค่อนข้างสูง มันทำงานได้ประมาณกิกะไบต์ต่อวันสำหรับฐานข้อมูลหนึ่งประมาณหนึ่งในสิบของฐานข้อมูลอื่น ฉันไม่คาดหวังว่าอัตรานี้จะเพิ่มขึ้น ประสิทธิภาพการอ่านมีความสำคัญต่ำกว่ามากและเป็นที่ยอมรับในปัจจุบัน

ในบันทึกฉันมีข้อความนี้:

LOG:  checkpoints are occurring too frequently (15 seconds apart)
HINT:  Consider increasing the configuration parameter "checkpoint_segments".

ค่านี้ตั้งไว้ที่ 16 pgtuneซึ่งเป็นมารยาทของ

การตั้งค่าใดที่ฉันควรพิจารณาเพื่อปรับปรุงประสิทธิภาพการเขียน ฉันต้องการที่จะรักษาความปลอดภัยให้มากที่สุด เมื่อพิจารณาจากปริมาณข้อมูลที่เข้ามาฉันสามารถยอมรับการสูญเสียข้อมูลล่าสุดในความล้มเหลวตราบใดที่ข้อมูลจำนวนมากไม่เสียหาย

แก้ไข: ฉันใช้ PostgreSQL 9.0 ในตอนนี้ แต่ฉันวางแผนที่จะอัพเกรดเป็น 9.1 ฉันไม่ได้โพสต์รายละเอียดฮาร์ดแวร์เพราะในขณะที่ฉันรับทราบความสำคัญของพวกเขาในที่สุดฉันจะต้องทำให้การเพิ่มประสิทธิภาพนี้ในหลายเครื่องด้วยฮาร์ดแวร์ที่หลากหลายมาก หากฮาร์ดแวร์มีความสำคัญต่อคำตอบโปรดให้ข้อมูลทั่วไปเพื่อให้ฉันสามารถใช้คำตอบกับเครื่องที่มีการกำหนดค่าฮาร์ดแวร์ที่แตกต่างกัน


คุณสามารถโพสต์เวอร์ชั่นและรายละเอียดบางอย่างเกี่ยวกับฮาร์ดแวร์จัดเก็บของคุณ
แจ็คดักลาส

คุณเพิ่มขึ้นcheckpoint_segmentsตามที่แนะนำหรือไม่ เกิดอะไรขึ้น?
a_horse_with_no_name

3
อีกทรัพยากรที่ดีเยี่ยมสำหรับชนิดของคำถามเหล่านี้คือเกรกอรี่สมิ ธหนังสือของPostgreSQL 9.0 ที่มีประสิทธิภาพสูง
jp

คำตอบ:


24

1 Gigabyte ต่อวันไม่สูงมากนักสำหรับการเขียน กระจายออกไปตลอดทั้งวันซึ่งจะออกมาประมาณ 50kbytes ต่อวินาที ธัมบ์ไดรฟ์ USB ช้าสามารถจัดการได้ ฉันคิดว่ามันจะระเบิดได้มากกว่านี้ ในฐานะที่เป็น a_horse_with_no_name แนะนำให้เพิ่มกลุ่มด่าน 100 หรือมากกว่านั้นไม่ใช่เรื่องธรรมดา

จากนั้นเพิ่มค่าของคุณcheckpoint_timeoutเป็น 1 ชั่วโมงรวมถึงดูการเพิ่มของคุณcheckpoint_completion_targetเป็นบางสิ่งบางอย่างที่ใกล้เคียงกับ 1.0 (100%) เป้าหมายที่เสร็จสมบูรณ์จะบอกให้ PostgreSQL ทราบว่าจะเขียนพื้นหลังอย่างไรเพื่อให้เสร็จสมบูรณ์ x% ก่อนที่จะเรียกใช้จุดตรวจสอบซึ่งบังคับให้ข้อมูลทั้งหมดถูกเขียนออกมาในครั้งเดียวจาก WAL และจะทำให้ระบบช้าลงขณะรวบรวมข้อมูล

เหตุผลที่คุณไม่ได้ตั้งค่าไว้ที่ 100% ก็เพราะว่ามันเป็นเรื่องธรรมดาที่จะเขียนบล็อกเดียวกันมากกว่าหนึ่งครั้งและการหน่วงเวลา WAL เขียนไปยังร้านค้าหลักคุณป้องกันไม่ให้มีการเขียนบล็อกเดียวกันสองครั้งโดยไม่มีเหตุผล

หากไม่น่าเป็นไปได้ที่คุณจะเขียนลงในบล็อกเดียวกันมากกว่าหนึ่งครั้งก่อนที่จะหมดเวลาของคุณนั่นคือทั้งหมดที่คุณทำคือการแทรกการตั้งค่าให้สูงพอสมควรที่จะเพิ่มเป็น 0.9 หรือมากกว่านั้น สิ่งที่เลวร้ายที่สุดที่จะเกิดขึ้นคือคุณจะต้องเขียนบ่อยกว่าที่คุณอาจต้องการ แต่ผลกระทบของจุดตรวจจะลดลงอย่างมาก


ปริมาณการเขียนนั้นเกือบจะเหมือนกันทั้งหมด: นี่คือแหล่งข้อมูลสำหรับซอฟต์แวร์ตรวจสอบฮาร์ดแวร์ที่โพลทุกวินาทีอย่างต่อเนื่อง 24x7 ฉันสามารถคำนวณอัตราข้อมูลที่แน่นอน แต่มันค่อนข้างผันผวนเมื่อโปรแกรมเมอร์เพิ่มและลบจุดตรวจสอบ
Daniel Lyons

1
ถ้าอัตราคือ 1G ต่อวันและมันราบรื่นระบบย่อยเกือบทุกระบบสามารถรองรับการเขียนข้อมูลได้คุณแค่ต้องการทำให้มันราบรื่นซึ่งเป้าหมายการตรวจสอบเสร็จสมบูรณ์จะถูกตั้งค่าไว้ใกล้ 1.0 และการหมดเวลาของจุดตรวจสอบที่ยาวนาน
Scott Marlowe

10

ในระบบ 'เขียนหนัก' มากคุณอาจถูก จำกัด ด้วยอัตรา WAL ที่สามารถเขียนได้ในระหว่างกิจกรรมที่มีผู้ใช้มาก

หากคุณสามารถ "ยอมรับการสูญเสียข้อมูลล่าสุดบางอย่างในความล้มเหลว" คุณสามารถปิดการส่งข้อมูลที่:

อาจเป็นทางเลือกที่มีประโยชน์เมื่อประสิทธิภาพมีความสำคัญมากกว่าความแน่นอนที่แน่นอนเกี่ยวกับความทนทานของธุรกรรม

หากคุณสามารถเปลี่ยนฮาร์ดแวร์ได้คุณสามารถพิจารณาสิ่งเหล่านี้เพื่อปรับการเขียนให้เหมาะสม:

  • RAID10 มากกว่า RAID5
  • แกนหมุนมาก (อาจหมายถึง 2.5 "แทนที่จะเป็น 3.5" เป็นต้น)
  • SAS ผ่าน SATA
  • 15K ไดรฟ์มากกว่า 10K
  • SSD

--edit

จากความคิดเห็นของคุณเกี่ยวกับคำตอบที่ยอดเยี่ยมของ @ Scott : "ปริมาณการเขียนนั้นเกือบจะเหมือนกันทั้งหมด" และอัตราข้อมูลโดยนัยคือ "50kbytes ต่อวินาที" ฉันสงสัยว่าคุณต้องทำทุกอย่างที่เสี่ยงต่อการสูญหายของข้อมูล อาจช่วยให้ทราบว่าพารามิเตอร์การกำหนดค่าอื่น ๆ ของคุณถูกตั้งค่าไว้ที่ใด


3
หากเรื่องประสิทธิภาพการเขียนตัวควบคุมแบตเตอรี่สำรองระหว่างระบบปฏิบัติการและฮาร์ดไดรฟ์ที่ปั่นอยู่สามารถสร้างความแตกต่างได้อย่างมาก
Scott Marlowe

5

คุณอาจตรวจสอบความถี่ / ขนาดของการผูกพันของคุณ: ฉันพบปัญหาเมื่อเร็ว ๆ นี้ซึ่งฉันพยายามอัปเดต> มากกว่า 1 ล้านบันทึกในธุรกรรมเดียว ฉันได้รับข้อความบันทึกที่คล้ายกับข้อความที่ OP อธิบาย แต่ธุรกรรมไม่สามารถดำเนินการได้หลังจากผ่านไปหลายชั่วโมง เมื่อฉันทำลายการเขียนลงในการทำธุรกรรมขนาดเล็กหลายรายการ (10,000 บันทึกหรือมากกว่านั้น) เวลาทั้งหมดที่ต้องใช้ลดลงไปประมาณ 15 นาที

สิ่งที่ฉันคิดว่าเกิดขึ้นคือ Postgres ใช้เวลาเขียนบันทึกที่checkpoint_timeout มากล่วงเลยไปก่อนที่จะสามารถบันทึกข้อมูลได้อย่างมาก ฉันไม่แน่ใจว่าคำอธิบายนั้นยังคงอยู่หรือไม่ ฉันยังคงได้รับคำเตือน แต่การเขียนทั้งหมดจะได้รับการประมวลผลในที่สุด อย่างไรก็ตามฉันต้องการ (และพบ) การแก้ปัญหาแบบเป็นโปรแกรมแทนที่จะต้องมีการกำหนดค่าฐานข้อมูลใหม่

ดูที่http://www.postgresql.org/docs/9.3/static/wal-configuration.html

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.