vm.overcommit_memory ทำงานอย่างไร


49

เมื่อฉันใช้การตั้งค่าเริ่มต้น:

vm.overcommit_memory = 0
vm.overcommit_ratio = 50

ฉันสามารถอ่านค่าเหล่านี้ได้จาก/proc/meminfoไฟล์:

CommitLimit:     2609604 kB
Committed_AS:    1579976 kB

แต่เมื่อฉันเปลี่ยนvm.overcommit_memoryจาก0เป็น2ฉันไม่สามารถเริ่มแอปพลิเคชันชุดเดียวกันที่ฉันสามารถเริ่มก่อนการเปลี่ยนแปลงโดยเฉพาะ amarok ฉันต้องเปลี่ยนvm.overcommit_ratioเป็น300ดังนั้นขีด จำกัด สามารถเพิ่มขึ้นได้ ตอนนี้เมื่อฉันเริ่ม amarok /proc/meminfoแสดงต่อไปนี้

CommitLimit:     5171884 kB
Committed_AS:    3929668 kB

เครื่องนี้มี RAM เพียง 1GiB แต่ amarok ทำงานได้โดยไม่มีปัญหาเมื่อvm.overcommit_memoryตั้งค่าเป็น 0 แต่ในกรณีที่ตั้งค่าเป็น2amarok จำเป็นต้องจัดสรรหน่วยความจำมากกว่า 2GiB มันเป็นพฤติกรรมปกติหรือไม่? ถ้ามีใครสามารถอธิบายได้ว่าทำไมเช่น firefox (ซึ่งใช้หน่วยความจำมากกว่า amarok 4-6x) ทำงานในลักษณะเดียวกันก่อนและหลังการเปลี่ยนแปลง?

คำตอบ:


66

คุณสามารถค้นหาเอกสารในman 5 proc( หรือที่ kernel.org ):

/proc/sys/vm/overcommit_memory
       This file contains the kernel virtual memory accounting mode.
       Values are:

              0: heuristic overcommit (this is the default)
              1: always overcommit, never check
              2: always check, never overcommit

       In mode 0, calls of mmap(2) with MAP_NORESERVE are not
       checked, and the default check is very weak, leading to the
       risk of getting a process "OOM-killed".

       In mode 2 (available since Linux 2.6), the total virtual
       address space that can be allocated (CommitLimit in /proc/mem‐
       info) is calculated as

           CommitLimit = (total_RAM - total_huge_TLB) *
                         overcommit_ratio / 100 + total_swap

คำตอบง่าย ๆ คือการตั้งค่า overcommit เป็น 1 จะตั้งค่าระยะเพื่อให้เมื่อโปรแกรมเรียกบางอย่างที่ต้องการmalloc()จัดสรรหน่วยความจำ ( man 3 malloc) มันจะประสบความสำเร็จเสมอโดยไม่คำนึงว่าระบบรู้ว่ามันจะไม่มีหน่วยความจำทั้งหมดที่กำลัง ถามเพื่อ.

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

ตัวอย่าง

เพื่อเน้นว่าทำไมเรื่องนี้ถึงมีความสำคัญในบางครั้งลองดูที่Redis guidancesว่าทำไมvm.overcommit_memoryควรตั้งเป็น 1


2
แต่มูลค่าของCommitted_ASทั้งสองกรณีไม่ควรเท่ากันหรือ
Mikhail Morfikov

@ MikailMorfikov: ในทางทฤษฎีแล้วฉันเชื่ออย่างนั้น แต่ใครจะรู้ว่าโปรแกรมเหล่านี้กำลังทำอะไรอยู่ ต้องการดูสภาพแวดล้อมที่ควบคุมได้มากขึ้นด้วยโปรแกรมอย่างง่ายที่เพิ่งจัดสรรว่า ram ขนาดใหญ่ผ่าน Malloc จากนั้นเรียกใช้การทดสอบหลังจากรีบูตระหว่างการทดสอบ
Kyle Brandt

ตกลงดังนั้นฉันจะอยู่กับ0ตอนนี้
Mikhail Morfikov

2
@MikailMorfikov: ใช่จริงฉันคิดว่า 0 เหมาะสมที่สุด ในสภาพแวดล้อมของฉันเพียงครั้งเดียวที่ฉันเปิดใช้งาน 1 สำหรับ Redis ซึ่งทำสิ่งที่คาดว่าจะขอหน่วยความจำเพิ่มมากขึ้นว่ามันใช้เนื่องจาก fork () เด็กจะใช้หน้าหน่วยความจำเดียวกันทั้งหมด แต่ Linux ไม่ทราบว่าปลอดภัยว่าจะต้องใช้หน่วยความจำ 2x (ถ้าคุณต้องการเรียนรู้เพิ่มเติม: redis.io/topics/faq )
Kyle Brandt

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