実際のメモリ使用量でソートされた上位プロセスを確認するにはどうすればよいですか?


240

12Gのメモリを搭載したサーバーがあります。topの一部を以下に示します。

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 MBしかありません。私の質問は次のとおりです。どのプロセスがメモリのほとんどを消費しているかを知るにはどうすればよいですか?

背景情報と同様に、システムは稼働してい64bit OpenSuse 12ます。


回答:


280

まず、このマントラを少し繰り返します。「未使用のメモリは無駄なメモリです」。Linuxカーネルは、要求された膨大な量のファイルメタデータとファイルを、より重要と思われるものがそのデータをプッシュするまで保持します。これが実行できる理由です。

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

2番目のfindインスタンスをとんでもない速度で実行します。

Linuxは、メモリを少しだけ「空き」にして、過度の労力なしでメモリ使用量の急増に対処します。

次に、すべての記憶を消費しているプロセスを見つけたいと思います。top使用Mコマンドは、メモリ使用量でソートします。VIRT列が無視されても構いません。これは、プロセスが使用しているメモリの量ではなく、割り当てられている仮想メモリの量を示すだけです。RESどのくらいのメモリが常駐しているか、または現在RAMにあるかを報告します(要求されたにもかかわらず、ディスクにスワップされたか、最初に実際に割り当てられたのではありません)。

ただし、はほぼすべてのプロセスでメモリを1回RESカウントする/lib/libc.so.6ため、プロセスが使用しているメモリの量を正確に測定するものではありません。このSHR列は、他のプロセスと共有されているメモリの量を報告していますが、別のプロセスが実際に共有しているという保証はありません。

このsmemツールは、個々のプロセスごとに実際に原因となるメモリの量をユーザーがより適切に判断できるように設計されています。何が本当にユニークで何が共有されているかを理解するためにいくらか巧妙な作業を行い、共有メモリをそれを共有するプロセスに比例的に集計します。smemあなたの記憶がtop意志より良くなっている場所を理解するのに役立つかもしれませんtopが、優れた最初のツールです。


したがって、「空き」列の統計のみが下がった場合、topには他に何も表示されません。メモリがLinuxカーネルによって割り当てられ、ファイルを格納し、必要なときに他のプロセスにメモリを提供すると結論付けることができますか?
Al2O3

@Rubby、それはおそらく本当です。/proc/meminfoそして/proc/slabinfo-ファイル用のカーネルがストレージを使用しているものの詳細slabtopプログラムは非常に似ているtopなど、その比率が似ているものをどのくらい割り当てられているスラブアロケータのが、ショー、
sarnold

「smem」に関するヒントをありがとう-私のマシンが高速で実行できるように、LinuxにRAMを「浪費」させたい。2番目のパスで「検索」に少し時間がかかる場合は、問題ありません。LinuxがRAMを決定する間、マウスが動かなくなり、ウィンドウがフリーズします(RAMが不必要に占有される)、クリアして、私が今やっている作業に再割り当てする必要があります-または、ディスクにスワップすることもできません。このボックスには16 GBのRAMがあり、そのうち数GBは空き状態に保たれ、実行中のアプリケーションで利用できると予想しています。
JosephK

@JosephK、マウスを動かすことは、スケジューリングの優先順位とアルゴリズムと関係があります。マウスポインタを動かすためにメモリ割り当てが必要な場合は、使用しているソフトウェアに深刻な問題があります。:)
sarnold 2016

2
@JosephK実際には、空きメモリを使用するよりも、ある用途から別の用途にメモリを再利用する方がカーネルにかかる時間が少なくて済みます。1つはフリーリストにアクセスして変更する必要があり、もう1つは必要ありません。残念ながら、これはXYに関する質問です。問題はパフォーマンスに関係しており、メモリ消費量とはまったく無関係である可能性があります(OPの容疑者よりも複雑な理由により、メモリを解放することで問題が解決する可能性があるという証拠にもかかわらず)代わりに、メモリ使用量の分析について尋ねました。これは、実際の問題について尋ねるよりも有用な答えが得られません。
デビッドシュワルツ

321

linux / unixでtopコマンドを使用してクイックヒントを使用する

$ 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
または、単にMShift+ m)を押すこともできます
Patryk

8
@risnandarは%ではなくMBでメモリを表示する方法があります
codecowboy '12 / 12/48

2
こんにちはcodecowboy、おそらくcommandlinefu.com/commands/view/3/…を参照してください。サーバーで使用されているより詳細なメモリについては、newrelic.comの
risnandar

6
または単に top -o mem -O cpu
2015

Ubuntu 16では、top -o RESそれ以外の場合は「認識されないフィールド名 'mem'」が必要でした
AdamS


28

まず、の出力に関する説明をfree読む必要があります。結論:10.7 GB以上プロセスですぐに使用できるメモリがあります。

次に、プロセスの「メモリ使用量」を定義する必要があります(これは簡単ではないか、明確であり、信頼してください)。

その後、私たちはもっと助けることができるかもしれません:-)


10.7はどこから入手しましたか?バッファ/キャッシュから[無料]?リンクありがとうございます。
user3111525

3
はい。ポイントは、ほとんどのメモリがバッファとキャッシュによって使用されることです。プロセスがより多くのメモリを必要とする場合、このメモリはすぐに「ダンプ」できます。バッファ/キャッシュに使用されるメモリの量をUSEDの量から減算するか、それをFREEの量に追加すると、2行目に数値が表示されます。これは、1.3ギグのみが実際に使用されていること、または他から見られることを実装しています。角度では、10.7ギガのメモリをすぐに利用できます(バッファとキャッシュはオンデマンドでインスタダンプできるため)。
stolsvik 2013年


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

したがって、ここではFirefoxが私の記憶の16%を占めるトップ消費者です。

また興味があるかもしれません:

ps aux --sort '%cpu'

4

次の手順で、ソートする列を指定できます。

手順:
* 上
*シフト+ F
*リストから列を選択します
    たとえばnはメモリでソートすることを意味し、
* Enterキーを押します
* OK

1
上記のrisnandarの回答の複製。
15年

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 1秒ごとに監視して更新する

-U $(whoami)プロセスのみを表示します。$(some command)は今評価します

| head -n4 一度にヘッダーと3つのプロセスのみを表示するには、多くの場合、使用率の高い広告申込情報が必要です。

${1-4}$1私がそれを提供しない限り、私がデフォルトで4にしたい私の最初の引数を言います

Macを使用している場合は、最初に時計をインストールする必要があるかもしれません

brew install watch 

または、関数を使用することもできます

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

変更-mすると、CPUで簡単に並べ替えることができます-r
jasonleonhard

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.