Score:2

ขีดจำกัดคิวข้อความ Centos System V IPC

ธง cn

[แม้ว่าฉันจะทำงานใน perl ฉันเชื่อว่าคำถามนี้เกี่ยวข้องกับ Linux System V IPC API และขีดจำกัดค่อนข้างจะเป็นเฉพาะเจาะจง Perl]

ฉันมีเครื่อง Centos สองเครื่อง แต่ละเครื่องใช้ CentOS Linux รีลีส 7.9.2009 (คอร์)

ฉันมีโปรแกรมที่แยกเด็กออก จากนั้นใช้ข้อความ IPC ของ System V เพื่อสื่อสารกับเด็ก เด็กเตรียมคำตอบและส่งไปยังผู้ปกครอง

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

เราสามารถตรวจสอบขนาดคิวด้วย ipcs -q และดูว่าถึงขีดจำกัดเริ่มต้นที่ 10 ข้อความต่อคิวในบางครั้ง ลูกจะหยุดชั่วคราว จากนั้นเราจะเห็นคิวว่างเปล่าตามที่คาดไว้

เราเชื่อว่ามีการระบุขีดจำกัดของคิวในไฟล์ใน /proc/sys/fs/mqueue/ และตัวอย่างเช่น msg_max คาดว่าจะเป็น 10ค่าเหล่านี้เหมือนกันในทั้งสองเครื่อง

เรายังสามารถดู ulimits ของผู้ใช้ที่เกี่ยวข้องกับคิวได้ ขีด จำกัด -q และเห็นค่าเกิน 800,000 ไบต์ทั้งสองเครื่อง

ปริศนาคือในเครื่องที่สองของเรา เราเห็นเด็กเขียนข้อความสามข้อความไปยังคิว และพยายามเขียนข้อความสี่และรอ - เราจงใจไม่กำหนดเวลา เหมือนกับว่าผู้เขียนเชื่อว่าคิวเต็มแล้ว ทั้งๆ ที่ ipcs -q แสดงรายการในคิวเพียง 3 รายการเท่านั้น ณ จุดนี้ผู้ปกครองยังไม่พยายามอ่านข้อความ

------ คิวข้อความ --------
เจ้าของคีย์ msqid อนุญาตข้อความที่ใช้ไบต์    
0x0000002a 1474560 เดฟ 600 15020 3  

คำถาม: นอกจากคิวเต็มแล้ว อะไรจะทำให้ msgsnd() หยุดชั่วคราว? การหยุดชั่วคราวดูเหมือนจะดำเนินต่อไปอย่างไม่มีกำหนด เด็กจะดำเนินการต่อเมื่อผู้ปกครอง เริ่มใช้งานและอ่านบางข้อความ

เรามีเครื่องจำนวนมากที่ใช้รหัสนี้โดยไม่มีปัญหา มันล้มเหลวในเครื่องใหม่สามเครื่อง น่าจะมีฟีเจอร์เฉพาะสภาพแวดล้อมที่โต้ตอบกับรหัสของเราหรือไม่

รหัส Perl ใช้ไลบรารีแบบบางเหนือการเรียกของระบบ (รายละเอียดถูกตัดออก)

$mQueue = msgget(IPC_PRIVATE, IPC_CREAT | S_IRUSR | S_IWUSR);
msgsnd( $mQueue, pack("l! a*", length($msg), $msg);
Score:2
ธง cn

ปัญหาก็คือว่า ขนาดคิวสูงสุดเริ่มต้น การตั้งค่าเคอร์เนลถูกตั้งค่าเป็นค่าต่ำ

การคำนวณนี้สามารถดูได้โดยใช้ตัวเลือก -l เพื่อ ipcs

ipcs -q -l

------ ข้อ จำกัด ข้อความ --------
ระบบคิวสูงสุดกว้าง = 3671
ขนาดสูงสุดของข้อความ (ไบต์) = 8192
ขนาดสูงสุดของคิวเริ่มต้น (ไบต์) = 16384

การตั้งค่าเคอร์เนลที่เป็นปัญหาถูกเก็บไว้ใน

/proc/sys/kernel/msgmnb

และสามารถเปลี่ยนแปลงได้ (เป็นรูท) โดยใช้คำสั่ง

 sysctl -w kernel.msgmnb=65536
 kernel.msgmnb = 65536

โพสต์คำตอบ

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