PostgreSQL บ่นเกี่ยวกับหน่วยความจำที่แชร์ แต่ดูเหมือนว่าหน่วยความจำที่แชร์จะไม่เป็นไร


13

ฉันได้ทำคีมาแบบเข้มข้นแล้วปล่อยและสร้างบนเซิร์ฟเวอร์ PostgreSQL แต่ตอนนี้บ่น .. :

WARNING:  out of shared memory
ERROR:  out of shared memory
HINT:  You might need to increase max_locks_per_transaction.

แต่ปัญหายังคงอยู่หาก PostgreSQL เพิ่งเริ่มต้นใหม่service postgresql restartฉันสงสัยว่า max_locks_per_transaction จะไม่ปรับอะไรเลย

ฉันค่อนข้างจะเหินห่างเพราะรายการแก้ไขปัญหาสำหรับข้อผิดพลาดนี้ไม่ทำงานสำหรับฉัน

ข้อมูลเพิ่มเติม 1409291350:รายละเอียดบางอย่างหายไป แต่ฉันเก็บผลลัพธ์ SQL หลักไว้

postgres=# SELECT version();
PostgreSQL 9.3.5 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2,
 64-bit

และ:

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.1 LTS
Release:        14.04
Codename:       trusty

2
รุ่น PostgreSQL มาจากSELECT version()ไหน? ปัญหาที่น่าสนใจ ...
Craig Ringer

2
"ฉันสงสัยว่า max_locks_per_transaction จะไม่ปรับอะไรเลย" - เอ่อทำไมคุณถึงสงสัยว่า คุณได้ลองทำตามคำแนะนำของคำใบ้จริงหรือไม่?
Josh Kupershmidt

คุณได้ลองทำตามคำแนะนำของคำใบ้จริงหรือไม่? ฉันไม่ใส่ข้อคิดเห็นmax_locks_per_transaction = 64 # min 10ใน /etc/postgresql/9.3/main/postgresql.conf จนถึงตอนนี้
48347

1
max_locks_per_transaction เริ่มต้นคือ 64 เพื่อเริ่มต้นด้วย - การยกเลิกหมายเหตุที่บรรทัดนั้นไม่ได้เปลี่ยนอย่างมีประสิทธิภาพ
อัตราผลตอบแทน

1
ตกลงการเพิ่มขึ้นอย่างมีประสิทธิภาพถึง 128 แก้ไขปัญหาอนุญาตให้ดำเนินการต่อได้จริง
48347

คำตอบ:


11

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

คุณสามารถเพิ่มขีด จำกัด ได้เล็กน้อย (ฉันขอแนะนำไม่ให้ตั้งค่าขนาดใหญ่โดยพลการหรือคุณจะทำงานในสถานการณ์ที่แยกออกจากหน่วยความจำที่ใช้ร่วมกันทั้งหมดจริง ๆ ) หรือทำการดร็อปของคุณและสร้างเป็นชุดการทำธุรกรรม / สร้างต่อการทำธุรกรรม

แก้ไข: เห็นได้ชัดว่าฉันผิดเกี่ยวกับการทำงานของ max_locks_per_transaction จากเอกสารจำนวนการล็อคทั้งหมดที่มีคือ max_locks_per_transaction * (max_connections + max_prepared_transactions) - ธุรกรรมใดธุรกรรมหนึ่งอาจถือมากกว่า


เวิร์กโฟลว์ของฉันรวมถึง (1) ทิ้งสคีมา X (2) ดร็อปสกีมาอีก Y และ (3) การกู้คืน X ในชื่อสกีมา Y ดังที่ฉันบอกจนถึงวันนี้ฉันได้ทำกิจกรรมเหล่านี้มาหลายสัปดาห์แล้วและวันนี้ ขั้นตอน (2) ล้มเหลว ขั้นตอนที่ (2) ส่วนใหญ่ประกอบด้วยDROP SCHEMA IF EXISTS public CASCADE; CREATE SCHEMA publicเหล่านี้เป็นประโยคที่โยนคำเตือนข้อผิดพลาดและคำแนะนำ
48347

การเพิ่มจำนวนการล็อกสูงสุดเป็นสองเท่าจาก 64 ถึง 128 อนุญาตให้เวิร์กโฟลว์ดำเนินการต่อ ยังไม่ได้ internals ทั้งหมด แต่ฉันเดาว่าการยอมรับระหว่าง DROP SCHEMA และประโยค CREATE SCHEMA จะมีผลในการบรรเทาที่คล้ายกัน
48347

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