วิธีการตั้งค่า shmall, shmmax, shmmin, etc …โดยทั่วไปและสำหรับ postgresql


11

ฉันใช้เอกสารจาก PostgreSQLเพื่อตั้งค่าเช่นนี้ config:

>>> cat /proc/meminfo 
MemTotal:       16345480 kB
MemFree:         1770128 kB
Buffers:          382184 kB
Cached:         10432632 kB
SwapCached:            0 kB
Active:          9228324 kB
Inactive:        4621264 kB
Active(anon):    7019996 kB
Inactive(anon):   548528 kB
Active(file):    2208328 kB
Inactive(file):  4072736 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:              3432 kB
Writeback:             0 kB
AnonPages:       3034588 kB
Mapped:          4243720 kB
Shmem:           4533752 kB
Slab:             481728 kB
SReclaimable:     440712 kB
SUnreclaim:        41016 kB
KernelStack:        1776 kB
PageTables:        39208 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     8172740 kB
Committed_AS:   14935216 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      399340 kB
VmallocChunk:   34359334908 kB
HardwareCorrupted:     0 kB
AnonHugePages:    456704 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       12288 kB
DirectMap2M:    16680960 kB

>>> ipcs -l          

------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 4316816
max total shared memory (kbytes) = 4316816
min seg size (bytes) = 1

------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767

------ Messages Limits --------
max queues system wide = 31918
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384

sysctl.conf แยกคำนวณโดยฉัน:

kernel.shmall = 1079204
kernel.shmmax = 4420419584

postgresql.conf ไม่ใช่ค่าเริ่มต้นคำนวณโดยฉัน:

max_connections = 60            # (change requires restart)
shared_buffers = 4GB            # min 128kB
work_mem = 4MB              # min 64kB
wal_sync_method = open_sync     # the default is the first option
checkpoint_segments = 16        # in logfile segments, min 1, 16MB each
checkpoint_completion_target = 0.9  # checkpoint target duration, 0.0 - 1.0
effective_cache_size = 6GB

สิ่งนี้เหมาะสมหรือไม่ ถ้าไม่ (หรือไม่จำเป็น) มันจะเหมาะสมไหม?

เราได้บันทึกการปรับปรุงประสิทธิภาพที่ดีด้วยการกำหนดค่านี้คุณจะปรับปรุงได้อย่างไร

วิธีคำนวณพารามิเตอร์การจัดการหน่วยความจำเคอร์เนล

ใครสามารถอธิบายวิธีตั้งค่าเหล่านั้นจากพื้นดินจริง ๆ


นั่นเป็นคำถามจำนวนมากและคุณไม่ได้บอกเราว่าปัญหาปัจจุบันของคุณคืออะไร (ถ้ามี) หรือรูปแบบการใช้งานของคุณคืออะไร มันอาจคุ้มค่าที่จะได้รับหนังสือเกี่ยวกับประสิทธิภาพของ PostgreSQL
hmallett

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

คำตอบ:


11

ฉันตอบคำถามนี้เพื่อคำถามอื่นที่นี่:

Git ล้มเหลวในการพุชโดยมีข้อผิดพลาด 'หน่วยความจำไม่เพียงพอ'

ฉันไม่ได้ตอบคำถามทั้งหมดของคุณที่นี่ แต่คำถามในชื่อของคุณ:

วิธีการตั้งค่า shmall, shmmax, shmmni, etc …โดยทั่วไปและสำหรับ postgresql

ด้วยการกระจายเคอร์เนลบางตัวมีการตั้งค่าที่ป้องกันไม่ให้เคอร์เนลจากการจัดสรรหน่วยความจำสูงสุดไปยังกระบวนการเดียว:

ตั้งค่าพารามิเตอร์เคอร์เนล

แก้ไข/etc/sysctl.confไฟล์เพื่อรวมบรรทัดที่เหมาะสมกับระบบปฏิบัติการของคุณ:

# Red Hat Enterprise Linux 3.0 and CentOS 3.x 
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.shmall = 2097152
kernel.shmmin = 1
kernel.shmseg = 10

# semaphores: 
semmsl, semmns, semopm, semmni kernel.sem = 250 32000 100 128
fs.file-max = 65536

# Red Hat Enterprise Linux 4.0 and CentOS 4.x 
kernel.shmmax = 536870912
kernel.shmmni = 4096
kernel.shmall = 2097152

หากกระบวนการของคุณเกินขีด จำกัด เคอร์เนลจะฆ่ากระบวนการแม้ว่าหน่วยความจำสูงสุดที่รายงานจะมีอยู่ในระบบของคุณ

หมายเหตุ: ระมัดระวังการตั้งค่าเหล่านี้ คุณอาจไม่ต้องการใช้การตั้งค่าในตัวอย่างนั้นเนื่องจากฉันดึงพวกเขาจากเซิร์ฟเวอร์ในสภาพแวดล้อมของเรา

หมายเหตุเพิ่มเติมเล็กน้อยที่จะกล่าวถึง:

ในการอัพเดตและทดสอบการตั้งค่าเคอร์เนลด้วย sysctl ให้ใช้คำสั่งต่อไปนี้:

รายการการตั้งค่าปัจจุบัน:

sysctl -A | grep shm
sysctl -w kernel.shmmax=<value> to write in sysctl.conf
sysctl -p /etc/sysctl.conf to read/reload the values from sysctl.conf

ปิดใช้งานการรักษาความปลอดภัย linux โดยแก้ไข/etc/selinux/configไฟล์ตรวจสอบให้แน่ใจว่าตั้งค่าสถานะ SELINUX ดังนี้

SELINUX=disabled

สิ่งนี้เหมาะสมหรือไม่ ถ้าไม่ (หรือไม่จำเป็น) มันจะเหมาะสมไหม?

การตั้งค่าเคอร์เนลมักจะถูกกำหนดไว้อย่างเข้มงวดมากขึ้นในสภาพแวดล้อมของดาต้าเซ็นเตอร์เมื่อผู้ให้บริการ ISP ไม่ต้องการให้กระบวนการลูกค้าเดียวใช้ทรัพยากรทั้งหมดบนเซิร์ฟเวอร์ที่ใช้ร่วมกัน

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

ในบางกรณี postgres ยังสามารถจัดสรร mem เพิ่มเติมให้กับขนาดหน้ากระดาษที่เฉพาะเจาะจงกว่าสิ่งที่มีอยู่ใน mememory ที่แชร์:

* The PostgreSQL server failed to start. Please check the log output:
2011-11-04 05:06:26 UTC FATAL: could not create shared memory segment: Invalid
argument
2011-11-04 05:06:26 UTC DETAIL: Failed system call was shmget(key=5432001, size
=161849344, 03600).
2011-11-04 05:06:26 UTC HINT: This error usually means that PostgreSQL’s reques
t for a shared memory segment exceeded your kernel’s SHMMAX parameter. You can
either reduce the request size or reconfigure the kernel with larger SHMMAX. To
reduce the request size (currently 161849344 bytes), reduce PostgreSQL’s shared
_buffers parameter (currently 19200) and/or its max_connections parameter (curre
ntly 53).
If the request size is already small, it’s possible that it is less than
your kernel’s SHMMIN parameter, in which case raising the request size or recon
figuring SHMMIN is called for.
The PostgreSQL documentation contains more information about shared memo
ry configuration.
…fail!

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

http://www.postgresql.org/docs/9.1/static/kernel-resources.html

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

ใครสามารถอธิบายวิธีตั้งค่าเหล่านั้นจากพื้นดินจริง ๆ

สำหรับการจูน Postgres คุณควรอ่านสิ่งนี้:

http://wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server


1
"หมายเหตุ: ระมัดระวังการตั้งค่าเหล่านี้คุณอาจไม่ต้องการใช้การตั้งค่าในตัวอย่างนั้นเนื่องจากฉันดึงพวกเขาจากเซิร์ฟเวอร์ในสภาพแวดล้อมของเรา" ฉันควรคำนวณมันสำหรับสภาพแวดล้อมของฉันอย่างไร
jpic

1
สวัสดี jpic ฉันได้อัพเดทรายละเอียดเพิ่มเติมเกี่ยวกับการตั้งค่าเคอร์เนล
Jason Huntley

2

โอ้ !! ฉันพบเครื่องมือที่ยอดเยี่ยมในการคำนวณ optimus mem config ของเซิร์ฟเวอร์ postgresql ของเราที่นี่

http://pgtune.leopard.in.ua/


เครื่องมือนี้ไม่ได้เกี่ยวกับการคำนวณการกำหนดค่า optimus มันให้จุดเริ่มต้นในการปรับแต่งเซิร์ฟเวอร์ของคุณเนื่องจากจะให้คำตอบตามการตั้งค่าฮาร์ดแวร์ของคุณเป็นหลัก ขนาดฐานข้อมูลจำนวนแบบสอบถามและขนาดก็มีความสำคัญในการปรับแต่งพารามิเตอร์การตั้งค่า
EAmez

1

sysctl.confผู้กำหนดค่าเคอร์เนลทั่วโลกไม่ได้กระบวนการที่เฉพาะเจาะจงเพื่อให้มันเหมาะสมที่จะตั้งไว้ใน


คำถามคือเกี่ยวกับการกำหนดค่าสำหรับพารามิเตอร์การจัดการหน่วยความจำที่ใช้ร่วมกันของเคอร์เนล, "วิธี", ไม่ใช่ "ที่" ... ขอบคุณสำหรับความพยายามใส่ลงในคำตอบของคุณ
jpic

อ๋อ ที่นั่นเป็นเรื่องเล็กน้อย เนื้อของมันเป็นอย่างไร
Henley Chiu

0

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

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

โดยทั่วไปฐานข้อมูลจะมีความอ่อนไหวต่อการตั้งค่าหน่วยความจำมากที่สุดเนื่องจากเป็นคอขวดที่มีผลต่อประสิทธิภาพการทำงานของแอพพลิเคชั่นมากที่สุด


วิธี "ค้นหาการตั้งค่าที่เหมาะสมที่สุดระหว่างแอปพลิเคชันต่าง ๆ เหล่านี้"? ฉันไม่มีปัญหาด้านประสิทธิภาพฉันกำลังมองหาวิธีที่เป็นที่ยอมรับในการกำหนดการตั้งค่าเคอร์เนลหน่วยความจำที่ใช้ร่วมกันโปรที่แท้จริงจะทำอย่างไร ถ้ามีคนจัดการคุณเซิร์ฟเวอร์ที่ทำงานด้วยบริการมากมายและจ่ายให้คุณเพื่อตั้งค่าการจัดการหน่วยความจำคุณจะทำอะไร?
jpic

ไม่มีกฎทองคำคุณแค่มองสิ่งที่ผู้ขายพูดและทดสอบ หากคุณมีหลายแอพพลิเคชั่นที่รันบนเครื่องเดียวกันลองปรับให้เหมาะสมสำหรับแอพพลิเคชั่นที่ใช้หน่วยความจำมากที่สุดโดยส่วนใหญ่แล้ว DB แต่นอกเหนือจากการดูคำแนะนำจากผู้ขายและทำการทดสอบพวกเขาไม่มีวิธีแก้ปัญหาเดียวที่ถูกต้อง
Sibster

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