2009-07-03 10 views
7

में लंबी चल रही प्रक्रिया की चोटी मेमोरी माप लिनक्स में किसी प्रक्रिया द्वारा खपत की गई पीक मेमोरी की निगरानी कैसे करूं? यह ऐसा प्रोग्राम नहीं है जिसे मैं आंतरिक स्मृति उपयोग को मापने के लिए आंतरिक रूप से संशोधित कर सकता हूं।लिनक्स

मुझे वास्तव में विस्तृत माप नहीं चाहिए, और न ही मैं उन्हें अपने कार्यक्रम को धीमा करना चाहता हूं .. इसलिए वाल्ग्रिंड या कुछ भी हेवीवेट वह नहीं है जो मैं ढूंढ रहा हूं ... और अन्य पोस्टों की तरह पहले [Peak memory usage of a linux/unix process, समय -v मेरी मशीन के लिए स्मृति की रिपोर्ट नहीं प्रतीत होता है ...

मैं सिर्फ शीर्ष या पीएस चला सकता हूं और के लिए मेमोरी खपत तारों को एक साधारण स्क्रिप्ट का उपयोग करके निकाल सकता हूं। हालांकि, मेरी प्रक्रिया लगभग 20-30 मिनट तक चलती है, इसलिए मैं लॉग इन करने और अधिकतम प्राप्त करने में सक्षम होना चाहता हूं। मैं मोटे अनाज वाले नमूनों को सहन कर सकता हूं ... प्रत्येक 1-मिनट या तो ... विशेष रूप से मैं कैसे कर सकता हूं-> 1. zsh में यह सरल मेम-माप स्क्रिप्ट कांटा? 2. प्रक्रिया-अंडर-टेस्ट खत्म होने पर इसे मार दें?

+0

http://www.serverfault.com? –

उत्तर

2

वास्तव में, मैं क्या कहा से पहले:

"" "

कोशिश

/usr/bin/time -v yourcommand 

कि मदद करनी चाहिए अगर आप केवल का उपयोग करें।" समय ", बैश में निर्मित (निष्पादित करेंगे कि "-v")

"" नहीं है "

(रिटर्न 0) काम नहीं करता।

मैं निम्नलिखित पर्ल स्क्रिप्ट बनाया (कि मैं smaps कहा जाता है): (qgit की स्मृति उपयोग को देखने के लिए उदाहरण के लिए,)

#!/usr/bin/perl 
use 5.010; 
use strict; 
use warnings; 
my $max = 0; 
while(open my $f, '<', "/proc/$ARGV[0]/smaps") { 
    local $/; $_ = <$f>; 
    $max = $1 if /Rss:\s*(\d+)/ and $1 > $max; 
    open my $g, '>', '/tmp/max'; 
    say $g $max 
} 

और फिर मैं इसे कहते:

bash -c './smaps $$ & exec qgit' 

उपयोग एकल उद्धरण इसलिए "बेटी" खोल $$ का अर्थ है (exec के बाद यह qgit का एक ही पीआईडी ​​होगा)। इस जवाब, मैं :-D

HTH परीक्षण किया

+1

2 टुकड़ों में उत्पादन ... अभी भी नहीं उपयोगी :( \t उपयोगकर्ता समय (सेकंड): 16.50 \t प्रणाली समय (सेकंड): 0.47 \t सीपीयू इस नौकरी मिल गई का प्रतिशत: 100% \t बीता हुआ (दीवार घड़ी) समय (एच: मिमी: एसएस या एम: एसएस): 0:16।96 \t औसत साझा पाठ का आकार (Kbytes): 0 – badkya

+1

औसत साझा नहीं की डेटा आकार (Kbytes): 0 \t औसत ढेर आकार (Kbytes): 0 \t औसत कुल आकार (Kbytes): 0 \t अधिकतम निवासी सेट आकार (Kbytes): 0 \t औसत निवासी सेट आकार (Kbytes): 0 \t मेजर (की आवश्यकता होती है आई/ओ) पेज दोष: 0 \t माइनर (एक फ्रेम सुधारने) पेज दोष: 255,315 \t स्वैच्छिक संदर्भ स्विच: 1211 \t अनैच्छिक संदर्भ स्विच: 1232 \t एस WAPS: 0 \t फाइल सिस्टम आदानों: 0 \t फाइल सिस्टम आउटपुट: 68,472 \t सॉकेट संदेश भेजा: 0 \t सॉकेट संदेश प्राप्त: 0 \t पृष्ठ आकार (बाइट): 4096 – badkya

+1

मेमोरी उपयोग क्षेत्रों अगर मैं भी परिवर्तन नहीं करते इसे लंबे समय तक चलाएं ... – badkya

1

आप एक Munin नोड प्लगइन इस्तेमाल कर सकते हैं यह करने के लिए है, लेकिन यह एक छोटे से हैवीवेट है। http://munin.projects.linpro.no/

6

बस निर्दिष्ट समय के पुनरावृत्त करने के लिए शीर्ष पर उपयोग करें, और अपडेट के बीच देरी के लिए। इसके अलावा, आप की तरह अपने पीआईडी ​​grepping, द्वारा केवल उत्पादन अपनी प्रक्रिया के लिए प्रासंगिक हड़पने कर सकते हैं:

top -n 30 -d 60 | grep <process-id> 

अधिक जानकारी

man top 

बेशक के लिए शीर्ष मैन्युअल पृष्ठ पढ़ें, आप भी स्तंभ हड़पने कर सकते हैं अजीब उपयोग करके जरूरत है।

1

/proc/pid/smaps, जैसे/proc/pid/maps, केवल वर्चुअल मेमोरी मैपिंग के बारे में जानकारी देता है, वास्तविक भौतिक स्मृति उपयोग नहीं। शीर्ष और पीएस आरएसएस देते हैं, जो (आप जो जानना चाहते हैं उसके आधार पर) स्मृति उपयोग का एक अच्छा संकेतक नहीं हो सकता है।

एक अच्छी शर्त, यदि आप 2.6.28.7 के बाद लिनक्स कर्नेल पर चल रहे हैं, तो पेजमैप सुविधा का उपयोग करना है। www.eqware.net/Articles/CapturingProcessMemoryUsageUnderLinux पर कुछ टूल के लिए इस पर एक स्रोत है और स्रोत है।

पेज-संग्रह टूल का उद्देश्य सभी प्रक्रियाओं के स्मृति उपयोग को कैप्चर करना है, और इसलिए संभवतः आप जितना चाहें उतना अधिक CPU बोझ लगा सकते हैं। हालांकि, आपको इसे संशोधित करने में आसानी से सक्षम होना चाहिए, ताकि यह केवल एक विशिष्ट प्रक्रिया आईडी के लिए डेटा कैप्चर कर सके। इससे ओवरहेड पर्याप्त हो जाएगा ताकि आप आसानी से इसे हर कुछ सेकंड चला सकें। मैंने कोशिश नहीं की है, लेकिन मुझे लगता है कि पेज-विश्लेषण टूल को बिना बदलाव के चलाना चाहिए।

EQvan

2

massif साथ Valgrind भी भारी नहीं होना चाहिए, लेकिन, मैं का उपयोग कर/proc सलाह देते हैं। आप आसानी से अपनी मॉनीटर स्क्रिप्ट लिख सकते हैं। आपकी सुविधा के लिए मेरा यहां है:

#!/bin/bash 

ppid=$$ 
maxmem=0 

[email protected] & 
pid=`pgrep -P ${ppid} -n -f $1` # $! may work here but not later 
while [[ ${pid} -ne "" ]]; do 
    #mem=`ps v | grep "^[ ]*${pid}" | awk '{print $8}'` 
     #the previous does not work with MPI 
     mem=`cat /proc/${pid}/status | grep VmRSS | awk '{print $2}'` 
    if [[ ${mem} -gt ${maxmem} ]]; then 
     maxmem=${mem} 
    fi 
    sleep 1 
    savedpid=${pid} 
    pid=`pgrep -P ${ppid} -n -f $1` 
done 
wait ${savedpid} # don't wait, job is finished 
exitstatus=$? # catch the exit status of wait, the same of [email protected] 
echo -e "Memory usage for [email protected] is: ${maxmem} KB. Exit status: ${exitstatus}\n" 
1

यह इस बात पर निर्भर करता है कि आप किस प्रकार की मेमोरी की निगरानी करना चाहते हैं।

सभी प्रक्रियाओं की संख्या को क्रमबद्ध करके निम्नलिखित M.a.p.d की निगरानी करना (सभी धागे के नहीं) आपको प्रत्येक प्रक्रिया का उपयोग करने वाले मॉलोक भौतिक स्मृति की निगरानी करने देगा।

आप इसे एक तेज़ प्रोग्राम बनाने के लिए भी लिख सकते हैं लेकिन मुझे लगता है कि इस उद्देश्य के लिए न्यूनतम विकल्प था।

  • मा गुमनाम स्मृति मैप किया
    • पी निजी
      • गंदा == malloc/mmapped ढेर .d और
      • ग साफ == malloc/mmapped ढेर आवंटित और लिखित ढेर स्मृति और एक बार आवंटित, लिखित, फिर मुक्त किया गया, लेकिन फिर से दावा नहीं किया गया
    • । साझा
      • गंदा .d == वहाँ कोई नहीं होना चाहिए
      • ग साफ == कोई भी होना चाहिए
  • Mn नामित मैप की स्मृति
    • पी निजी
      • .d dirty == फ़ाइल mmapped लिखित मेमोरी निजी
      • ग साफ == मैप किया कार्यक्रम/पुस्तकालय पाठ निजी
    • .s साझा
      • .d गंदा == फ़ाइल mmapped लिखा स्मृति साझा
      • मैप किया।ग साफ == मैप किया पुस्तकालय पाठ

मैं नंबर प्राप्त करने के रूप में कम से कम भूमि के ऊपर में वास्तविक संख्या प्राप्त करने के लिए इस प्रकार है पसंद करेंगे मैप की साझा।
आपको आरएसएस के रूप में कौन सी पीएस दिखाता है और भ्रमित नहीं होने के लिए अधिक सटीक संख्याएं प्राप्त करने के लिए इन्हें जोड़ना होगा।

MAPD:

awk '/^[0-9a-f]/{if ($6=="") {anon=1}else{anon=0}} /Private_Dirty/{if(anon) {asum+=$2}else{nasum+=$2}} END{printf "sum=%d\n",asum}' /proc/<pid>/smaps 

Mapc:

awk '/^[0-9a-f]/{if ($6=="") {anon=1}else{anon=0}} /Private_Clean/{if(anon) {asum+=$2}else{nasum+=$2}} END{printf "sum=%d\n",asum}' /proc/<pid>/smaps 

Mnpd: ... और इसलिए

1

बजाय मतदान/proc पर एक अरब बार एक दूसरे, क्यों बस को संसाधित नहीं स्ट्रेस से आउटपुट?

http://tstarling.com/blog/2010/06/measuring-memory-usage-with-strace/

+0

यह स्मृति मैप की गई फ़ाइलों के लिए खाता नहीं है, जो वास्तव में निवासी स्मृति की तरह स्मृति का उपभोग नहीं करता है। – gcb

1

सटीक स्मृति मैट्रिक्स PageMap गिरी इंटरफ़ेस द्वारा दिया जा सकता है - libpagemap पुस्तकालय https://fedorahosted.org/libpagemap/ में उपयोग किया। पुस्तकालय यूजर स्पेस यूटिल भी प्रदान करता है ताकि आप तुरंत मॉनीटर मेमोरी शुरू कर सकें।

1

शिखर/उच्च पानी आरएसएस स्मृति उपयोग को मापने के लिए एक बेहतर विकल्प यहाँ cgmemtime उपकरण उपलब्ध है:

https://github.com/gsauthof/cgmemtime

यह /usr/bin के रूप में उपयोग करने के लिए के रूप में आसान है/समय और से मंदी के बिना वालग्रिंड का मासफ। इसके अलावा, यह कर्नेल सुविधा cgroups नामक सुविधा पर आधारित है, इसलिए यह अन्य मतदान विधियों की तुलना में और भी सटीक है।