私は通り抜けたこの記事では、RAM の使用状況を確認するためのさまざまな方法が説明されています。しかし、さまざまな方法を比較検討することはできず、どれが正しいのかわかりません。
初めてログインすると、次のような画面が表示されます。
System information as of Sun Apr 28 21:46:58 UTC 2013
System load: 0.0 Processes: 76
Usage of /: 15.6% of 7.87GB Users logged in: 1
Memory usage: 41% IP address for eth0:
Swap usage: 0%
これは、RAM の 41% を使用していることを示しています。サーバーはあまり処理していないので、かなり高い値に思えます。それとも、この数字は RAM 以外の何かを指しているのでしょうか?
次に、次の方法を試しますfree -m
。
ubuntu@ip-:~$ free -m
total used free shared buffers cached
Mem: 590 513 76 0 67 315
-/+ buffers/cache: 130 459
Swap: 0 0 0
記事の説明図によると、使用済み RAM が 130 MB、空き RAM が 459 MB あり、RAM の約 22% を使用していることがわかります。
次に実行しますtop
:
top - 22:14:48 up 195 days, 21:30, 2 users, load average: 0.00, 0.01, 0.05
Tasks: 77 total, 1 running, 76 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.3%us, 0.3%sy, 0.0%ni, 97.7%id, 0.7%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 604376k total, 525692k used, 78684k free, 69124k buffers
Swap: 0k total, 0k used, 0k free, 322740k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 24332 1864 976 S 0.0 0.3 0:08.75 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
これは最も混乱を招きます。要約では合計 604M のうち 525MG を使用していることが示されていますが、上位メモリで並べ替えるために「m」対話型コマンドを使用すると、上位プロセスはメモリの 0.3% しか使用していないのです。
最後に、ps
コマンドはメモリ使用量も非常に少ないことを示しているようです。
root@ip-:/home/ubuntu# ps -o command,rss
COMMAND RSS
ps -o command,rss 788
sudo su root 1764
su root 1404
bash 2132
こうした明らかな矛盾を生み出している私の誤解を誰かが正してくれると嬉しいです。
ありがとう!
ラフルの編集
出力cat /proc/meminfo
:
MemTotal: 604376 kB
MemFree: 157564 kB
Buffers: 49640 kB
Cached: 231376 kB
SwapCached: 0 kB
Active: 290040 kB
Inactive: 97772 kB
Active(anon): 107672 kB
Inactive(anon): 4844 kB
Active(file): 182368 kB
Inactive(file): 92928 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 52 kB
Writeback: 0 kB
AnonPages: 106836 kB
Mapped: 22920 kB
Shmem: 5712 kB
Slab: 42032 kB
SReclaimable: 34016 kB
SUnreclaim: 8016 kB
KernelStack: 688 kB
PageTables: 3584 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 302188 kB
Committed_AS: 242768 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 7152 kB
VmallocChunk: 34359729008 kB
HardwareCorrupted: 0 kB
AnonHugePages: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 637952 kB
DirectMap2M: 0 kB
答え1
メモリの概念を理解するだけでいい
/proc/meminfo の出力によると、以下の点に注意する必要があります。
バッファ:- バッファとは、まだディスクに「書き込まれていない」ものです。これは、ディスクブロックをキャッシュするために割り当てられた RAM の量を表します。「キャッシュ」は「バッファ」に似ていますが、こちらはファイルの読み取りからページをキャッシュします。
キャッシュ済み:- キャッシュとは、ディスクから「読み取られ」、後で使用するために保存されているものです。通常、キャッシュ領域は、アプリケーションがより多くのメモリを要求すると徐々に縮小されるため、別の「空き」RAM と考えることができます。
「バッファ」と「キャッシュ」は両方ともシステム キャッシュのサイズを表していることを理解すれば十分です。これらは、Linux カーネルの内部メカニズムの要求に応じて動的に拡大または縮小されます。
Webhosting では、以下のコマンドを使用してキャッシュをクリアします (主に cron で設定されます)。
sync && echo 3 > /proc/sys/vm/drop_caches
引用リンク
もう1つの要件、つまりユーザーごとのメモリ使用量の編集
#!/bin/bash
total_mem=0
printf "%-10s%-10s\n" User MemUsage
while read u m
do
[[ $old_user != $u ]] && { printf "%-10s%-0.1f\n" $old_user $total_mem; total_mem=0; }
total_mem=$(echo $m + $total_mem | bc);
old_user=$u
done < <(ps --no-headers -eo user,%mem| sort -k1)
#--EOF
上記のスクリプトを確認して、正しく表示されているかどうかをお知らせください。
答え2
良い答えですね@RahulPatil。
psまたはtopについて考慮すべきもう一つの点は次のとおりです。
このツール [exmap] は、複数のアプリケーションで使用されている共有ライブラリを考慮に入れるため、ps や top よりも正確です。たとえば、2 つのアプリケーションが同じ共有ライブラリを使用していて、それが 1MB のメモリを消費している場合、ps は両方のアプリケーションが 1MB の追加メモリを使用していると表示しますが、exmap は各アプリケーションが 500 KB を使用しているとより正確に表示します。この高い精度は、アプリケーション間で共有されるライブラリを非常に頻繁に使用する KDE や GNOME などのデスクトップ環境を評価する場合に特に重要です。
経由ibm/developerworks/linux_memory
あなたの質問はヘッドレス サーバーに関するものなので、top または ps の二重レポートが実際にどの程度になるかはわかりません。
答え3
私たちのほとんどにとって、それは「当然のこと」なので、明白なことを見落としているのではないかと心配しています。
Jonah さん、私が間違っていたらごめんなさい。しかし、あなたの質問を聞くと、これらすべての値、特に CPU 使用率は、通常、秒ごとにかなり変化するということをあなたは認識していないように聞こえます。
新しいプロセスが開始されると、CPU 使用率は瞬時に 1 桁から 100% まで上昇しますが、すぐに (うまくいけば) 50% 未満の範囲に戻ります。
メモリ使用量の変化はより緩やかですが、Linux は、ディスク アクセスを「キャッシュ」するために、プロセスを実行することで、アクティブに使用されていないメモリを使用しようとします。たとえば、ディスクから次に読み取る必要があるものを予測し (たとえば、一部が読み取られた後の大きなファイルの残りなど)、それをキャッシュに事前にロードしようとします。メモリ使用量の値には、プロセスによって使用されるメモリとキャッシュに使用されるメモリの両方が含まれます。しばらく実行されているシステムでは、この 2 つを合わせると、おそらく 80 ~ 90% 以上になります。
使用量を表示するために実行する などのプロセスも、top
CPU とメモリを使用することに留意してください。CPU 使用量を継続的に報告するループ付きのスクリプトを作成した場合、使用量を報告する動作自体 ( sleep
遅延が挿入されていない場合) で CPU がすべて使用されるため、ほぼ確実に常に 100% が表示されます。