ปรับ postgresql สำหรับ ram จำนวนมาก


29

ฉันมีเซิร์ฟเวอร์ที่เหมือนกันสองตัว (ในแง่ของฮาร์ดแวร์) พวกเขาเป็นทั้งการติดตั้งมาตรฐานของ windows server 2008 r2 โดยมีการติดตั้งซอฟต์แวร์น้อยที่สุด (โดยทั่วไปคือโค้ดของฉัน

บนเซิร์ฟเวอร์ตัวเดียวฉันใช้ SQL Server 2005 บนเซิร์ฟเวอร์ตัวที่สอง postgresql 9.1 ความแตกต่างของประสิทธิภาพในการทำงาน b / n เซิร์ฟเวอร์ทั้งสองนี้ไม่น่าเชื่อเลยมันแย่มากใน postgresql ที่ฉันเสียใจที่เริ่มแรก "ลองใช้ postgresql แทนที่จะจ่ายใบอนุญาตเซิร์ฟเวอร์ sql" ให้เจ้านายของฉันพูด เรากำลังพูดถึงความแตกต่างของ 30 วินาทีเทียบกับ 15 นาทีสำหรับคำสั่งเดียวกันและไม่ใช่แค่คำสั่งเดียวนี่คือแบบสอบถามหรือคำสั่งใด ๆ ที่ฉันส่งไป พวกเขาทั้งสองมีข้อมูลที่เหมือนกัน (ระเบียนถูกแทรกในลำดับที่แตกต่างกัน) และฐานข้อมูลทั้งสองมีโครงสร้าง / ดัชนีเหมือนกัน ฯลฯ

แต่ฉันหวังว่ามันเป็นเพียงเรื่องของการปรับแต่งประสิทธิภาพ สิ่งคือเซิร์ฟเวอร์ sql ค่อนข้างใช้ ram 32 กิ๊กทั้งหมดบนเซิร์ฟเวอร์ในขณะที่ postgresl ไม่ได้ใช้อะไรเลยมีน้อยกว่า gig ถึงแม้ว่าฉันจะไม่ได้หารายละเอียดดี ๆ

ฉันจะให้ postgresql ใช้ ram มากกว่า 20 กิกะไบต์ได้อย่างไร เซิร์ฟเวอร์เหล่านี้สร้างขึ้นโดยเฉพาะสำหรับเนื้อหาฐานข้อมูลนี้ดังนั้นหน่วยความจำใด ๆ ที่ไม่ได้ใช้โดยฐานข้อมูลและกระบวนการสนับสนุนจะสูญเปล่าในความคิดของฉัน


4
คุณเปลี่ยนอะไรเป็นการตั้งค่าเริ่มต้นหรือไม่ ขั้นที่ 1: SET effective_cache_size=18G;(การตั้งค่าเริ่มต้นต่ำมาก ) BTW: สมมติว่านี่เป็นเครื่อง 64 บิต (ไม่มี PTE)

1
คุณไม่ได้ให้ความช่วยเหลือพวกเรามากพอ นอกเหนือจาก "ช้า" เราไม่รู้มากเกี่ยวกับชุดข้อมูลของคุณวิธีที่คุณเข้าถึงชุดสืบค้นประเภทใดที่ทำงานช้าโดยทั่วไปสิ่งที่คุณทำเพื่อปรับ (และอาจปรับแต่งผิด) เซิร์ฟเวอร์ของคุณ Heck บนเครื่อง linux ที่มีคอร์และช่องหน่วยความจำมากมายคุณสามารถรับประสิทธิภาพการเส็งเคร็งได้นานก่อนที่คุณจะติดตั้ง postgresql คุณมี CPU หรือ IO ผูกพันหรือไม่ คุณมีการตั้งค่าที่ไม่ใช่ค่าเริ่มต้นอะไรบ้าง แบบสอบถามชนิดใดที่ช้า
Scott Marlowe

2
Postgres ไม่ "ใช้ ram" ในแบบที่คุณพูด มันขึ้นอยู่กับแคชหน้าของระบบไฟล์ระบบปฏิบัติการสำหรับการแคชจำนวนมากดังนั้นเมื่อคุณดูการใช้งาน RAM บนระบบที่รัน postgres โดยทั่วไปคุณจะเห็น GBs จำนวนมากที่ใช้งานโดยบัฟเฟอร์ / แคช OS และกระบวนการแบ็กเอนด์แต่ละ postgres สองสามหมื่น MBs ต่อครั้ง
dbenhur

1
ดูลิงค์นี้: tekadempiere.blogspot.ae/2014/09/… และค้นหาค่า conf ของคุณจากที่นี่: pgtune.leopard.in.ua
Sajeev

คำถามที่เกี่ยวข้อง, อาจจะเป็นที่สนใจ: stackoverflow.com/questions/47311485/…
mountainclimber

คำตอบ:


41

มีค่าคงที่ tweakable หลาย initialised postgres.confผ่านมี สิ่งที่สำคัญที่สุดคือ:

  • max_connections: จำนวนเซสชันที่เกิดขึ้นพร้อมกัน
  • work_mem : จำนวนหน่วยความจำสูงสุดที่จะใช้สำหรับผลลัพธ์ระดับกลางเช่นตารางแฮชและการเรียงลำดับ
  • shared_buffers จำนวนหน่วยความจำที่อุทิศให้กับพื้นที่บัฟเฟอร์ 'ปักหมุด'
  • effective_cache_size ปริมาณหน่วยความจำที่สมมติว่าใช้โดยบัฟเฟอร์ LRU ของระบบปฏิบัติการ
  • random_page_cost : การประมาณการสำหรับค่าใช้จ่ายที่เกี่ยวข้องของการค้นหาดิสก์

max_connectionsไม่ควรตั้งค่าที่สูงกว่าที่ต้องการเชื่อมต่อทรัพยากรต้นทุนแม้ในขณะที่ไม่ได้ใช้งาน ในกรณีส่วนใหญ่การเชื่อมต่อจะใช้เวลาในการรอภายในมากกว่าการรออยู่ข้างนอก (ตามราคาของการเกิดพร้อมกัน) สูตรกฎข้อหัวแม่มือที่ดีคือ "จำนวนของสปินเดิล + จำนวนโปรเซสเซอร์ + X"

work_memเป็นเรื่องยุ่งยาก: จะสามารถนำไปใช้ทุกแบบสอบถามย่อยดังนั้นแบบสอบถามมี 5 HASHJOINSอาจมีค่าใช้จ่าย 5 work_mem* และสำหรับสถานการณ์ที่เลวร้ายที่สุดกรณีคุณควรคิดว่าหลายครั้งเสียเงินจำนวนนี้ (อีกครั้งเหตุผลที่จะเก็บmax_connectionsต่ำ)

shared_buffersคือ (IMHO) เกินจริง โดยปกติแล้วควรตั้งค่าไว้ที่ประมาณ 1/4 ... 1/2 ของหน่วยความจำ "ฟรี" ที่มีอยู่ทั้งหมด แต่ฉันมักจะทำให้มันต่ำและตั้งeffective_cache_sizeเป็นหน่วยความจำ "ฟรี" ที่มีอยู่ทั้งหมด

random_page_costเป็นค่าใช้จ่ายสำหรับการค้นหา + อ่านบนดิสก์ มันสัมพันธ์กับsequential_disk_cost, ซึ่งคือ 1 การตั้งค่าเริ่มต้น (4) สำหรับrandom_page_costสูงเกินไปสำหรับเครื่องจักรที่ทันสมัยและที่เก็บข้อมูลเครือข่ายโดยปกติจะสามารถลดลงได้ระหว่าง 2 ถึง 1.x สำหรับดิสก์ SSD คุณยังสามารถตั้งค่าเป็น 1.0 ได้เนื่องจากการค้นหานั้นฟรีสำหรับ SSD


ยอดเยี่ยม ฉันไม่เคยเห็นความสำคัญของ effective_cache_size หลงกลกับ shared_buffers เสมอ สิ่งนี้สร้างความแตกต่างอย่างมาก ฉันเรียกใช้ pgtune เช่นกันและแนะนำให้ใช้ 20GB จาก 96 สำหรับ shard_buffers แต่ 64GB สำหรับ effective_cache_size ขอบคุณ!

1
FWIW ผมเดินผ่านเหล่านี้และการตั้งค่าอื่น ๆ ข้อเสนอแนะในเอกสาร Postgres และได้วิเคราะห์สำหรับเซิร์ฟเวอร์ของเรา
mlissner

ขอบคุณมากสำหรับคำตอบ ฉันสามารถถามสิ่งที่แนะนำwork_memคือเมื่อmax_connectionsเป็น 100 เริ่มต้นและ RAM เซิร์ฟเวอร์เป็น 32GB (เซิร์ฟเวอร์ postgres เฉพาะ)? ฉันรู้ว่าฉันจำเป็นต้องปรับแต่งสิ่งนี้ด้วยตัวเองตามการสืบค้นรายวัน ฉันแค่สงสัยว่าถ้าคุณสามารถบอกฉันว่า "หนึ่งขนาดเหมาะกับคำตอบทั้งหมด" (หรือเป็นค่าเริ่มต้น) 50MB ใหญ่เกินไปหรือไม่ ขอบคุณมาก.
sgon00

ขึ้นอยู่กับกิจกรรมที่เกิดขึ้นพร้อมกันทั่วไปในเครื่องของคุณ 100 เซสชันที่ต้องการ 50M (ด้านบนของ 10..20M) แต่ละรายการอาจเหมาะสม หรืออาจจะไม่ หากต้องการรับความประทับใจให้ตรวจสอบ vmstat หรือด้านบน บวก: ขึ้นอยู่กับข้อความค้นหาของคุณ (และอื่น ๆ ) เพียงแค่ดูแผน
wildplasser

@wildplasser ขอบคุณมากสำหรับการตอบกลับอย่างรวดเร็ว ผมพบว่าเว็บไซต์ที่น่าสนใจ pgtune.leopard.in.ua ฉันคิดว่าฉันจะใช้ 40MB เป็นจุดเริ่มต้นจากคำแนะนำและปรับแต่งตามนั้น ไชโย
sgon00

20

พิจารณาใช้pgtuneเพื่อช่วยคุณปรับแต่งการกำหนดค่า PostgreSQL จาก PgFoundry:

pgtune ใช้ค่าเริ่มต้น wimpy postgresql.conf และขยายเซิร์ฟเวอร์ฐานข้อมูลให้มีประสิทธิภาพเท่ากับฮาร์ดแวร์ที่ใช้งาน

การกำหนดค่าเริ่มต้นของ PostgreSQL นั้นค่อนข้างอนุรักษ์นิยมและเครื่องมือนั้นมีไว้เพื่อช่วยในสถานการณ์ที่แน่นอนนี้ เอกสารประกอบนั้นมีขนาดเบาอ่านและใช้งานเครื่องมือได้ค่อนข้างตรงไปตรงมา

โปรดทราบว่าไม่จำเป็นต้องใช้คำแนะนำที่แน่นอนของ pgtune การเล่นกับการตั้งค่าและการดูการเปลี่ยนแปลงที่เกิดขึ้นกับไฟล์ conf จะทำให้คุณเข้าใจการกำหนดค่าของ PostgreSQL ได้ดีขึ้นและวิธีปรับแต่งด้วยตนเอง


8
การอัปเดตล่าสุดของ pgtune คือในปี 2009 นั่นคือ 5 ปีที่ผ่านมาและยังคงนับ ฉันสงสัยว่ามันยังใช้ได้กับซีรีย์ 9.1-9.2-9.3 หรือไม่
โซริน

9
pgtune พร้อมให้เล่นออนไลน์แล้ว
Alfabravo

3

หากทุกคำสั่งหรือคำสั่งทำงานช้าฉันสงสัยว่า:

  • คุณเชื่อมต่อกับฐานข้อมูลสำหรับทุกแบบสอบถามที่คุณเรียกใช้
  • คุณได้กำหนดค่าวิธีการรับรองความถูกต้องบางอย่างซึ่งใช้งานไม่ได้และจะหยุดการสอบถามของคุณจนกว่าวิธีการรับรองความถูกต้องนี้จะหมดเวลา

คุณช่วยกรุณาบอกให้เราทราบเท่าใดเวลาที่ใช้ในการเรียกใช้แบบสอบถามเหมือนselect version()? ถ้าควรจะเป็นทันที (0,16ms ในเวิร์กสเตชันของฉัน)


2

หากทุกคำถามพบว่าสิ่งที่ช้ากว่านั้นเกิดความผิดพลาดอย่างมากกับเซิร์ฟเวอร์หรือบางสิ่งบางอย่าง จากประสบการณ์ของฉันแต่ละ db มีบางสิ่งที่ดีกว่าที่อื่น แต่ประสิทธิภาพ pgsql ที่ชาญฉลาดนั้นอยู่ในขอบเขตเดียวกับเซิร์ฟเวอร์ mssql

ดังนั้น, คุณใช้ระบบปฏิบัติการอะไร pgsql? ฮาร์ดแวร์อะไร คุณได้เปลี่ยนแปลงการตั้งค่าใดบ้าง ชุดข้อมูลของคุณใหญ่แค่ไหน? ตัวอย่างของแบบสอบถามที่ไม่ดีและผลลัพธ์ของการวิเคราะห์อธิบาย (เรียกใช้แบบสอบถามของคุณเช่นนี้:

อธิบายวิเคราะห์เลือก ... ส่วนที่เหลือของแบบสอบถามที่นี่ ... ;

โพสต์เอาต์พุตไปที่http://explain.depesz.com/และโพสต์ลิงก์ที่นี่


1
ใช่ทุกคำสั่ง / คำสั่งทำงานช้าและใช่ "บางอย่าง" ผิดไปอย่างมากดังนั้นคำถามของฉัน ปัญหาคือ mssql ใช้ประโยชน์จาก ram ที่มีอยู่อย่างเต็มรูปแบบบนเซิร์ฟเวอร์ (แคชหนักมาก) ในขณะที่ psql ไม่ได้ใช้ ฉันขอขอบคุณความคิดเห็นและคำแนะนำ แต่คุณต้องพลาดคำถามจำนวนมากและหัวเรื่องของตัวเอง ... ฉันแค่อยากรู้วิธีที่จะได้รับ psql เพื่อใช้ประโยชน์จาก ram ที่มีอยู่; กำลังลองใช้คำแนะนำบางอย่างที่ระบุโดยคนอื่น ๆ ...
user85116

1
การใช้ RAM ของคุณไม่ใช่ปัญหา Postgresql อาศัยระบบปฏิบัติการเพื่อทำการแคชส่วนใหญ่ ดังนั้นจึงไม่จำเป็นต้องใช้ RAM ทั้งหมด อีกครั้งคุณพลาดจุดใหญ่ของฉันไป คุณกำลังมอบสิ่งเล็ก ๆ น้อย ๆ ที่มีค่าแก่เราเพื่อช่วยคุณ ฉันขับรถกลุ่ม 5000 postpesql postgresql เพื่อหาเลี้ยงชีพ คุณสามารถใช้คำแนะนำของฉันหรือคิดต่อไปว่าคุณรู้ว่า pgsql ทำงานอย่างไรและโต้แย้ง
Scott Marlowe

@ user85116 โปรดฟัง Scott เรามีเวิร์กโฟลว์กับ MySQL ซึ่งขึ้นอยู่กับความหน่วงสูงดังนั้นขณะนี้ MySQL ใช้ 64GB ram ในการค้นหาอย่างรวดเร็วขณะเดียวกันสามารถทำได้บน 2G Postgres ด้วยมุมมองที่เป็นจริง การแคชฐานข้อมูลทั้งหมดลงใน RAM จะไม่ช่วยแก้ปัญหาของคุณ แต่จะทำให้มองเห็นได้น้อยลง หากคุณมีปัญหาเดียวกันในโครงสร้าง DB Postgres จะไม่แก้ไขให้คุณหรือลองซ่อนมัน
kworr
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.