यदि मैं 'ps -ef' करता हूं तो मैं प्रत्येक प्रक्रिया के मेमोरी उपयोग को कैसे प्रदर्शित कर सकता हूं?


24

लिनक्स में, मैं प्रत्येक प्रक्रिया का मेमोरी उपयोग कैसे प्रदर्शित कर सकता हूं यदि मैं ए करता हूं ps -ef? मैं प्रत्येक प्रगति की 'वर्चुअल मेमोरी', 'रेस मेमोरी', 'साझा मेमोरी' देखना चाहूंगा। मुझे वह मिल सकता है top, लेकिन मुझे वही जानकारी चाहिए ps -efताकि मैं grepअपने प्रोसेस नाम के साथ आउटपुट को पाइप कर सकूं ।

जवाबों:


8

पीएस के माध्यम से स्मृति उपयोग प्राप्त करना बहुत अविश्वसनीय है। यदि आपके पास एक नया कर्नेल है, तो इसे / proc / pid # / smaps का समर्थन करना चाहिए जो आपको प्रत्येक प्रक्रिया मेमोरी उपयोग पर कुछ विस्तृत जानकारी देता है। नीचे प्रत्येक प्रक्रिया के माध्यम से लूप करने के लिए एक बहुत ही गंदी और त्वरित स्क्रिप्ट है जो आकार, रुपये, Pss और साझा स्वच्छ / गंदा उपयोग को खोलती है और पकड़ती है। उम्मीद है कि यह किसी तरह से उपयोगी हो सकता है।

#!/bin/bash

for pid in $(ps -ef | awk '{print $2}'); do
    if [ -f /proc/$pid/smaps ]; then
            echo "* Mem usage for PID $pid"
            echo "-- Size:"
            cat /proc/$pid/smaps | grep -m 1 -e ^Size: | awk '{print $2}'
            echo "-- Rss:"
            cat /proc/$pid/smaps | grep -m 1 -e ^Rss: | awk '{print $2}'
            echo "-- Pss:"
            cat /proc/$pid/smaps | grep -m 1 -e ^Pss: | awk '{print $2}'
            echo "Shared Clean"
            cat /proc/$pid/smaps | grep -m 1 -e '^Shared_Clean:' | awk '{print $2}'
            echo "Shared Dirty"
            cat /proc/$pid/smaps | grep -m 1 -e '^Shared Dirty:' | awk '{print $2}'
    fi
done

1
आपको आकार कॉलम को समेटना चाहिए। नीचे देखें एज़स्मिथ का उत्तर।
तुलसी एक

11

ps ef -o command,vsize,rss,%mem,size

मुझे साझा मेमोरी के लिए कोई विकल्प नहीं मिला, लेकिन मुझे कुल भौतिक मेमोरी के% और स्वैपस्पेस की मात्रा के लिए विकल्प मिला, जो प्रक्रिया को स्वैप करने के लिए आवश्यक होगा। यह और बहुत कुछ पीएस के लिए मैन पेज में प्रलेखित है।


लिनक्स खातों में प्रत्येक प्रक्रिया के लिए मेमोरी को साझा किया जाता है, जो एक लार्जिश साझा मेमोरी सेगमेंट से जुड़ी बहुत सारी प्रक्रियाएं होने पर फर्जी रकम का कारण बन सकता है। top, psऔर इसी तरह के कार्यक्रम सभी इसी तरह से प्रभावित होते हैं।
पीटर आइसेनट्राट

मुझे पता है कि साझा की गई मेमोरी कैसे काम करती है, लेकिन ऐसा प्रतीत होता है कि ps उस जानकारी को प्रदान नहीं कर सकता है (या मैं इसे अपने ps डॉक्यूमेंटेशन में नहीं पा रहा था, कम से कम)। शीर्ष या htop वास्तव में प्रति प्रक्रिया के आधार पर साझा स्मृति उपयोग दिखा सकते हैं।
जस्टिन स्मिथ

9

@ user26528 का उत्तर मेमोरी की सही गणना नहीं करता है - आपको केवल शीर्ष पर नहीं, बल्कि स्मैप्स में मैपिंग के योग की आवश्यकता है। इस स्क्रिप्ट को यह करना चाहिए:

#!/bin/bash

for pid in $(ps -ef | awk '{print $2}'); do
    if [ -f /proc/$pid/smaps ]; then
        echo "* Mem usage for PID $pid"     
        rss=$(awk 'BEGIN {i=0} /^Rss/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        pss=$(awk 'BEGIN {i=0} /^Pss/ {i = i + $2 + 0.5} END {print i}' /proc/$pid/smaps)
        sc=$(awk 'BEGIN {i=0} /^Shared_Clean/ {i = i + $2} END {print i}' /proc/$pid/smaps)            
        sd=$(awk 'BEGIN {i=0} /^Shared_Dirty/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        pc=$(awk 'BEGIN {i=0} /^Private_Clean/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        pd=$(awk 'BEGIN {i=0} /^Private_Dirty/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        echo "-- Rss: $rss kB" 
        echo "-- Pss: $pss kB"
        echo "Shared Clean $sc kB"
        echo "Shared Dirty $sd kB"
        echo "Private $(($pd + $pc)) kB"
    fi
done

आउटपुट: पंक्ति 16: +: वाक्यविन्यास त्रुटि: ऑपरेंड अपेक्षित (त्रुटि टोकन "+" है) जो कि वह पंक्ति है जिसमें शामिल है: गूंज "निजी $ (($ pd + $ पीसी)) kB", मैं CentOS 7 पर चल रहा हूं ।
तुलसी एक

2
@ स्टीव क्यों Pss में 0.5 जोड़ते हैं?
पीट

1
10,000 छोटी Awk लिपियों को चलाना एक विशाल एंटीपैटर्न है, आपको बस इस सभी को एक एकल Awk स्क्रिप्ट में रिफ्लेक्टर करना चाहिए।
7

लेकिन यह लिपि स्वयं बहुत अधिक स्मृति का उपभोग करती है
mehmet riza oz

8

मेमोरी उपयोग द्वारा प्रक्रियाओं को सूचीबद्ध करें

ps -e -orss =, args = | सॉर्ट -b -k1,1n


ps -e -orss=,pid=,args= | sort -b -k1,1nप्रक्रिया आईडी को शामिल करने के लिए उपयोग करें
याकूब

psअपने दम पर सॉर्ट कर सकते हैं:ps -eo rss=,args= --sort +rss
फिल्प २


3

मेम उपयोग द्वारा प्रक्रियाओं को सूचीबद्ध करें

कमांड: ps -e -orss =, args = | सॉर्ट -b -k1,1n | पीआर -TW $ COLUMNS \


3

अद्यतन करें:

निम्न एक-लाइनर वर्तमान उपयोगकर्ता द्वारा कुल मेमोरी खपत की जानकारी भी प्रदान करता है।

echo "------------------------------------" && mem=0 && while read -r rss comm ; do mbs=$((rss/1024)); mem=$((mbs + mem)); echo $mbs"MB - $comm"; done <<< "$(ps -u $USER -wo rss=,comm= --sort -rss)" && echo "------------------------------------" && echo $mem"MB: Memory used by user '$USER'"

मैंने अभी-अभी MB में उच्चतम मेमोरी उपयोग द्वारा क्रमबद्ध सभी उपयोगकर्ता प्रक्रियाओं को इस तरह सूचीबद्ध किया है:

ps -u $USER -wo rss=,comm= --sort -rss | while read -r rss comm ; do echo $((rss/1024))"MB -" $comm; done

आप पूर्ण पथ प्रक्रिया दिखाने के command=बजाय उपयोग कर सकते हैं comm=

=बस स्तंभ शीर्षक निकाल देता है।


3

मैंने पाया कि कई बार एक ही प्रक्रिया में कांटा उप प्रक्रिया होती है और आप इस प्रक्रिया द्वारा उपयोग की जाने वाली कुल मेमोरी में रुचि रखते हैं। उदा। Google क्रोम कई प्रक्रिया शुरू करता है और आप क्रोम द्वारा ली गई कुल मेमोरी को जानना चाहते हैं। मुझे एक लाइन कमांड के नीचे बहुत उपयोगी लगी

echo "%CPU   %MEM    MEM     PROCESS"
ps aux | awk '{mem[$11]+=int($6/1024)}; {cpuper[$11]+=$3};{memper[$11]+=$4}; END {for (i in mem) {print cpuper[i]"% ",memper[i]"% ",mem[i]" MB ",i}}' | sort -k3nr | head -n 5

यह बहुत सी चीजों का ध्यान रखता है, जैसे एमबी में मेमोरी दिखाना, मेमोरी पर सॉर्ट करना और मुख्य रूप से कमांड द्वारा समूहीकरण करना। यह% CPU और% मेमोरी को भी समूहीकृत कर रहा है। यह उपयोगकर्ता के अनुकूल प्रारूप में डेटा दिखा रहा है।

यह आदेश इस उत्तर से प्रेरित था और इसने मुझे यह जानने में बहुत मदद की कि कौन सी प्रक्रिया मेरे संसाधनों को ले रही है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.