ขนาดหน่วยความจำเสมือนจริงที่อยู่บนสุดหมายถึงอะไร?


124

ฉันกำลังtopตรวจสอบประสิทธิภาพเซิร์ฟเวอร์ของฉันและกระบวนการ java ของฉันสองตัวแสดงหน่วยความจำเสมือนสูงถึง 800MB-1GB นั่นเป็นสิ่งที่ไม่ดีเหรอ?

หน่วยความจำเสมือนหมายถึงอะไร

และโอ้ btw ฉันมี swap 1GB และมันแสดงให้เห็นว่าใช้ 0% ดังนั้นฉันจึงสับสน

กระบวนการ Java = 1 เซิร์ฟเวอร์ Tomcat + เซิร์ฟเวอร์ java daemon ของฉันเอง = Ubuntu 9.10 (karmic)


คำตอบ:


142

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

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

แต่นั่นไม่ใช่คำตอบทั้งหมด หากกระบวนการเรียก fork () กระบวนการจะแยกออกเป็นสองส่วนและทั้งคู่จะเริ่มแชร์ RSS ของตนทั้งหมด ดังนั้นแม้ว่า RSS จะเริ่มต้นที่ 1 GB ผลลัพธ์หลังจากการฟอร์กจะเป็นสองกระบวนการแต่ละกระบวนการมี RSS 1 GB แต่คุณยังคงใช้หน่วยความจำเพียง 1 GB เท่านั้น

สับสนหรือยัง นี่คือสิ่งที่คุณต้องรู้จริงๆ: ใช้freeคำสั่งและตรวจสอบผลลัพธ์ก่อนและหลังเริ่มโปรแกรมของคุณ (บน+/- buffers/cacheบรรทัด) ความแตกต่างที่เป็นเท่าใดใหม่หน่วยความจำโปรแกรมที่เพิ่งเริ่มต้นของคุณที่ใช้


2
"ตรวจสอบผลก่อนและหลังการเริ่มต้นโปรแกรมของคุณ" ผลัดกันใช้ยูเอส (ชุดที่เป็นเอกลักษณ์ขนาด) smemที่ส่งกลับโดย
Hubert Kario

ดังนั้นจึงมีเครื่องมือที่ให้หน่วยความจำจำนวนจริงที่ใช้เครื่องมือที่ไม่ใช่บุคคลที่สาม
CMCDragonkai

@CMCDragonkai ใช่ฟรี
deviantfan

1
ถ้าฉันเริ่มต้นกระบวนการจาวาผ่านjava -Xmx16g RunLongซึ่งจะจองหน่วยความจำ 16Gb สำหรับกระบวนการจาวาจากนั้นในVIRTด้านบนดูเหมือนว่า 16Gb จะถูกนับ ในกรณีนี้หน่วยความจำ 16Gb ประเภทนี้เป็นหน่วยความจำที่แมปหรือ .. ?
Eric Wang

1
@EricWang หน่วยความจำนั้นไม่ได้ถูกแมป มันเป็นเพียงแค่ขอให้ระบบปฏิบัติการสำรองหน่วยความจำซึ่งอาจจำเป็นในภายหลัง (อาจไม่เคย) (อย่างน้อยที่สุด) บน Linux นี่คือการเรียก mmap ที่มีค่าสถานะ MAP_NORESERVE และ PROT_NONE (ดู os :: pd_reserve_memory เรียก anon_mmap: github.com/AdoptOpenJDK/openjdk-jdk11u/blob/… ); ไม่มีการจัดสรรหน่วยความจำโดยค่าเริ่มต้นจริง - ซึ่งจะทำภายหลัง ณ จุดที่โปรแกรมต้องการหน่วยความจำจริงๆเพื่อตอบสนองคำขอการจัดสรรวัตถุ
Juraj Martinka

23

จากหน้าผู้ชาย (1) ด้านบน:

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.

      VIRT = SWAP + RES.

โดยที่ RES หมายถึงหน่วยความจำแบบ RESP (ใช้หน่วยความจำกายภาพ)

จริงๆแล้วมันไม่ถูกต้อง (อีกต่อไป) เมื่อมีข้อความว่า "swap" ซึ่งรวมถึงไฟล์ที่โปรแกรมได้แมปลงในพื้นที่ที่อยู่ของโปรแกรมซึ่งอาจจริงหรือไม่อาจใช้ RAM จริง หน่วยความจำนี้ได้รับการสนับสนุนไฟล์ แต่ไม่ได้สลับจริง ๆ

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


2
ที่น่าสนใจก็คือ VIRT = SWAP + RES ทำไมการใช้ SWAP ของฉันจึงเป็นศูนย์ในขณะที่หน่วยความจำเสมือนสำหรับกระบวนการ 2 java นั้นใกล้เคียงกับ 1GB
kapso

โดยทั่วไปแล้วการแสดงยอดนิยม .... Swap: รวม 1048568k, ใช้งาน 0k, ฟรี 1048568k, แคช
505728k

15
@ user42159 คำตอบนี้ไม่ถูกต้อง! ไม่มี 'VIRT = SWAP + RES' ที่อยู่ด้านบนสุดของมนุษย์! -m : VIRT/USED toggle Reports USED (sum of process rss and swap total count) instead of VIRT. มันน่าเสียดายที่ฉันไม่สามารถลงคะแนนคำตอบนี้ได้
duleshi

3
คำตอบนี้ไม่ถูกต้อง USED ​​= Res + Swap Size (จากการจัดการฟิลด์ด้านบนเข้าถึงได้โดยการกดปุ่ม f เมื่ออยู่ด้านบนนอกจากนี้จากหน้าคนบน)
Jason S

14

ฉันพบคำอธิบายนี้จาก Mugurel Sumanariuชัดเจนมาก:

VIRTย่อมาจากขนาดเสมือนจริงของกระบวนการซึ่งเป็นผลรวมของหน่วยความจำที่ใช้จริงหน่วยความจำก็ถูกแมปเข้ากับตัวเอง (เช่น RAM ของการ์ดแสดงผลสำหรับเซิร์ฟเวอร์ X) ไฟล์บนดิสก์ที่ถูกทำแผนที่ลงไป (ส่วนใหญ่ ไลบรารีที่แบ่งใช้โดยเฉพาะอย่างยิ่ง) และหน่วยความจำที่แบ่งใช้กับกระบวนการอื่น VIRT แสดงถึงจำนวนหน่วยความจำที่โปรแกรมสามารถเข้าถึงได้ในขณะนี้

RESย่อมาจากขนาดถิ่นที่อยู่ซึ่งเป็นตัวแทนที่ถูกต้องของหน่วยความจำกายภาพจริงกระบวนการจะบริโภค (สิ่งนี้สอดคล้องกับคอลัมน์% MEM โดยตรง) สิ่งนี้จะน้อยกว่าขนาด VIRT เสมอเนื่องจากโปรแกรมส่วนใหญ่ขึ้นอยู่กับไลบรารี C

SHRระบุจำนวน VIRT ที่สามารถแชร์ได้จริง (หน่วยความจำหรือไลบรารี) ในกรณีของห้องสมุดไม่จำเป็นต้องหมายความว่าห้องสมุดทั้งหมดเป็นที่อยู่อาศัย ตัวอย่างเช่นหากโปรแกรมใช้เพียงไม่กี่ฟังก์ชันในไลบรารีไลบรารีทั้งหมดจะถูกแม็พและจะถูกนับเป็น VIRT และ SHR แต่เฉพาะส่วนของไฟล์ไลบรารีที่มีฟังก์ชั่นการใช้งานจริงเท่านั้นที่จะถูกโหลดเข้ามาและนับ ภายใต้ RES.


ฉันอาจจะแค่พูดคำว่า "VIRT แทนจำนวนหน่วยความจำที่โปรแกรมสามารถเข้าถึงได้ในขณะนี้" กับบางสิ่งเช่น "VIRT หมายถึงขนาดของพื้นที่ที่สามารถกำหนดแอดเดรสได้ทั้งหมดของโปรแกรมในขณะนี้" ตกลงว่ายังคงสามารถใช้ขัด แต่ประเด็นคือ "หน่วยความจำเท่าไหร่" ยังคงให้ความประทับใจที่เรากำลังพูดถึง RAM เมื่อ VIRT ไม่มีอะไรเกี่ยวข้องกับพื้นที่แรม ในความเป็นจริงโปรแกรมขนาดใหญ่มักจะมีขนาด VIRT ที่หลาย MULTIPLEs ของขนาด RAM ทั้งหมดของระบบเพราะ VIRT นั้นเป็นพื้นที่ที่อยู่ที่มีการสำรองไฟล์เกือบทั้งหมด (AKA "disk ไม่ใช่ RAM")
FeRD

5

คอลัมน์ VIRT ในเอาต์พุต ps / top แทบไม่เกี่ยวข้องในการวัดการใช้หน่วยความจำ ไม่ต้องกังวลกับมัน Apache หน่วยความจำโหลด VIRT vs RES หนัก

https://stackoverflow.com/questions/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used


ขอบคุณฉันกังวลและสับสนเพราะในขณะที่การใช้งาน swap เป็น 0% คอลัมน์หน่วยความจำเสมือนจะสูงมาก และฉันมีหน่วยความจำฟิสิคัล 2.7GB ทั้งหมดที่ใช้เพียง 1.7GB ในขณะที่หน่วยความจำเสมือนสูง?
kapso

2

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

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

คุณควรทราบด้วยว่า Linux อนุญาตให้หนึ่งใช้หลายพาร์ติชันสลับและ / หรือแลกเปลี่ยนไฟล์ในเวลาเดียวกัน ซึ่งหมายความว่าหากคุณต้องการพื้นที่สว็อปผิดปกติเป็นครั้งคราวคุณสามารถตั้งค่าไฟล์สว็อปพิเศษในเวลาดังกล่าวแทนการรักษาจำนวนเงินทั้งหมดที่จัดสรรไว้ตลอดเวลา

หมายเหตุเกี่ยวกับคำศัพท์ระบบปฏิบัติการ: วิทยาศาสตร์คอมพิวเตอร์มักจะแยกความแตกต่างระหว่างการแลกเปลี่ยน (การเขียนกระบวนการทั้งหมดเพื่อสลับพื้นที่) และการเพจ (เขียนเฉพาะส่วนที่มีขนาดคงที่โดยปกติจะใช้เวลาไม่กี่กิโลไบต์ต่อครั้ง) โดยทั่วไปแล้วเพจจิ้งจะมีประสิทธิภาพมากกว่าและนั่นคือสิ่งที่ Linux ทำ แต่คำศัพท์ดั้งเดิมของ Linux พูดถึงการสลับสับเปลี่ยนอยู่ดี

ที่มา: http://www.faqs.org/docs/linux_admin/x1752.html


1
คำตอบนี้กระจายความเข้าใจผิดที่หน่วยความจำเสมือนเหมือนกับการสลับหรือการสลับหน้า การใช้ดิสก์เป็นส่วนขยายของ RAM ถือกำเนิดหน่วยความจำเสมือน และมีระบบมากมาย (เช่นเราเตอร์ SoHo ส่วนใหญ่) ที่มีหน่วยความจำเสมือน แต่ไม่ใช้ดิสก์เป็นส่วนขยายของ RAM (และนี่ไม่ใช่คำตอบสำหรับคำถามของ OP เช่นกันเนื่องจากเขาไม่ได้ใช้การแลกเปลี่ยนใด ๆ )
David Schwartz

2

VIRtualคอลัมน์ด้านบนหมายถึง super-space (super สิ้นเปลืองเนื้อที่) ของกระบวนการซึ่งกระบวนการอาจไม่ได้เกิดขึ้นจริงในเวลาทำงาน มีอีกคอลัมน์หนึ่งRESidentซึ่งหมายถึงหน่วยความจำกายภาพ / พื้นที่จริงที่จัดสรรโดยกระบวนการ ณ รันไทม์

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

อ้างถึงข้อมูลเพิ่มเติม


0

"VIRT" เป็นพื้นที่ที่อยู่ RES คือหน่วยความจำ "ของจริง" แต่จำนวน "SHR" (= แชร์) ของ "RES" เป็นส่วนหนึ่งของ RES ที่ใช้ร่วมกับกระบวนการอื่น ๆ ดังนั้นสำหรับกระบวนการส่วนใหญ่ฉันเชื่อว่าการลบ SHR จาก RES ให้ปริมาณหน่วยความจำที่เป็นจริงสำหรับกระบวนการเฉพาะนี้

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