ฉันมีอินสแตนซ์ PostgreSQL 9.2 ที่ทำงานบน RHEL 6.3, เครื่อง 8-core พร้อม RAM ขนาด 16GB เซิร์ฟเวอร์ทุ่มเทให้กับฐานข้อมูลนี้ เนื่องจาก postgresql.conf เริ่มต้นค่อนข้างอนุรักษ์นิยมเกี่ยวกับการตั้งค่าหน่วยความจำฉันคิดว่าอาจเป็นความคิดที่ดีที่จะอนุญาตให้ Postgres ใช้หน่วยความจำเพิ่มเติม เพื่อประหลาดใจของฉันคำแนะนำต่อไปนี้ในwiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Serverชะลอตัวลงอย่างมากในทางปฏิบัติทุกแบบสอบถามที่ฉันเรียกใช้
ฉันยังลองใช้ pgtune ซึ่งให้คำแนะนำต่อไปนี้พร้อมปรับพารามิเตอร์เพิ่มเติม แต่นั่นก็ไม่ได้เปลี่ยนแปลงอะไรเลย มันแสดงให้เห็น shared_buffers ขนาด 1/4 ของ RAM ซึ่งดูเหมือนจะสอดคล้องกับคำแนะนำที่อื่น (และโดยเฉพาะกับ PG wiki โดยเฉพาะ)
default_statistics_target = 50
maintenance_work_mem = 960MB
constraint_exclusion = on
checkpoint_completion_target = 0.9
effective_cache_size = 11GB
work_mem = 96MB
wal_buffers = 8MB
checkpoint_segments = 16
shared_buffers = 3840MB
max_connections = 80
ฉันพยายามทำดัชนีฐานข้อมูลทั้งหมดใหม่หลังจากเปลี่ยนการตั้งค่า (โดยใช้reindex database
) แต่ก็ไม่ได้ช่วยอะไร ฉันเล่นกับ shared_buffers และ work_mem การเปลี่ยนจากค่าเริ่มต้นที่อนุรักษ์นิยมอย่างค่อยเป็นค่อยไป (128k / 1MB) ค่อยๆลดลงประสิทธิภาพ
ฉันวิ่งไปซักEXPLAIN (ANALYZE,BUFFERS)
สองสามข้อและผู้ร้ายดูเหมือนว่าการเข้าร่วมแฮชช้ากว่ามาก ทำไมฉันถึงไม่ชัดเจน
เพื่อให้ตัวอย่างเฉพาะฉันมีแบบสอบถามต่อไปนี้ มันทำงานใน ~ 2100ms ในการกำหนดค่าเริ่มต้นและ ~ 3300ms ในการกำหนดค่าด้วยขนาดบัฟเฟอร์ที่เพิ่มขึ้น:
select count(*) from contest c
left outer join contestparticipant cp on c.id=cp.contestId
left outer join teammember tm on tm.contestparticipantid=cp.id
left outer join staffmember sm on cp.id=sm.contestparticipantid
left outer join person p on p.id=cp.personid
left outer join personinfo pi on pi.id=cp.personinfoid
where pi.lastname like '%b%' or pi.firstname like '%a%';
EXPLAIN (ANALYZE,BUFFERS)
สำหรับแบบสอบถามด้านบน:
- บัฟเฟอร์เริ่มต้น: http://explain.depesz.com/s/xaHJ
- บัฟเฟอร์ใหญ่ขึ้น: http://explain.depesz.com/s/Plk
คำถามคือทำไมฉันสังเกตการลดลงประสิทธิภาพเมื่อฉันเพิ่มขนาดบัฟเฟอร์? เครื่องไม่มีหน่วยความจำไม่เพียงพอ การจัดสรรหากหน่วยความจำที่แชร์ใน OS คือ ( shmmax
และshmall
) ตั้งเป็นค่าที่มีขนาดใหญ่มากนั่นไม่น่าจะมีปัญหา ฉันไม่ได้รับข้อผิดพลาดในบันทึก Postgres เช่นกัน ฉันกำลังเรียกใช้ autovacuum ในการกำหนดค่าเริ่มต้น แต่ฉันไม่คิดว่ามันจะเกี่ยวข้องกับมัน การค้นหาทั้งหมดถูกเรียกใช้บนเครื่องเดียวกันห่างกันเพียงไม่กี่วินาทีเพียงแค่เปลี่ยนการกำหนดค่า (และเริ่มการทำงาน PG ใหม่)
แก้ไข: ฉันเพิ่งพบข้อเท็จจริงที่น่าสนใจเป็นพิเศษ: เมื่อฉันทำการทดสอบเดียวกันกับ iMac (OSX 10.7.5) กลางปี 2010 ของฉันด้วย Postgres 9.2.1 และ 16GB RAM ฉันไม่พบว่าการทำงานช้าลง โดยเฉพาะ:
set work_mem='1MB';
select ...; // running time is ~1800 ms
set work_mem='96MB';
select ...' // running time is ~1500 ms
เมื่อฉันทำแบบสอบถามเดียวกันทั้งหมด (อย่างใดอย่างหนึ่งด้านบน) ด้วยข้อมูลเดียวกันบนเซิร์ฟเวอร์ฉันได้รับ 2100 ms กับ work_mem = 1MB และ 3200 ms ด้วย 96 MB
Mac มี SSD ดังนั้นจึงเข้าใจได้เร็วขึ้น แต่ก็แสดงพฤติกรรมที่ฉันคาดหวัง
เห็นแล้วยังอภิปรายติดตาม pgsql