250

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ます。

4

12 に答える 12

333

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ます。メモリ使用量順に並べられたアクティブなプロセスが表示されます

于 2012-03-07T18:12:48.483 に答える
288

まず、このマントラをしばらく繰り返します。「未使用のメモリは無駄なメモリです」。Linuxカーネルは、より重要に見える何かがそのデータを押し出すまで、要求された大量のファイルメタデータとファイルを保持します。それがあなたが走ることができる理由です:

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

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

Linuxは、あまり労力をかけずにメモリ使用量の急増を処理するために、メモリを少しだけ「解放」します。

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

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

このツールは、個々のプロセスで実際smemにどれだけのメモリが原因であるかをユーザーがより正確に測定できるように設計されています。何が本当にユニークで何が共有されているかを理解するためにいくつかの巧妙な作業を行い、共有メモリをそれを共有するプロセスに比例的に集計します。あなたの記憶がどこより良くなっているのかを理解するのに役立つかもしれませんが、優れた最初のツールです。smemtoptop

于 2011-01-26T09:23:30.670 に答える
38
ps aux | awk '{print $2, $4, $11}' | sort -k2rn | head -n 10

(並べ替えコマンドに -n 数値フラグを追加します。)

于 2013-04-23T08:05:04.330 に答える
28

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

次に、プロセスの「メモリ使用量」を定義する必要があります (簡単でも明確でもありませんが、私を信じてください)。

そうすれば、もっとお手伝いできるかもしれません:-)

于 2011-01-26T08:29:02.587 に答える
5

プロセス名ごとに使用メモリを合計する方法:

場合によっては、最大の単一プロセスを見ても、まだ多くの未使用メモリが存在することがあります。メモリを使用している同じ小さなプロセスがたくさんあるかどうかを確認するには、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
于 2019-09-19T15:22:00.713 に答える
4

gaoithe 's answerに基づいて、メモリ単位をメガバイト単位で表示し、15 エントリに制限されたメモリの降順で並べ替えようとしました。

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 | tail -n 15 | sort -nr | awk '{ hr=$1/1024; printf("%13.2fM", hr); print "\t" $2 }'

       588.03M  /usr/sbin/apache2
       275.64M  /usr/sbin/mysqld
       138.23M  vim
        97.04M  -bash
        40.96M  ssh
        34.28M  tmux
        17.48M  /opt/digitalocean/bin/do-agent
        13.42M  /lib/systemd/systemd-journald
        10.68M  /lib/systemd/systemd
        10.62M  /usr/bin/redis-server
         8.75M  awk
         7.89M  sshd:
         4.63M  /usr/sbin/sshd
         4.56M  /lib/systemd/systemd-logind
         4.01M  /usr/sbin/rsyslogd

これを bash 構成ファイルで使用するエイリアスの例を次に示します。

    alias topmem="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 | tail -n 15 | sort -nr | awk '{ hr=\$1/1024; printf(\"%13.2fM\", hr); print \"\t\" \$2 }'"

topmemその後、コマンドラインに入力するだけです。

于 2020-08-28T23:11:52.267 に答える
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)自分のプロセスのみを表示します。$(some command) が評価されるようになりました

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

${1-4}最初の引数は、$1指定しない限り、デフォルトで 4 にしたいと言っています

Mac を使用している場合は、最初に watch をインストールする必要がある場合があります brew install watch

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

psm(){
    watch -n 1 "ps -eom pid,pmem,pcpu,comm | head -n ${1-4}"
    # EXAMPLES: 
    # psm 
    # psm 10
}
于 2020-06-01T03:04:43.887 に答える