Linux:すべてのRAMを使用しているプロセスを調べますか?


127

実際に質問する前に、明確にするために、はい、ディスクキャッシュについて知っています。いいえ、私の場合はそうではありません:)申し訳ありませんが、この前文は:)

CentOS 5を使用しています。システム内のすべてのアプリケーションが頻繁にスワップされており、システムが非常に低速です。私がそうするときfree -m、ここに私が得たものがあります:

             total       used       free     shared    buffers     cached
Mem:          3952       3929         22          0          1         18
-/+ buffers/cache:       3909         42
Swap:        16383         46      16337

したがって、実際に使用できるのは42 Mbだけです!私の知る限り、-/+ buffers/cache実際にはディスクキャッシュはカウントされないため、実際には42 MBしかありません。私は間違っているのではないかと思ったので、ディスクキャッシングをオフにしようとしましたが、効果はありませんでした-画像は同じままでした。

そこで、だれが私のRAMをすべて使用しているかを調べることにしtop、そのために使用しました。しかし、どうやら、RAMを使用しているプロセスはないと報告されています。私の一番上のプロセスはMySQLだけですが、RAMの0.1%と400Mbのスワップを使用しています。他のサービスまたはアプリケーションを実行しようとするときの同じ画像-すべてスワップ状態になり、topMEMが使用されていないことを示しています(すべてのプロセスで最大0.1%)。

top - 15:09:00 up  2:09,  2 users,  load average: 0.02, 0.16, 0.11
Tasks: 112 total,   1 running, 111 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4046868k total,  4001368k used,    45500k free,      748k buffers
Swap: 16777208k total,    68840k used, 16708368k free,    16632k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP COMMAND
 3214 ntp       15   0 23412 5044 3916 S  0.0  0.1   0:00.00  17m ntpd
 2319 root       5 -10 12648 4460 3184 S  0.0  0.1   0:00.00 8188 iscsid
 2168 root      RT   0 22120 3692 2848 S  0.0  0.1   0:00.00  17m multipathd
 5113 mysql     18   0  474m 2356  856 S  0.0  0.1   0:00.11 472m mysqld
 4106 root      34  19  251m 1944 1360 S  0.0  0.0   0:00.11 249m yum-updatesd
 4109 root      15   0 90152 1904 1772 S  0.0  0.0   0:00.18  86m sshd
 5175 root      15   0 90156 1896 1772 S  0.0  0.0   0:00.02  86m sshd

再起動は役に立たず、彼らのやり方では非常に遅いため、このマシン(4コア、4Gb RAM、RAID1)では通常期待していません。

だから、それで-私はこれがRAMを使用しているディスクキャッシュではないことをかなり確信しています。通常は削減され、スワップに行くのではなく、他のプロセスにRAMを使用させるべきだったからです。

だから、最後に、質問は-誰かが実際にメモリを非常に大量に使用しているプロセスを見つける方法を考えているのですか?


1
これに対する答えを見つけましたか?
ハッカー

@Hackeron:OPはこの回答を受け入れました。しかし、答えはあなたの質問に対処しないことを知っています。サーバーの1つで問題を再現できました。現在、トラブルシューティングの方法があるかどうかを調査しています。
デルティック

@Deltikああ、わかりました。ありがとうございます:)-ここには2つのサーバーがあり、約12時間のスペースで利用可能なすべてのメモリをリークします。これを診断するために何かできることがあれば教えてください。IRC(irc.freenode.org)のニックネーム "hackeron"として到達可能です。
ハッカー

@Hackeron:で「hackeron」としてあなたを見つけることができませんでしたirc.freenode.orgここでの議論のためのチャットルームを作成しました。
デルティック

ZFSインメモリARC(および/またはL2ARC)キャッシュが表示されないことに注意する価値free -mがありますが、そのサイズはLinuxでcat /proc/spl/kstat/zfs/arcstats | grep data_size
kqr

回答:


112

Linuxでは、キーをtop押し<て出力表示のソートを左にシフトできます。デフォルトではソートされます%CPUので、キーを4回押すとソートされVIRT、仮想メモリサイズで答えが返されます。

これを行う別の方法は次のとおりです。

ps -e -o pid,vsz,comm= | sort -n -k 2

プロセスの仮想サイズでソートされた出力を提供する必要があります。

ここに長いバージョンがあります:

ps --everyone --format=pid,vsz,comm= | sort --numeric-sort --key=2

Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.htmlUbuntuサーバー11.10でそれができます。
デアホッホステープラー

1
@OliverSalzburg問題は-oオプションです。RHEL4これは動作します。RHEL5:ps -e -o pid,vsz,comm= | sort -n -k 2動作します。私は今夜​​11.10を試しますが、前に正しいソートオプションを見つけたら教えてください。 ps -e -o pid,vsz,comm | sort -n -k 2動作する可能性がありますが、現時点では確認する場所がありません。
カールソン

2
私はこの-efオプションにあまり詳しくありません。しかし、これは合理的な出力を生成するようだ:sudo ps axo pid,vsz,comm=|sort -n -k 2
デアHochstapler

1
Tyが、私はのトップ提案好きな<私は、それが可能だったのFedoraを知らなかった
SSHこの

2
RAMを占有し、完全なコマンドを表示するプロセスを取得するためにわずかに変更されたバージョン:ps -e --format=pid,rss,args | sort --numeric-sort --key=2
sengs

71

プロセスのメモリをメガバイトで表示し、プロセスパスを表示します。

ps aux  | awk '{print $6/1024 " MB\t\t" $11}'  | sort -n

8
スーパーユーザーへようこそ。答えを展開して、このコードの機能と問題への対処方法を説明できますか?原因不明のコードは推奨されません。ソリューションを教えていないからです。ありがとう。
fixer1234

9
私はこの答えがダウン投票されており、それを説明するよう求めているコメントを持っていることに驚いています。それが何をするのかを明確にする必要があるほど短いので(ps auxをawkに入れてから並べ替えます)、質問の文脈では、どのプロセスが最も多くのRAMを使用しているか。いい答えだと思います。
ジョン

14

同じ症状を示しているが、メモリの枯渇を示しているサーバーに関する補足。最終的に見つけたのは、32 GBのRAMを持つボックスからのsysctl.confと、12000に設定された巨大ページを持つDBのセットアップです。このボックスには2 GBのRAMしかないため、すべての空きRAMを巨大ページに割り当てていました(それらの960)。とにかく何も使用されなかったため、巨大なページを10に設定すると、すべてのメモリが解放されました。

HugePages_設定を探すための/ proc / meminfoの簡単なチェックは、少なくとも1つの予期しないメモリホグのトラブルシューティングを開始するのに適しています。


2
最近、これが問題である別のサーバーを使用しました。組織に元Oracle従業員がいる場合、この設定が原因である可能性があります。
フィールド

5

私の場合、問題はサーバーがvmw_balloonモジュールが有効になっているVMware仮想サーバーであるということでした。

$ lsmod | grep vmw_balloon
vmw_balloon            20480  0
vmw_vmci               65536  2 vmw_vsock_vmci_transport,vmw_balloon

ランニング:

$ vmware-toolbox-cmd stat balloon
5189 MB

そのため、実際には約5 GBのメモリがホストによって回収されました。そのため、VMに8 GBを「公式に」持っているにもかかわらず、実際にはそれよりはるかに少なくなりました。

$ free
              total        used        free      shared  buff/cache   available
Mem:        8174716     5609592       53200       27480     2511924     2458432
Swap:       8386556        6740     8379816

2

また、psコマンドを使用して、プロセスに関する詳細情報を取得することもできます。

ps aux | less

好奇心から、このコマンドをエスケープする正しい方法は何ですか?END ocne iが最後の行に到達したことを示します。Ctrl+ Cを押してもプロセスは強制終了されません。
KingsInnerSoul

1
@KingsInnerSoulプレス 'q'
エノバイラム

2

これPythonプロセスで使用される合計メモリを参照しますか?-Stack Overflow、それが私の答えです。現在、特定のプロセス(python)カウントツールを取得しています。

# Megabyte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum/1024 " MB"}'
87.9492 MB

# Byte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum " KB"}'
90064 KB

プロセスリストを添付してください。

$ ps aux  | grep python
root       943  0.0  0.1  53252  9524 ?        Ss   Aug19  52:01 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root       950  0.6  0.4 299680 34220 ?        Sl   Aug19 568:52 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root      3803  0.2  0.4 315692 36576 ?        S    12:43   0:54 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
jonny    23325  0.0  0.1  47460  9076 pts/0    S+   17:40   0:00 python
jonny    24651  0.0  0.0  13076   924 pts/4    S+   18:06   0:00 grep python

参照


1

show-memory-usage.shコンテンツで呼び出されるスクリプトを作成します。

#!/bin/sh
ps -eo rss,pid,user,command | sort -rn | head -10 | awk '{ hr[1024**2]="GB"; hr[1024]="MB";
 for (x=1024**3; x>=1024; x/=1024) {
 if ($1>=x) { printf ("%-6.2f %s ", $1/x, hr[x]); break }
 } } { printf ("%-6s %-10s ", $2, $3) }
 { for ( x=4 ; x<=NF ; x++ ) { printf ("%s ",$x) } print ("\n") }
 '

6
どうして?これは何をしますか?どのように機能しますか?ランダムなコードを実行するように人々に言わないでください。その目的と仕組みを説明します。
CVn

2
図実行しても安全であるように見えるので理解していない人のためにコードを説明しますが、下票はそれが役に立つと思われる人を追い払うかもしれません。上記の回答と同じコマンドを実行していますが、AWKでフォーマットを追加しています。スクリプトを使用する必要がないので、個人的にスクリプトを実行したことはありませんが、それを説明することは、書式設定が必要な人に役立ちます。
Dooley_labs

1
コードを読んで実行しました。テーブルのようにフィールドを整列させ、消費される常駐メモリをプレフィックス(1.12 GB、582.79 MBなど)でフォーマットします。
ステフェイン・グーリッホン

0

また、プロセスIDを取得し、使用されているMBでソートし、コマンド(プロセスを作成した)の概要を示します。

ps aux | awk '{print $6/1024 " MB\t\t" $2 "\t" $11}' | sort -n


0

Hyper-V上のubuntuサーバーDISTRIB RELEASE = 18.04では、ほとんどのメモリが使用されましたが、すべてのプロセスは正常でした。(snapdおよびunattended-upgrパッケージを削除したことは認めましたが、メモリの95%はまだ使用されていました。)

答えは、Hyper-Vには動的メモリがあるため、メインシステムで使用するためにメモリを使用し、ubuntuが使用済みとしてフラグを立てたということです。

それが誰かを助けることを願っています。

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