वास्तविक स्मृति उपयोग द्वारा क्रमबद्ध शीर्ष प्रक्रियाओं को कैसे देखें?


240

मेरे पास 12G मेमोरी वाला सर्वर है। शीर्ष का एक टुकड़ा नीचे दिखाया गया है:

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                                                                                                                                      
12979 frank  20   0  206m  21m  12m S   11  0.2  26667:24 krfb                                                                                                                                                                                                                                                          
13 root      15  -5     0    0    0 S    1  0.0  36:25.04 ksoftirqd/3                                                                                                                                                                                                                                                   
59 root      15  -5     0    0    0 S    0  0.0   4:53.00 ata/2                                                                                                                                                                                                                                                         
2155 root      20   0  662m  37m 8364 S    0  0.3 338:10.25 Xorg                                                                                                                                                                                                                                                          
4560 frank  20   0  8672 1300  852 R    0  0.0   0:00.03 top                                                                                                                                                                                                                                                           
12981 frank  20   0  987m  27m  15m S    0  0.2  45:10.82 amarok                                                                                                                                                                                                                                                        
24908 frank  20   0 16648  708  548 S    0  0.0   2:08.84 wrapper                                                                                                                                                                                                                                                       
1 root      20   0  8072  608  572 S    0  0.0   0:47.36 init                                                                                                                                                                                                                                                          
2 root      15  -5     0    0    0 S    0  0.0   0:00.00 kthreadd

free -mशो के बाद:

             total       used       free     shared    buffers     cached
Mem:         12038      11676        362          0        599       9745
-/+ buffers/cache:       1331      10706
Swap:         2204        257       1946

अगर मैं सही तरीके से समझूं, तो सिस्टम में केवल 362 एमबी उपलब्ध मेमोरी है। मेरा प्रश्न है: मैं कैसे पता लगा सकता हूं कि कौन सी प्रक्रिया मेमोरी की सबसे अधिक खपत कर रही है?

पृष्ठभूमि जानकारी के रूप में, सिस्टम चल रहा है 64bit OpenSuse 12


जवाबों:


280

सबसे पहले, इस मंत्र को थोड़ी देर के लिए दोहराएं: "अप्रयुक्त स्मृति व्यर्थ स्मृति है"। लिनक्स कर्नेल बड़ी मात्रा में फ़ाइल मेटाडेटा और फ़ाइलों के आसपास रखता है , जो तब तक अनुरोध किए जाते थे, जब तक कि कुछ ऐसा नहीं दिखता जो उस डेटा को अधिक महत्वपूर्ण धक्का देता है। यही कारण है कि आप चला सकते हैं:

find /home -type f -name '*.mp3'
find /home -type f -name '*.aac'

और दूसरा findउदाहरण हास्यास्पद गति से चलता है।

लिनक्स केवल बहुत अधिक प्रयास के बिना मेमोरी उपयोग में स्पाइक्स को संभालने के लिए थोड़ी मेमोरी 'फ्री' छोड़ देता है।

दूसरा, आप उन प्रक्रियाओं को खोजना चाहते हैं जो आपकी सभी मेमोरी खा रही हैं; में topउपयोग Mआदेश स्मृति उपयोग से सॉर्ट करने के। VIRTकॉलम को अनदेखा करने के लिए स्वतंत्र महसूस करें , जो आपको बताता है कि कितनी वर्चुअल मेमोरी आवंटित की गई है, न कि यह कि प्रक्रिया कितनी मेमोरी का उपयोग कर रही है। RESयह याद दिलाया जाता है कि मेमोरी कितनी रेजिडेंट है , या वर्तमान में रैम में है (डिस्क के लिए स्वैप किए जाने का विरोध या अनुरोध किए जाने के बावजूद वास्तव में पहले स्थान पर आवंटित नहीं किया गया है)।

लेकिन, चूंकि लगभग हर प्रक्रिया के लिए एक बार RESउदाहरण के लिए /lib/libc.so.6मेमोरी की गणना की जाएगी , इसलिए यह बिल्कुल भयानक नहीं है कि एक प्रक्रिया कितनी मेमोरी का उपयोग कर रही है। SHRस्तंभ रिपोर्ट कितनी स्मृति है साझा , यह साझा किए जाने योग्य हो सकता है साझा करने के लिए बस कोई और आवश्यकताओं - अन्य प्रक्रियाओं के साथ है, लेकिन कोई गारंटी नहीं है कि किसी अन्य प्रक्रिया वास्तव में साझा कर रहा है नहीं है।

smemउपकरण सहायता उपयोगकर्ताओं को बेहतर पण लिए बनाया गया है बस कितनी स्मृति चाहिए वास्तव में प्रत्येक व्यक्ति की प्रक्रिया को दोषी ठहराया जा सकता है। यह कुछ चतुर काम करता है यह पता लगाने के लिए कि वास्तव में क्या अनोखा है, क्या साझा किया गया है, और आनुपातिक रूप से साझा की गई मेमोरी को प्रक्रियाओं को साझा करने के लिए लंबा करता है। smemयह समझने में आपकी सहायता कर सकता है कि आपकी मेमोरी topइच्छाशक्ति से बेहतर कहाँ है, लेकिन topयह एक उत्कृष्ट पहला उपकरण है।


इसलिए यदि केवल "फ्री" कॉलम स्टैटिस्टिक ड्रॉप्स, टॉप कुछ और अलग नहीं दिखाता है, तो हम यह निष्कर्ष निकाल सकते हैं कि फाइल को स्टोर करने के लिए लाइनक्स कर्नेल द्वारा मेमोरी आवंटित की जाती है और नेसरी होने पर अन्य प्रक्रियाओं को मेमोरी देगी?
Al2O3

@ रूबी, यह शायद सच है; /proc/meminfoऔर /proc/slabinfoफ़ाइलों विस्तार के लिए क्या गिरी भंडारण उपयोग कर रहा है - slabtopकार्यक्रम बहुत बहुत पसंद है top, लेकिन शो जो स्लैब allocators का कितना आवंटित किया है, क्या उनके अनुपात की तरह हैं, आदि
sarnold

'स्मेम' पर टिप के लिए धन्यवाद - मैं चाहता हूं कि लिनक्स कुछ रैम को "बेकार" कर दे ताकि मेरी मशीन तेजी से चल सके। यदि 'खोज' 2 के दर्रे से थोड़ा अधिक समय लेती है, तो यह ठीक है। एक अटक-माउस और जमे हुए खिड़कियां, जबकि लिनक्स तय करता है कि कौन सी रैम (जिसमें यह अनावश्यक रूप से hogged है), जिसे अब मैं कर रहा हूं उसे साफ करने और फिर से आवंटित करने की आवश्यकता है - या यहां तक ​​कि डिस्क पर स्वैप - एक विकल्प नहीं है। मेरे पास इस बॉक्स पर 16 जीबी रैम है, और मुझे उम्मीद है कि कई जीबी को मुफ्त रखा जा सकता है और चल रहे अनुप्रयोगों के लिए उपलब्ध होगा।
जोसेफ

@ जोसेफ, मूविंग मूवमेंट शेड्यूलिंग प्राथमिकताओं और एल्गोरिदम के साथ करने के लिए अधिक है; यदि स्मृति आबंटन माउस पॉइंटर को स्थानांतरित करने के लिए आवश्यक है तो आपके द्वारा उपयोग किए जा रहे सॉफ़्टवेयर के साथ कुछ गंभीर है। :)
जुआर

2
@ जोसेफ यह वास्तव में स्मृति को एक उपयोग से दूसरे उपयोग में लाने के लिए कर्नेल को कम समय लेता है। एक को मुफ्त सूची को स्वीकार करने और संशोधित करने की आवश्यकता होती है, दूसरा नहीं। दुर्भाग्य से, यह एक XY प्रश्न है। समस्या को प्रदर्शन के साथ करना पड़ता है और पूरी तरह से मेमोरी की खपत से असंबंधित हो सकता है (सबूत के बावजूद कि अधिक मेमोरी मुफ्त बनाने में मदद मिलती है, यह ओपी संदिग्धों की तुलना में अधिक जटिल कारणों के लिए हो सकता है) लेकिन इसके बजाय उन्होंने मेमोरी के उपयोग का विश्लेषण करने के बारे में पूछा। वास्तविक समस्या के बारे में पूछने से कम उपयोगी उत्तर मिलते हैं।
डेविड श्वार्ट्ज

321

लिनक्स / यूनिक्स में शीर्ष कमांड का उपयोग करके त्वरित टिप का उपयोग करें

$ top

और फिर हिट Shift+ m(यानी एक पूंजी लिखें M)।

से man top

SORTING of task window
  For compatibility, this top supports most of the former top sort keys.
  Since this is primarily a service to former top users, these commands do
  not appear on any help screen.
    command   sorted-field                  supported
      A         start time (non-display)      No
      M         %MEM                          Yes
      N         PID                           Yes
      P         %CPU                          Yes
      T         TIME+                         Yes

या वैकल्पिक रूप से: हिट Shift+ f, फिर कुंजी nदबाकर मेमोरी उपयोग द्वारा ऑर्डर करने के लिए डिस्प्ले चुनें Enter। आपको स्मृति उपयोग द्वारा सक्रिय प्रक्रिया दिखाई देगी


71
या आप सिर्फ M( Shift+ m)
पेट्रीक

8
@risnandar एमबी में मेमोरी दिखाने का एक तरीका है और% नहीं
कोडेकोवॉय

2
हाय codecowboy, शायद आप देख सकते हैं commandlinefu.com/commands/view/3/... अपने सर्वर में प्रयोग किया जाता मैं की तरह तीसरे पक्ष के अनुप्रयोग का उपयोग कर रहा अधिक विस्तृत स्मृति के लिए newrelic.com
risnandar

6
या बस top -o mem -O cpu
स्किप्ट

उबंटू 16 पर मुझे top -o RESअन्यथा "गैर-मान्यताप्राप्त फ़ील्ड नाम 'मेम' की आवश्यकता थी
एडम एसआर


28

पहले आपको आउटपुट पर एक स्पष्टीकरणfree पढ़ना चाहिए । नीचे पंक्ति: आपके पास कम से कम 10.7 जीबी मेमोरी है जो प्रक्रियाओं द्वारा आसानी से उपयोग करने योग्य है।

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

तब हम अधिक मदद करने में सक्षम हो सकते हैं :-)


आपको 10.7 कहां से मिला? बफ़र्स / कैश से [मुक्त]? लिंक के लिए धन्यवाद, मैं इसे पढ़ूंगा।
user3111525

3
हाँ। मुद्दा यह है कि अधिकांश मेमोरी बफ़र्स और कैश द्वारा उपयोग की जाती है। यदि किसी प्रक्रिया को अधिक मेमोरी की आवश्यकता हो तो यह मेमोरी तुरंत "डंप" हो सकती है। जब आप USED राशि से बफ़र्स / कैश के लिए उपयोग की जाने वाली मेमोरी की मात्रा घटाते हैं, या इसे मुफ़्त राशि में जोड़ते हैं, तो आपको दूसरी पंक्ति में नंबर मिलते हैं, जो तब लगता है कि केवल 1.3 गिग का उपयोग वास्तव में किया जाता है, या, दूसरे से देखा गया कोण, आपके पास 10.7 गिग आसानी से उपलब्ध मेमोरी है (चूंकि बफ़र्स और कैश को मांग पर इंस्टा-डंप किया जा सकता है)।
स्टोल्सविक


17

ps aux --sort '%mem'

से procps 'ps (Ubuntu 12.04 पर डिफ़ॉल्ट) की तरह उत्पादन उत्पन्न करता है:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
...
tomcat7   3658  0.1  3.3 1782792 124692 ?      Sl   10:12   0:25 /usr/lib/jvm/java-7-oracle/bin/java -Djava.util.logging.config.file=/var/lib/tomcat7/conf/logging.properties -D
root      1284  1.5  3.7 452692 142796 tty7    Ssl+ 10:11   3:19 /usr/bin/X -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
ciro      2286  0.3  3.8 1316000 143312 ?      Sl   10:11   0:49 compiz
ciro      5150  0.0  4.4 660620 168488 pts/0   Sl+  11:01   0:08 unicorn_rails worker[1] -p 3000 -E development -c config/unicorn.rb             
ciro      5147  0.0  4.5 660556 170920 pts/0   Sl+  11:01   0:08 unicorn_rails worker[0] -p 3000 -E development -c config/unicorn.rb             
ciro      5142  0.1  6.3 2581944 239408 pts/0  Sl+  11:01   0:17 sidekiq 2.17.8 gitlab [0 of 25 busy]                                                                          
ciro      2386  3.6 16.0 1752740 605372 ?      Sl   10:11   7:38 /usr/lib/firefox/firefox

तो यहाँ फ़ायरफ़ॉक्स मेरी स्मृति के 16% के साथ शीर्ष उपभोक्ता है।

इसमें आपकी भी रुचि हो सकती है:

ps aux --sort '%cpu'

4

आप निम्नलिखित चरणों के साथ किस कॉलम को क्रमबद्ध कर सकते हैं:

कदम:
* ऊपर
* शिफ्ट + एफ
* सूची में से एक कॉलम चुनें
    उदा। n का अर्थ है कि स्मृति द्वारा क्रमबद्ध करें,
* एंटर दबाए
* ठीक है

1
ऊपर रिस्पंदर के जवाब का डुप्लिकेट।
बेंजोमिंग

3

आप अपने टर्मिनल में इस कोड को निष्पादित करके मेमोरी उपयोग देख सकते हैं:

$ watch -n2 free -m
$ htop

3

प्रक्रिया नाम से कुल मेमोरी का उपयोग कैसे करें:

कभी-कभी यहां तक ​​कि सबसे बड़ी एकल प्रक्रियाओं को देखते हुए भी अभी तक बहुत अधिक उपयोग की जाने वाली मेमोरी है। यह जांचने के लिए कि क्या मेमोरी के उपयोग से बहुत सारी समान प्रक्रियाएँ हैं, आप निम्न जैसे एक कमांड का उपयोग कर सकते हैं, जो एक ही नाम की प्रक्रियाओं द्वारा उपयोग की जाने वाली कुल मेमोरी को योग करने के लिए awk का उपयोग करता है:

ps -e -orss=,args= |awk '{print $1 " " $2 }'| awk '{tot[$2]+=$1;count[$2]++} END {for (i in tot) {print tot[i],i,count[i]}}' | sort -n

उदा आउटपुट

9344 docker 1
9948 nginx: 4
22500 /usr/sbin/NetworkManager 1
24704 sleep 69
26436 /usr/sbin/sshd 15
34828 -bash 19
39268 sshd: 10
58384 /bin/su 28
59876 /bin/ksh 29
73408 /usr/bin/python 2
78176 /usr/bin/dockerd 1
134396 /bin/sh 84
5407132 bin/naughty_small_proc 1432
28061916 /usr/local/jdk/bin/java 7

0

यह बहुत समय में दूसरा है

ps -U $(whoami) -eom pid,pmem,pcpu,comm | head -n4

लगातार अपडेट हो रहा है

watch -n 1 'ps -U $(whoami) -eom pid,pmem,pcpu,comm | head -n4'

मैंने यहां कुछ अच्छाइयों को भी जोड़ा, जिनकी आप सराहना कर सकते हैं (या आप अनदेखा कर सकते हैं)

-n 1 हर सेकंड देखें और अपडेट करें

-U $(whoami)केवल अपनी प्रक्रियाओं को दिखाने के लिए। $ (कुछ कमांड) अब मूल्यांकन करता है

| head -n4 केवल हेडर और 3 प्रक्रियाओं को एक समय ई.पू. पर दिखाने के लिए अक्सर आपको केवल उच्च उपयोग लाइन आइटम की आवश्यकता होती है

${1-4}मेरा पहला तर्क कहता है $1कि मैं 4 को डिफ़ॉल्ट करना चाहता हूं, जब तक कि मैं इसे प्रदान नहीं करता

यदि आप एक मैक का उपयोग कर रहे हैं, तो आपको पहले घड़ी स्थापित करने की आवश्यकता हो सकती है

brew install watch 

वैकल्पिक रूप से आप एक फ़ंक्शन का उपयोग कर सकते हैं

psm(){
    watch -n 1 "ps -eom pid,pmem,pcpu,comm | head -n ${1-4}"
    # EXAMPLES: 
    # psm 
    # psm 10
}

और आप आसानी से सीपीयू द्वारा सॉर्ट कर सकते हैं-m-r
jasonleonhard

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