किसी प्रोग्राम का RAM उपयोग मापना


46

time एक शानदार कमांड है यदि आप यह जानना चाहते हैं कि किसी दिए गए कमांड में कितना सीपीयू समय लगता है।

मैं कुछ इसी तरह की तलाश कर रहा हूं, जो कार्यक्रम और किसी भी बच्चे के अधिकतम रैम के उपयोग को माप सके। अधिमानतः इसे आवंटित स्मृति के बीच अंतर करना चाहिए जो कि उपयोग और अप्रयुक्त था। हो सकता है कि यह मध्ययुगीन स्मृति उपयोग भी दे सकता है (इसलिए स्मृति उपयोग जो आपको लंबे समय तक चलने की उम्मीद करनी चाहिए)।

इसलिए मैं करना चाहूंगा:

rammeassure my_program my_args

और इसके समान आउटपुट प्राप्त करें:

Max memory allocated: 10233303 Bytes
Max memory used: 7233303 Bytes
Median memory allocation: 5233303 Bytes

मैंने memusg https://gist.github.com/526585/590293d6527c91e48fcb08edb8de9fd6c88a6d82 देखा है, लेकिन मेरा मानना ​​है कि कुछ हद तक हैक है।

जवाबों:


24

आप किसी प्रक्रिया के उच्च जल स्मृति उपयोग (RSS और वर्चुअल) को मापने के लिए tstime का उपयोग कर सकते हैं ।

उदाहरण के लिए:

$ tstime date       
Tue Aug 16 21:35:02 CEST 2011

Exit status: 0

pid: 31169 (date) started: Tue Aug 16 21:35:02 2011
        real   0.017 s, user   0.000 s, sys   0.000s
        rss      888 kb, vm     9764 kb

यह आउटपुट मोड को पार्स करने के लिए एक अधिक आसान समर्थन भी करता है -t


मुझें यह पसंद है। इसने द थिंग थिंग के साथ भी किया./tstime -t bash -c 'perl -e "\$a=\"x\"x100000000;\$b=\$a.\$a;\$b=\"\";\$a=\"\";sleep 10;"'
ओले तांगे

3
"प्रक्रिया द्वारा रैम का उपयोग" एक अच्छी तरह से परिभाषित मूल्य नहीं है: यदि एक ही कार्यक्रम के कई उदाहरण चल रहे हैं, तो वे निष्पादन योग्य साझा करते हैं। अधिकांश कार्यक्रम साझा करते हैं glibc(और अन्य मिश्रित पुस्तकालय, उन्हें किसी चीज़ के लिए "साझा" कहा जाता है)। कई डेमॉन स्मृति और कांटा (2) बच्चों में कॉन्फ़िगरेशन लोड करते हैं, जो फिर कॉन्फ़िगरेशन डेटा साझा करते हैं। फिर कर्नेल द्वारा प्रबंधित रीडहेड / राइटबाइंड बफ़र्स में डेटा होता है। और फिर ऐसी सेवाएं हैं जो शिथिल युग्मित प्रक्रियाओं का एक झुंड हैं (अपने डेस्कटॉप पर्यावरण और इसके सभी एप्लेट्स और पृष्ठभूमि सामान के बारे में सोचें)।
वॉनब्रांड

@vonbrand, कैसे लिनक्स-कर्नेल RSS / VSS मानों को अच्छी तरह से परिभाषित करता है।
मैक्सक्लेपजिग

@maxschlepzig, यह अच्छी तरह से कुछ यादृच्छिक मूल्यों की गणना कर सकता है, इसका मतलब यह नहीं है कि उनका मतलब यह है कि आपको लगता है कि उनका मतलब है: निवासी सेट प्रक्रिया के पता स्थान में केवल पृष्ठ हैं जो वर्तमान में स्मृति में हैं। वह "इस प्रक्रिया द्वारा उपयोग की जाने वाली मेमोरी" नहीं है, इसमें जो कुछ भी है वह साझा करना शामिल है।
वॉनब्रांड

@vonbrand किसी प्रक्रिया के मेमोरी उपयोग को मापने के अधिकांश उपयोग के मामले अन-शेयर्ड अनाम पेजों को मापना चाहेंगे, जो एक ही इनपुट के साथ बहुत पूर्वानुमानित होना चाहिए।
व्लादिमीर पेंटेलेव

28

timeआपके शेल का बिल्ट-इन है। यदि आपको पसंद है, timeलेकिन अधिक जानकारी की आवश्यकता है, तो GNU timeको वर्बोज़ ( -v) मोड में आज़माएँ :

/usr/bin/time -v sleep 5               
    Command being timed: "sleep 5"
    User time (seconds): 0.00
    System time (seconds): 0.00
    Percent of CPU this job got: 0%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:05.00
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 2144
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 179
    Voluntary context switches: 2
    Involuntary context switches: 1
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

अपने पैकेज मैनेजर में पैकेज "टाइम" या "गनटाइम" खोजें।


3
ध्यान दें कि GNU समय द्वारा बताई गई कुछ जानकारी गलत हो सकती है। उदाहरण के लिए Ubuntu 10.04 के तहत: मैन पेज में कहा गया है कि संख्याएँ उतनी ही अच्छी हैं जितनी कि प्रतीक्षा 3 (2) द्वारा लौटाई गईं। Ie wait3एक संरचना को भरता है जो इसमें वर्णित है getrusage(2): 'सभी क्षेत्र लिनक्स के तहत सार्थक नहीं हैं। [..] '।
मैक्सक्लेपजिग

4
उदाहरण के लिए एक परीक्षण कार्यक्रम जो 10 एमबी आवंटित करता है (और प्रत्येक पृष्ठ को छूता है) - जीएनयू समय अधिकतम 42608 KiB की tstimeरिपोर्ट करता है - और 10652 KiB रिपोर्ट करता है। फिर से Ubuntu 10.04 के तहत।
19

अगर यह सरल होता तो मुझे बहुत अच्छा लगता। मेरे उबंटू मशीन पर मैंने कोशिश की /usr/bin/time -v perl -e '$a="x"x100000000;$b=$a.$a;sleep 10;':। शीर्ष कहते हैं कि यह लगभग 570 एमबी है, लेकिन समय 2.3 जीबी कहता है। व्यवहार में वह संख्या मेरे लिए उपयोग करने योग्य नहीं है।
ओले तांगे

4 का कारक जीएनयू समय 1.7 में तय किया गया है और इस प्रकार अपेक्षा के अनुरूप काम करता है।
ओले तांगे

महत्वपूर्ण नोट: "अधिकतम निवासी सेट आकार" केवल लिनक्स 2.6.32 के बाद से काम करता है।
Jan Hudec

17

शायद overkill, लेकिन मुझे अभी पता चला है कि valgrindएक अच्छा उपकरण है जिसका नाम है massif। मैंने इस पर परीक्षण किया xterm:

valgrind --trace-children=yes --tool=massif xterm
ms_print massif.out.* | less

और आप एक अच्छा मेमोरी उपयोग ग्राफ प्राप्त करते हैं:

    MB
4.230^                     #                    :::::::  :::      @@:     ::: 
     |   @                 #:::@::@@:::::@::::::: :: : ::: :::::::@ ::::::: ::
     |   @               ::#:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::::@@:::::::::: #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
   0 +----------------------------------------------------------------------->Mi
     0                                                                   292.4

विस्तृत रूप से विस्तृत मेमोरी उपयोग जानकारी के साथ। वैलेरिंड मैनुअल में विवरण ।

कार्यक्रम लगभग 20x धीमी गति से चलेंगे। इसके अलावा, मैं अंदर कुछ कमांड भागा xterm। उनके स्मृति पदचिह्न को ध्यान में रखा गया है क्योंकि --trace-children=yesविकल्प है!


1
Th 20x गति दंड यह मेरी स्थिति के लिए अनुपयुक्त बनाता है। अन्यथा बहुत सुंदर ग्राफ!
ओले तांगे

1
ऐसा लगता है कि, कम से कम संस्करण 3.8.1 के वैलग्राइंड में जो मैं उपयोग कर रहा हूं, बूलियनों को केवल "हां / नहीं" के रूप में स्वीकार किया जाता है और "सच / गलत" नहीं। खान ने शिकायत की! :-)
मकिश

6

हालाँकि यह विषय काफी पुराना है, फिर भी मैं एक और प्रोजेक्ट साझा करना चाहता हूँ जो cgroups Linux कर्नेल फीचर से उभरा है।

https://github.com/gsauthof/cgmemtime :

cgmemtime एक प्रक्रिया और इसके वंशज प्रक्रियाओं की उच्च-जल RSS + CACHE स्मृति उपयोग को मापता है।

ऐसा करने में सक्षम होने के लिए यह प्रक्रिया को अपने स्वयं के समूह में डालता है।

उदाहरण के लिए प्रक्रिया A में 10 MiB आवंटित होता है और एक बच्चा B को आवंटित होता है जो 20 MiB को आवंटित करता है और वह एक बच्चा C को कांटा करता है जो 30 MiB आवंटित करता है। सभी तीन प्रक्रियाएँ एक समय विंडो साझा करती हैं जहाँ उनके आवंटन के परिणामस्वरूप RSS (निवासी सेट आकार) मेमोरी उपयोग होता है।

अब सवाल यह है कि A को चलाने के परिणामस्वरूप वास्तव में कितनी मेमोरी का उपयोग किया जाता है?

उत्तर: 60 MiB

cgmemtime इस तरह के सवालों का जवाब देने के लिए उपकरण है।


3

ऐसा लगता है कि लिनक्स> = 3.0 के तहत बिना रूट के tstime काम नहीं करता है। इस मुद्दे के बारे में हैक करने के लिए मैंने एक पोलिंग यूटिलिटी लिखी है: https://github.com/jhclark/memusg/blob/master/memusg


/usr/bin/time -vनए संस्करणों में सही आउटपुट देता है। पुराने संस्करणों में आपको सही राशि प्राप्त करने के लिए केवल 4 से भाग देने की आवश्यकता होती है।
ओले तांगे

हालाँकि, मुझे नहीं लगता कि समय -v शिखर vmemory आकार (केवल RSS) का समर्थन करता है। किसी को भी नवीनतम संस्करण पर इस बात की पुष्टि कर सकते हैं?
jhclark
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.