ทำความเข้าใจเกี่ยวกับการใช้งานหน่วยความจำเสมือน> swap + physical บน Linux


9

ฉันมีกระบวนการที่รายงานใน 'บนสุด' ว่ามีหน่วยความจำภายใน 6GB และจัดสรรหน่วยความจำเสมือน 70GB สิ่งที่แปลกคือเซิร์ฟเวอร์นี้มีเพียง 8GB จริงและมีพื้นที่สว็อป 35GB

จากคู่มือ 'top':

   o: VIRT  --  Virtual Image (kb)
      The total amount of virtual memory used by the  task.   It  includes
      all  code,  data  and  shared  libraries  plus  pages that have been
      swapped out. (Note: you can define the STATSIZE=1 environment  vari-
      able  and  the VIRT will be calculated from the /proc/#/state VmSize
      field.)

      VIRT = SWAP + RES.

ด้วยคำอธิบายนี้ฉันคาดหวังว่าการจัดสรรหน่วยความจำแบบ virutal สำหรับกระบวนการจะ จำกัด เพียงการแลกเปลี่ยน + หน่วยความจำกายภาพที่มีอยู่

ตาม 'pmap' โค้ดส่วนแบ่งไลบรารีและหน่วยความจำที่แชร์ของกระบวนการนี้มีน้อยมาก - ไม่เกิน 300M หรือมากกว่านั้น

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

คำตอบ:


9

อาจเป็นความต้องการหน่วยความจำศูนย์ซึ่งไม่ได้อยู่ในหน่วยความจำจริงหรือในไฟล์เพจ

แหล่งข้อมูลบางอย่างที่คุณอาจต้องการดู:

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

ช่วยให้คุณสามารถบีบอัดและคลายขนาดในหน้าหน่วยความจำแบบเรียลไทม์ ในทางกลับกันคุณสามารถเก็บทุกอย่างไว้ใน RAM แทนที่จะสลับไปที่ดิสก์ ( ช้ามาก )


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

ดีใจที่ได้ช่วยเหลือหวังว่าผู้ใช้รายอื่นจะทำให้ฉันดีขึ้น ฉันคิดหาคำตอบของนักฆ่า แต่ฉันมีคะแนน 1,266 :-( ฉันไม่คิดว่าผู้ใช้ผิดกับเซิร์ฟเวอร์อย่างฉัน hahhah
The Unix Janitor

1
เหตุผลบางประการที่ผู้คนอาจไม่ลงคะแนนให้คุณ: 1.การจัดรูปแบบคำตอบของคุณ --- ใช้มาร์กอัป 2.ชื่อผู้ใช้ของคุณดูเหมือนทั่วไป 3. สำคัญที่สุด:ความจริงที่ว่าคุณพบว่ามันสำคัญพอที่จะแสดงความคิดเห็นเกี่ยวกับมัน รสชาติเปรี้ยวในปากของผู้คน
Belmin Fernandez

@ user37899 การโหวตขึ้นมีแนวโน้มที่จะตกอยู่ใน 3 หมวดหมู่: คำตอบที่ให้ข้อมูลคืออะไรรูปแบบที่ดีและง่ายต่อการอ่านเป็นอย่างไรและคำถามยอดนิยมคืออะไร ฉันทำงานกับการจัดรูปแบบของคุณ แต่คุณต้องมีเซนด้วยและตระหนักว่าคำตอบที่ยอดเยี่ยมบางคำนั่งอยู่ในเว็บไซต์ด้วยการอัปโหลดเพียงครั้งเดียวความนิยมของคำถามคือปัจจัยที่มีผลมากที่สุด
Jeff Ferland

1
ทำการจัดรูปแบบบางอย่าง หวังว่ามันจะช่วยได้
Belmin Fernandez

2

นี่คือการอภิปรายของคุณธรรมกับหน่วยความจำถิ่นที่อยู่:

/programming/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used

การสนทนาอ้างถึงกระบวนการ Java แต่สามารถใช้ได้กับทุกสิ่งที่ทำงานภายใต้ Linux ประเด็นหลักเกี่ยวกับคุณธรรมคือยอดรวมทั้งหมดของสิ่งต่าง ๆ ที่ไม่เคยใช้ Virt เป็นสิ่งที่มองหาระบบปฏิบัติการ 32- บิต (เนื่องจากกระบวนการจะมีข้อ จำกัด ในพื้นที่ที่กำหนดแอดเดรสได้) แต่ส่วนใหญ่ไม่มีประโยชน์อย่างอื่น ตามที่ระบุไว้สิ่งที่ต้องคำนึงถึงคือหน่วยความจำในเครื่องซึ่งจะ จำกัด อยู่ที่ RAM จริงและการสลับของคุณ


จริง ๆ แล้วเขาถามว่าทำไมหน่วยความจำเสมือนที่จัดสรรมีขนาดใหญ่กว่าหน่วยความจำกายภาพ + พื้นที่สว็อปของเขา ..
The Unix Janitor

ใช่และการอภิปรายใน Stackoverflow พูดถึงว่าเป็นไปได้อย่างไร
cjc

1

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

จาก: http://lwn.net/Articles/428100/

ในกระบวนการพยายามเข้าถึงเป้าหมายของ "ค่าใช้จ่ายต่ำพอและไม่มีความล่าช้าอย่างมีนัยสำคัญ" นักพัฒนา Go ได้ตั้งสมมติฐานที่ง่ายขึ้นซึ่งหนึ่งในนั้นคือหน่วยความจำที่ถูกจัดการสำหรับแอปพลิเคชันที่ทำงานอยู่นั้นมาจากเดี่ยว ช่วงที่อยู่ สมมติฐานดังกล่าวสามารถพบปัญหาเดียวกันกับที่ตัวแก้ไขของคุณตีด้วย vi - รหัสอื่น ๆ สามารถจัดสรรส่วนที่อยู่ในช่วงกลาง - ดังนั้นนักพัฒนา Go ใช้วิธีแก้ปัญหาเดียวกัน: พวกเขาจัดสรรหน่วยความจำทั้งหมดที่พวกเขาคิดว่าพวกเขาอาจต้องการ เหตุผลที่ 16GB ควรมีเพียงพอในระบบ 64 บิต) ในเวลาเริ่มต้น

นั่นคือวิธีการจัดการหน่วยความจำที่ไม่สำคัญบางครั้ง - การมีพื้นที่ที่อยู่อย่างต่อเนื่องทำให้การปล่อย mem ที่ไม่ได้ใช้ง่ายขึ้น


0

คำตอบน่าจะเป็น MMAP - ข้อมูลอยู่ในดิสก์ แต่เป็น "นอก" การสลับและไม่สามารถมองเห็นได้ด้วยคำสั่ง "ฟรี" หรือ "ด้านบน"

หากกระบวนการ java ไม่ซับซ้อนเกินไปคุณสามารถลองเล่นด้วย "lsof" เพื่อค้นหาว่าไฟล์ MMAP อยู่ที่ไหน อย่างไรก็ตามหากกระบวนการจาวานี้มีความซับซ้อนจะเห็นได้ยาก


-1

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

โชคดีที่มีพารามิเตอร์การปรับเคอร์เนลที่สามารถใช้เพื่อสลับโหมดการบัญชีหน่วยความจำ พารามิเตอร์นี้คือ vm.overcommit_memory และบ่งชี้ว่าอัลกอริทึมใดที่ใช้ในการติดตามหน่วยความจำที่มีอยู่ ค่าเริ่มต้น (0) ใช้วิธีการแก้ปัญหาและ overcommits ระบบหน่วยความจำเสมือน หากคุณต้องการให้โปรแกรมของคุณได้รับข้อผิดพลาดหน่วยความจำไม่เหมาะสมในการจัดสรรแทนที่จะทำให้กระบวนการของคุณเป็นการฆ่าแบบสุ่มคุณควรตั้งค่าพารามิเตอร์นี้เป็น 2

http://www.linuxjournal.com/article/10678


นี่คือความสับสนโดยสิ้นเชิง Overcommit ไม่ใช่สิ่งที่ช่วยให้คุณจัดสรรหน่วยความจำเสมือนได้มากกว่าหน่วยความจำฟิสิคัลรวมถึงพื้นที่สว็อป คุณสามารถทำเช่นนั้นได้โดยไม่ต้อง overcommit (ตัวอย่างเช่นในเครื่องที่มี RAM ขนาด 2GB ไม่มีการแลกเปลี่ยนและไม่มี overcommit คุณยังสามารถหน่วยความจำ map ไฟล์ 4GB อ่านอย่างเดียวโดยใช้หน่วยความจำ 4GB เสมือน.)
เดวิด Schwartz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.