วิธี จำกัด การใช้งานหน่วยความจำของแอปพลิเคชัน


10

ฉันใช้เวลา 2 ชั่วโมงอ่านคำถามเกี่ยวกับเรื่องนี้ แต่ก็ยังมีความเข้าใจผิดอยู่บ้าง

ฉันมีกระบวนการนี้:

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND    
root 1452 0.4 1.8 1397012 19308 ? Sl 04:23 3:48 ./transaction_server

นี่แสดงให้เห็นว่ามันใช้19.3Mbหน่วยความจำระบบ (ฉันไม่มีไฟล์สลับ) รอบ ๆหน่วยความจำระบบ1.8%ทั้งหมด 1GBขนาดเสมือนคือ1.39GB?!? ฉันได้อ่านแล้วว่าulimit -mใช้งานไม่ได้ คนใช้ulimit -vเช่นการตั้งค่าหน่วยความจำเสมือนสำหรับกระบวนการ หน่วยความจำเสมือนนี้เป็นรายการ VSZ หนึ่งรายการpsหรือไม่ ฉันควรตั้งค่าเท่าใดหากฉันต้องการ จำกัด กระบวนการนี้ให้ใช้100MBหน่วยความจำระบบมากที่สุด ฉันได้อ่านเอกสารสำหรับsetrlimitและดูเหมือนว่าถูกต้อง:

RLIMIT_AS
        This  is  the maximum size of a process' total available memory, 
        in bytes. If this limit is exceeded, the malloc() and mmap() 
        functions shall fail with errno set to [ENOMEM]. In addition, 
        the automatic stack growth fails with the effects outlined above.

แต่ในเอกสารเวอร์ชันอื่นRLIMIT_ASพารามิเตอร์นี้ตั้งค่าขนาดหน่วยความจำเสมือน ความจริงคืออะไร?


กรุณาให้ความสนใจในการโพสต์รูปแบบ
rozcietrzewiacz

คำตอบ:


6

ใช่ VSZ เป็นหน่วยความจำเสมือน สำหรับ RLIMIT_AS คุณพบย่อหน้าที่ยกมาด้านบนที่ไหน เนื่องจาก setrlimit (2) เป็นการเรียกระบบ Linux ฉันไม่เห็นว่ามันจะตรวจสอบ malloc (3) ซึ่งเป็นฟังก์ชั่นห้องสมุดได้อย่างไร แต่มันสามารถทำงานได้กับ brk (2), sbrk (2) และ mmap (2) - นี่คือสิ่งที่ manpage ของมัน (ตรวจสอบทางวิทยาศาสตร์ Linux) แนะนำ อย่างไรก็ตามจำนวนหน่วยความจำทั้งหมดที่ร้องขอผ่านฟังก์ชั่นเหล่านี้คือหน่วยความจำเสมือนดังนั้น RLIMIT_AS จึง จำกัด หน่วยความจำเสมือนอย่างแท้จริง (นี่คืออีกครั้งตาม setrlimit (2) manpage)

แต่น่าเสียดายที่คุณไม่สามารถ จำกัด RSS ภายใต้ Linux (นี้จะเป็นulimit -m) คุณสามารถลองใช้ulimit -d(RLIMIT_DATA) แต่สิ่งนี้จะละเว้น mmap (2) ซึ่งโดยปกติจะใช้สำหรับการจัดสรรจำนวนมาก ความเป็นไปได้อีกอย่างหนึ่งคือการ จำกัด หน่วยความจำเสมือน แต่ด้วยความแตกต่างที่มากระหว่าง RSS และ VSZ นี่อาจเป็นเรื่องยาก


ขอบคุณสำหรับคำตอบ. ย่อหน้ามาจากsetrlimitman page IEEE/The Open Group 2003 GETRLIMIT(3P)ทำไมถึงpsแสดงให้ฉันเห็น RSS ได้ แต่เคอร์เนลไม่สามารถบังคับใช้มันได้?
Dragomir Ivanov

6
ตามที่ Alan Cox สิ่งนี้มีเหตุผลทางประวัติศาสตร์: การคำนวณ RSS ที่ใช้มีราคาแพงดังนั้นการบังคับใช้ขีด จำกัด จะทำให้โหลดจำนวนมากบนเคอร์เนล แหล่งที่มา: linux.derkeiler.com/Mailing-Lists/Kernel/2006-01/msg03306.html ดูstackoverflow.com/questions/3043709/…
Ansgar Esztermann

ฉันเห็น. ผมคิดว่าผมจะไปกับulimit -dแล้ว mmap()โปรแกรมประยุกต์ที่ถูกเขียนโดยผมและผมไม่ได้ใช้
Dragomir Ivanov

2
ไม่คุณมักจะไม่ (หรือ sbrk ()) แต่อาจ malloc () อาจ
Ansgar Esztermann

ฉันเห็น. นั่นเป็นเรื่องที่โชคร้ายมาก ดังนั้นคำตอบสำหรับคำถามนี้คือกลุ่ม cg หรือแบบสำรวจการใช้หน่วยความจำด้วยภาษาสคริปต์บางอย่าง
Dragomir Ivanov

3

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

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