কোনও প্রোগ্রামের র‍্যাম ব্যবহার পরিমাপ করা


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

আপনি কোনও প্রক্রিয়াটির উচ্চ জল মেমরির ব্যবহার (আরএসএস এবং ভার্চুয়াল) পরিমাপ করতে 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) বাচ্চাদের, যারা কনফিগারেশন ডেটা ভাগ করে। তারপরে কার্নেলের দ্বারা পরিচালিত রিডহেড / রাইটহাইন্ড বাফারগুলিতে ডেটা রয়েছে। এবং তারপরে এমন পরিষেবাগুলি রয়েছে যা আলগাভাবে মিলিত প্রক্রিয়াগুলির একটি গোছা (আপনার ডেস্কটপের পরিবেশ এবং এর সমস্ত অ্যাপলেট এবং পটভূমি স্টাফের কথা ভাবেন)।
ভোনব্র্যান্ড

@ ভনব্র্যান্ড, কীভাবে লিনাক্স-কার্নেল আরএসএস / ভিএসএস মানগুলি সুসংজ্ঞায়িত করে তা গণনা করে।
ম্যাক্সচলেপজিগ

@ ম্যাক্সচলেপজিগ, এটি কিছু এলোমেলো মানগুলি ভালভাবে গণনা করতে পারে, এর অর্থ এই নয় যে আপনি কী বোঝাতে চেয়েছেন তার অর্থ: আবাসিক সেটটি প্রক্রিয়াটির ঠিক পৃষ্ঠা যা অ্যাড্রেস স্পেস যা বর্তমানে স্মৃতিতে রয়েছে। যে না "এই প্রক্রিয়া দ্বারা ব্যবহৃত মেমরি", এটা অন্তর্ভুক্ত যাহা এটা ভাগ করছে।
ভোনব্র্যান্ড

@ ভনব্র্যান্ড একটি প্রক্রিয়াটির মেমরির ব্যবহার পরিমাপের বেশিরভাগ ব্যবহারের ক্ষেত্রে আন-ভাগ করা অনামী পৃষ্ঠাগুলি পরিমাপ করতে চাইবে, যা একই ইনপুটটির সাথে খুব অনুমানযোগ্য হওয়া উচিত।
ভ্লাদিমির পানতেলিভ

28

timeআপনার শেল একটি অন্তর্নির্মিত। আপনি যদি পছন্দ করেন timeতবে আরও তথ্যের প্রয়োজন 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

আপনার প্যাকেজ পরিচালকের মধ্যে প্যাকেজ "সময়" বা "gnutime" অনুসন্ধান করুন।


3
নোট করুন যে GNU সময় রিপোর্ট কিছু তথ্য ভুল হতে পারে। উদাহরণস্বরূপ উবুন্টু 10.04 এর অধীনে: ম্যান পেজটিতে বলা হয়েছে 'সংখ্যাগুলি কেবল ততটাই ভাল যা ওয়েট 3 (2) দ্বারা ফিরে এসেছে'। অর্থাত wait3একটি কাঠামো যা বর্ণনা করা হয়েছে পূরণ getrusage(2): 'সব ক্ষেত্র লিনাক্স অধীনে অর্থপূর্ণ হয়। [..]।
maxschlepzig

4
উদাহরণস্বরূপ একটি পরীক্ষা প্রোগ্রামে যা ঠিক 10 এমবি বরাদ্দ করে (এবং প্রতিটি পৃষ্ঠা স্পর্শ করে) - GNU সময় 42608 কিবি tstimeসর্বাধিকআরএসএস রিপোর্ট করে এবং 10652 কিবি প্রতিবেদন করে। আবার উবুন্টু 10.04 এর অধীনে।
maxschlepzig

আমি যদি এই সহজ ছিল পছন্দ করতাম। আমার উবুন্টু মেশিন উপর আমি চেষ্টা: /usr/bin/time -v perl -e '$a="x"x100000000;$b=$a.$a;sleep 10;'। শীর্ষগুলি বলে এটি প্রায় 570 এমবি লাগে, তবে সময়টি বলে 2.3 জিবি। অনুশীলনে এই সংখ্যাটি আমার পক্ষে ব্যবহারযোগ্য নয়।
ওলে টেঞ্জ

4 এর ফ্যাক্টরটি GNU সময় 1.7 এ স্থির করা হয়েছে এবং এটি প্রত্যাশার মতো কাজ করে।
ওলে টাঙে

গুরুত্বপূর্ণ দ্রষ্টব্য: "সর্বোচ্চ আবাসিক সেট আকার" কেবল লিনাক্স 2.6.32 থেকে কাজ করে।
জানু হুডেক

17

হয়তো ওভারকিল, কিন্তু আমি সবেমাত্র পেয়েছি যার 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
আমার 20x গতির পেনাল্টি এটি আমার পরিস্থিতির জন্য অযোগ্য করে তোলে। নাহলে খুব সুন্দর গ্রাফ!
ওলে টেঞ্জ

1
দেখে মনে হচ্ছে, কমপক্ষে 8.৮.১ সংস্করণে আমি যে ভ্যালগ্র্রিন্ডটি ব্যবহার করছি সেগুলিতে, বুলিয়ানরা কেবল "হ্যাঁ / না" আকারে স্বীকৃত এবং "সত্য / মিথ্যা" নয়। আমার অভিযোগ! :-)
মকিশ এইচ

6

যদিও বিষয়টি বেশ পুরানো, আমি সিগ্রুপ লিনাক্স কার্নেল বৈশিষ্ট্য থেকে উদ্ভূত অন্য একটি প্রকল্প ভাগ করতে চাই।

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

সিজিএমটাইম একটি প্রক্রিয়া এবং এর বংশধর প্রক্রিয়াগুলির উচ্চ-জল আরএসএস + ক্যাস মেমরির ব্যবহার পরিমাপ করে।

এটি করতে সক্ষম হওয়ায় এটি প্রক্রিয়াটিকে তার নিজস্ব সিগ্রুপে রাখে।

উদাহরণস্বরূপ প্রক্রিয়া এ 10 মাইবি বরাদ্দ করে এবং 20 টি মাইব বরাদ্দকারী একটি শিশুকে কাঁটাচামচ করে এবং এটি এমন 30 টি মাইবি বরাদ্দকারী একটি শিশু সিকে কাঁটাচামচ করে। তিনটি প্রক্রিয়া একটি টাইম উইন্ডো ভাগ করে যেখানে তাদের বরাদ্দগুলির ফলে সংশ্লিষ্ট আরএসএস (আবাসিক সেট আকার) মেমরির ব্যবহার হয়।

এখন প্রশ্নটি: এ চালানোর ফলে আসলে কত স্মৃতি ব্যবহৃত হয়?

উত্তর: 60 মাইবি

সিজিএমটাইম হ'ল এই জাতীয় প্রশ্নের উত্তর দেওয়ার হাতিয়ার।


3

দেখে মনে হচ্ছে tstime লিনাক্স> = 3.0 এর অধীনে নন-রুটের অধীনে আর কাজ করে না। আমি ইস্যুটি হ্যাক করতে একটি পোলিং ইউটিলিটি এখানে লিখেছি: https://github.com/jhclark/memusg/blob/master/memusg


/usr/bin/time -vআরও নতুন সংস্করণে সঠিক ফলাফল দেয়। পুরানো সংস্করণগুলিতে সঠিক পরিমাণটি পেতে আপনাকে কেবল 4 দিয়ে ভাগ করতে হবে।
ওলে টেঞ্জ

যাইহোক, আমি মনে করি না সময় -v পিক vmemory আকার (শুধুমাত্র আরএসএস) সমর্থন করে। কেউ কি সর্বশেষতম সংস্করণে এটি নিশ্চিত করতে পারবেন?
jhclark
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.