Postgres DISK IO สูงมาก ฉันจะทำอย่างไรเพื่อลดทันที?


13

ฉันรู้ว่าดิสก์เร็วกว่าที่ใช้อยู่จะช่วยได้ แต่จะใช้เวลานานกว่าและฉันพยายามใช้มาตรการฉุกเฉินเพื่อลดดิสก์ IO atop กำลังรายงานการใช้ DSK บนสีแดงเกือบตลอดเวลา นี่สำหรับ postgres 8.3

การตั้งค่า shared_buffers ของฉันอยู่ที่ 24MB แม้ว่าเซิร์ฟเวอร์จะมี RAM 16 GB ซึ่งไม่ได้ใช้อย่างเต็มที่ ความคิดแรกของฉันคือการให้ฐานข้อมูล ram มากที่สุดเท่าที่จะทำได้ แต่ฉันไม่แน่ใจว่าจะทำอย่างไร (นี่เป็นเซิร์ฟเวอร์ฐานข้อมูลเฉพาะ)

วิธีแก้ปัญหาใด ๆ ที่ไม่ต้องการการรีสตาร์ทจะดีกว่า แต่ฉันจะใช้สิ่งที่ฉันจะได้รับในจุดนี้

ขอบคุณ!


คำถามนี้ควรถามที่ Serverfault
Francisco R

คุณสามารถลองเพิ่มshared_buffersในไฟล์ config postgresql.conf การเปลี่ยนแปลงนี้ต้องเริ่มต้นใหม่ นอกจากนี้คุณอาจต้องเพิ่มมูลค่าของ/proc/sys/kernel/shmmaxก่อนหน้านั้น
เลด

คำตอบ:


12

การตั้งค่า shared_buffers 24MB เป็นค่าเริ่มต้นแบบอนุรักษ์นิยมฉันต้องบอกว่ามันต้องสูงกว่านี้มากสำหรับฐานข้อมูลเฉพาะที่มี 16GB of RAM พร้อมใช้งาน แต่ใช่คุณจะต้องรีสตาร์ทเซิร์ฟเวอร์เพื่อปรับขนาด http://wiki.postgresql.org/wiki/Performance_Optimizationเป็นจุดเริ่มต้นที่ดีสำหรับแนวทางการกำหนดค่าประสิทธิภาพ การตั้งค่า shared_buffers เป็น 4GB หรือ 6GB จะดูสมเหตุสมผลกว่า

โปรดทราบว่าใน linux คุณต้องปรับการตั้งค่า kernel.shmmax sysctl (ใน /etc/sysctl.conf หรือเพียงแค่เขียน / proc / sys / kernel / shmmax) เพื่อจัดสรรบล็อกของหน่วยความจำที่แชร์มากนี้ ถ้าคุณทำไม่ได้คุณจะได้รับข้อผิดพลาดที่ระบุจำนวนที่ร้องขอคุณจะต้องตั้งค่า kernel.shmmax ให้สูงกว่านั้น

เนื่องจากคุณมีหน่วยความจำจำนวนมากคุณอาจพิจารณาตั้งค่า work_mem เริ่มต้นให้สูงขึ้นซึ่งจะทำให้สิ่งต่าง ๆ เช่นเรียงลำดับและแฮช (กลุ่ม / คำสั่ง / แตกต่างกันเป็นต้น) มักจะทำงานในหน่วยความจำแทนการใช้ไฟล์ temp คุณไม่จำเป็นต้องรีสตาร์ทเซิร์ฟเวอร์เพื่อทำสิ่งนี้เพียงอัปเดตไฟล์กำหนดค่าโหลดบริการใหม่และเซสชันใหม่จะได้รับการตั้งค่าใหม่ หน่วยความจำงานเริ่มต้นสำหรับเซสชันคือ 1MB คุณสามารถคำนวณจำนวนสูงสุดที่อาจใช้ในครั้งเดียวwork_mem * max_client_connectionsและประเมินผลกระทบที่จะเกิดขึ้น

นอกจากนี้คุณควรเพิ่ม effective_cache_size เพื่อระบุตัววางแผนว่าเลเยอร์ FS เคอร์เนลน่าจะแคชหลายหน้าในหน่วยความจำนอกบัฟเฟอร์ที่แชร์ของ postgresql

หวังว่าสิ่งนี้จะทำให้คุณเริ่มต้นได้ดี


โพสต์ที่ดีมีเพียงประมาณการการใช้หน่วยความจำของคุณเท่านั้นที่อันตราย work_mem คือการดำเนินการสูงสุดต่อการเรียงลำดับ / แฮชดังนั้นเคียวรีที่ซับซ้อนสามารถมีการดำเนินการเรียงลำดับ / แฮชหลายรายการและสามารถใช้ work_mem มากกว่าหนึ่งรายการ
Eelke

ขอบคุณมันช่วยได้มาก! การเปลี่ยนแปลงที่สำคัญอีกประการหนึ่งคือ checkpoint_segment และ checkpoint_completion_target ซึ่งมีผลกระทบอย่างมากต่อการใช้งานดิสก์และประสิทธิภาพโดยรวมของฉัน วิกฤตหันไป ( wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server )
Harel


2

นอกเหนือจากคำแนะนำที่ให้ไว้ที่นี่คุณอาจต้องการตรวจสอบการตั้งค่าวัคซีนอัตโนมัติของคุณ โดยค่าเริ่มต้นมันจะทริกเกอร์หลังจากอัพเดตประมาณ 50 ครั้งและหากฐานข้อมูลของคุณทำการอัพเดต / แทรกจำนวนมากสิ่งนี้สามารถทริกเกอร์คำสั่งสูญญากาศในปริมาณที่ไม่จำเป็นซึ่งจะสร้าง IO จำนวนมาก


1

ในระบบที่เป็นมากใกล้สุดที่ I / O ที่ผ่านในระหว่างการดำเนินงานปกติคุณอาจต้องการที่จะเพิ่ม checkpoint_completion_target เพื่อลด I / O โหลดจากจุดตรวจ ข้อเสียของสิ่งนี้คือจุดตรวจที่ยืดออกมีผลต่อเวลาการกู้คืนเนื่องจากเซ็กเมนต์ WAL เพิ่มเติมจะต้องถูกเก็บไว้รอบ ๆ เพื่อใช้ในการกู้คืนที่เป็นไปได้

ดูเพิ่มเติมได้ที่นี่


0

หาก diskio ของ postgresql นั้นสูงมากคุณควรตรวจสอบคำสั่งที่รันอยู่โดยเฉพาะอย่างยิ่งสำหรับคำสั่งทำ "sort on disk" และตั้งค่าดัชนีที่เหมาะสม

เพียง google สำหรับ "การปรับประสิทธิภาพของ Postgresql" คุณจะพบว่ามีปัญหามากพอที่จะเริ่ม

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