2012-05-01 4 views
9

मैं एक निश्चित प्रक्रिया के स्मृति उपयोग के बारे में एक सुराग प्राप्त करने के लिए /proc/[pid]/statm से डेटा पार्स करता हूं। man proc बताता है कि निवासी सेट आकार ('पृष्ठों' में मापा गया) /proc/[pid]/status में VmRSS (KB ??) जैसा ही है। चूंकि उनके पास अलग-अलग मूल्य हैं, इसलिए मैं इन मानों के बीच कनेक्शन को समझना चाहता हूं। क्या कोई ऐसा कारक है जो मैं /proc में कहीं पढ़ सकता हूं (मैंने वीएमपीटीई के बारे में सोचा था लेकिन इसके sth। Else ...)? किसी निश्चित प्रक्रिया के लिए प्रयुक्त मेमोरी का आकार प्राप्त करने के लिए मुझे दोनों में से कौन सा विश्लेषण करना चाहिए?वीएमआरएसएस और निवासी सेट आकार कैसे मेल खाता है?

#ex 1782 = firefox 

~$ cat /proc/1782/statm 
    224621 46703 9317 11 0 98637 0 
#   \--- resident set size 

~$ cat /proc/1782/status | grep Vm 
    VmPeak:  935584 kB 
    VmSize:  898484 kB 
    VmLck:   0 kB 
    VmHWM:  257608 kB 
    VmRSS:  186812 kB 
    VmData:  394328 kB 
    VmStk:   220 kB 
    VmExe:   44 kB 
    VmLib:  61544 kB 
    VmPTE:  1224 kB 
    VmSwap:   0 kB 

उत्तर

13

मेरी समझ यह है कि वीएम वर्चुअल मेमोरी की मात्रा है और आरएसएस यह है कि इसमें से कितना स्मृति में निवासी है। तो,

आभासी स्मृति = डिस्क

हिस्सा भौतिक स्मृति में पर भौतिक स्मृति + भाग में हिस्सा आरएसएस है। तो, वीएसएस आरएसएस से बड़ा होना चाहिए। यदि वे बराबर के करीब हैं, तो इसका मतलब है कि आपकी प्रक्रिया स्मृति में आराम से बैठी है। यदि वीएसएस बहुत बड़ा है, तो इसका मतलब है कि पर्याप्त मेमोरी नहीं है और इसके कुछ हिस्सों को डिस्क पर बदल दिया जाना चाहिए (यानी, प्रतिस्पर्धी प्रक्रिया आदि के कारण)।

अपने सिस्टम पर, मैं एक "आदमी proc" क्या कर सकते हैं और यह निम्नलिखित सूचीबद्ध करता है:

  * VmPeak: Peak virtual memory size. 

      * VmSize: Virtual memory size. 

      * VmLck: Locked memory size (see mlock(3)). 

      * VmHWM: Peak resident set size ("high water mark"). 

      * VmRSS: Resident set size. 

      * VmData, VmStk, VmExe: Size of data, stack, and text segments. 

आप शिखर स्मृति उपयोग रिपोर्ट करना चाहते हैं, तो आप शायद आभासी स्मृति है, जो VmPeak तरह लग रहा है चाहता हूँ ।

आशा है कि इससे मदद मिलती है!

+0

है मैं कहाँ proc से मूल्य प्राप्त करने के पता नहीं है, लेकिन मुझे लगता है मेरी pagesize 4KB है। मैं वीएमपीटीई द्वारा उलझन में था। ऐसा लगता है कि 'पृष्ठ तालिका के [पिड] भाग का आकार', फिर 'बफर प्रविष्टि का आकार' :) – lupz

+0

हां, इनमें से बहुत से मूल्य सिस्टम-निर्भर हैं। कुछ प्रणालियों में मैंने काम किया है, उनमें से कुछ मान हमेशा 0 दे देंगे क्योंकि समर्थन कर्नेल में संकलित नहीं किया गया है। तो हाँ, विश्वास न करें कि मेरे आदमी पेज क्या कहते हैं क्योंकि वे आपके सिस्टम के लिए प्रासंगिक नहीं हो सकते हैं। – Ray

+2

दरअसल, वर्चुअल मेमोरी = डिस्क में भाग + डिस्क पर भाग + वर्चुअल एड्रेस स्पेस भौतिक मेमोरी में मैप नहीं किया गया है + मेमोरी मैप की गई फाइलें + साझा मेमोरी। तो स्मृति खपत को मापने के लिए, VmSize बहुत बेकार है। Http://stackoverflow.com/questions/13308684/increase-of-virtual-memory-without-increse-of-vmsize – vcarel

23

/proc/<pid>/stat का आरएसएस मूल्य पृष्ठों की संख्या है, जबकि /proc/<pid>/status का वीएमआरएसएस मूल्य केबी में है।

आपके मामले में, 46703 * 4 केबी (पृष्ठ का आकार) = 186812 केबी।

proc राज्यों के लिए
+2

@lupz का पहला उत्तर देखें, इस उत्तर को सही मानने पर विचार करें। [proc (5)] (http://linux.die.net/man/5/proc) मैनपेज में प्रलेखित के रूप में। –

4

मैन पेज statm संदर्भ

/proc/[pid]/statm 
Provides information about memory usage, measured in pages. The columns are: 

    size  (1) total program size 
      (same as VmSize in /proc/[pid]/status) 
    resident (2) resident set size 
      (same as VmRSS in /proc/[pid]/status) 
    share  (3) shared pages (i.e., backed by a file) 
    text  (4) text (code) 
    lib  (5) library (unused in Linux 2.6) 
    data  (6) data + stack 
    dt   (7) dirty pages (unused in Linux 2.6) 

लेकिन क्या यह राज्य के लिए विफल रहता है कि size और resident पृष्ठों की संख्या में व्यक्त कर रहे है में निम्नलिखित।

~$ cat /proc/1782/statm 
    224621 46703 9317 11 0 98637 0 
#   \--- resident set size 

इस प्रकार, 46703 निवासी समूह का आकार और पृष्ठों की संख्या में व्यक्त किया है और 224621 है वर्चुअल मेमोरी आकार के साथ-साथ पृष्ठों की संख्या में व्यक्त किया।

अब उन्हें केबी में प्राप्त करने के लिए उन्हें पृष्ठ आकार के साथ गुणा करें। sysconf(_SC_PAGE_SIZE) (unistd.h में परिभाषित) को कॉल करके आप getconf PAGESIZE कमांड या C/C++ प्रोग्राम के साथ पृष्ठ आकार प्राप्त कर सकते हैं। यह आपको बाइट्स में पृष्ठ का आकार देगा। केबी में पृष्ठ आकार प्राप्त करने के लिए इसे 1024 के साथ विभाजित करें।

उदाहरण:

$getconf PAGESIZE 
4096 

4096/1024 = 4 KB

इस प्रकार, KB का निवासी समूह का आकार और 46703 x 4 = 186,812 kB (VmRSS) है।
KB में कुल कार्यक्रम आकार 224,621 x 4 = 898,484 kB (VmSize)

संबंधित मुद्दे