- PR -

topコマンドでのメモリ使用量が合いません

投稿者投稿内容
なんでも屋
常連さん
会議室デビュー日: 2004/11/17
投稿数: 20
投稿日時: 2006-02-18 19:07
みなさん、こんにちは。
メモリの使用量の調べ方についてご教授下さい。

客先にメモリサイズ512MBのサーバを導入しています。
(RedHatLinux9+Apache+tomcat+PostgreSQL)
メモリ使用量が常に500MB近いということで「なにがそんなにメモリを消費しているのか詳細を説明せよ」という問合せがありました。
さっそく調べ始めようと「top n 1 b」を実行したのですが、topのヘッダー部分Memのusedが明細部分のどの項目の合計値にも合いません。
明細部の%Memを合計しても34.2%にしかならないのですが、topでは表示されないがメモリを消費している「何か」があるのでしょうか?
その「何か」をご存知の方がいらっしゃいましたら教えて頂けますでしょうか。
どうぞ宜しくお願い致します。

以下「top n 1 b」の結果です。
17:54:54 up 51 days, 20:30, 4 users, load average: 0.04, 0.16, 0.17
101 processes: 85 sleeping, 1 running, 0 zombie, 15 stopped
CPU states: 0.4% user 0.2% system 0.0% nice 0.0% iowait 99.2% idle
Mem: 513744k av, 498744k used, 15000k free, 0k shrd, 116092k buff
362328k actv, 0k in_d, 7912k in_c
Swap: 522104k av, 82304k used, 439800k free 211256k cached

PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND
4199 root 25 0 92232 90M 19224 S 0.0 17.9 1:29 0 java
28483 root 15 0 15460 11M 4696 S 0.0 2.2 0:07 0 nautilus
4139 root 15 0 9640 9636 6780 S 0.0 1.8 0:00 0 gnome-termina
4011 root 16 0 9252 9248 6512 S 10.5 1.8 32:06 0 gnome-system-
2131 root 16 0 24076 7332 700 S 14.3 1.4 63:22 0 X
(中略)
1564 rpcuser 25 0 80 0 0 SW 0.0 0.0 0:00 0 rpc.statd
1828 wnn 24 0 3348 0 0 SW 0.0 0.0 0:00 0 jserver
2092 root 15 0 632 0 0 SW 0.0 0.0 0:00 0 gdm-binary
2130 root 15 0 796 0 0 SW 0.0 0.0 0:00 0 gdm-binary


[ メッセージ編集済み 編集者: なんでも屋 編集日時 2006-02-18 19:07 ]
cn009
ベテラン
会議室デビュー日: 2004/05/13
投稿数: 72
投稿日時: 2006-02-19 04:18
引用:

明細部の%Memを合計しても34.2%にしかならないのですが、topでは表示されないがメモリを消費している「何か」があるのでしょうか?



top でも一応表示されていますが、アプリごとではないので明細部には出てきません。
buffers や cached と表示されているものです。

実は私も詳しく無いのですが、ディスクI/Oのキャッシュ等だったと思います。
buffers と cached の違いなどについて詳しい方居られたら教えてください。

498744 - 116092 - 211256 = 171396 kbytes がアプリが使用しているメモリ量だと思います。
171396 / 513744 * 100 = 33.4% で、明細部の合計とちょっと違いますが、
これは明細部の表示の際の誤差の積み重なりだと思います。

毎回こんな計算は嫌ですね。
幸い free を使えば、「-/+ buffers/cache」の行に、buffers と cached を引いた値が表示されます。
なんでも屋
常連さん
会議室デビュー日: 2004/11/17
投稿数: 20
投稿日時: 2006-02-20 14:40
cn009さん、ありがとうございます。
少しづつ見えてきました。

つまり・・・
freeの結果が
total used free shared buffers cached
Mem: 513744@ 499040A 14704B 0C 130588D 191128E
-/+ buffers/cache: 177324F 336420G
Swap: 522104H 83960I 438144J

@総メモリ量
A使用済み
B空き
C共有用
Dバッファ用
Eキャッシュ用
Fアプリでの使用量
Gアプリで使える空き容量
Hスワップ容量
Iスワップ使用済み
Jスワップ空き
先に進む前にこの@〜Jの定義は合っていますでしょうか?

次に私は以下のように理解したのですがいかがでしょうか?
1.「@総メモリ量」から「Fアプリでの使用量」を引いた分がCDEに割り振われる
ちなみに@-F=C+D+E(513744-177324)=(14704+130588+191128)=336420
2.この336MB分はLinuxがディスクのI/Oの為に用意している領域である
3.「Fアプリでの使用量」はtop n 1 bコマンドで表示された明細部分の合計と
ほぼ同じとなる

つまり今回の場合だと「全メモリ中65.8%がディスクのI/Oに費やされている」と結論付けて良いのでしょうか?

なお、buffersとcachedの違いですが、それぞれ用語集を参照すると
buffer:複数の機器やソフトウェアの間でデータをやり取りするときに、処理速度や転送速度の差を補うためにデータを一時的に保存しておく記憶装置や記憶領域のこと。
cache:使用頻度の高いデータを高速な記憶装置に蓄えておくことにより、いちいち低速な装置から読み出す無駄を省いて高速化すること。また、その際に使われる高速な記憶装置。
となっておりました。
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2006-02-20 22:06
それなりにファイルアクセスしているLinux機は、起動後長時間
経つとメモリの使用率が98%ほどになります。以上。

・・・で、いいと思うんだけどなあ。
ってか、Linuxに限らずサーバに使うようなOSはほとんどすべて
似たような挙動をするはずなので。

buffersとはバッファキャッシュの量。これ以上説明しようとすると
ファイルシステムの話からはじめなくてはならないので省略。

cachedはファイルキャッシュの量。HDDから一度読み込んだ
ファイルは、後に再度読み込むことになる可能性が高いので、
メモリ上に維持される。それがファイルキャッシュ。

free(1)の -/+ の行は、usedからバッファキャッシュ・ファイル
キャッシュを差し引いた量(内容を捨てるわけにはいかないメモリ)
と、freeにバッファキャッシュ・ファイルキャッシュを加えた量
(必要があれば使えるメモリ)です。
なんでも屋
常連さん
会議室デビュー日: 2004/11/17
投稿数: 20
投稿日時: 2006-02-22 11:00
ぽんすさん、ありがとうございます。

>それなりにファイルアクセスしているLinux機は、起動後長時間
>経つとメモリの使用率が98%ほどになります。以上。

私もこれで良いと思います。
というかこれしかないと思ってます。
しかし、納得してもらえる可能性は低いです。
結局は「used」の数値が高いのが気になるらしく「ここの数値を下げよ」ということらしいのです。

「used」の数値、つまりは「free」「buffers」「cached」の数値を、設定で変えることは可能なのでしょうか?
しかし、変更できたとしても、他に問題出そうな気がするのですが・・・
BB
ベテラン
会議室デビュー日: 2003/04/04
投稿数: 53
投稿日時: 2006-02-22 14:40
>局は「used」の数値が高いのが気になるらしく「ここの数値を下げよ」ということらしいのです。
説明して納得させるのも難儀そうですね。

コレが参考になるような気がします。
/procによるLinuxチューニング [後編]
http://www.atmarkit.co.jp/flinux/special/proctune/proctune02a.html
(試したわけではないので無意味かもしれません・・・)
せん
ぬし
会議室デビュー日: 2002/03/04
投稿数: 397
投稿日時: 2006-02-22 19:19
TOP の結果からですが、
要らないサービスがあがってたりしてません?
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2006-02-22 21:33
引用:

なんでも屋さんの書き込み (2006-02-22 11:00) より:
「used」の数値、つまりは「free」「buffers」「cached」の数値を、設定で変えることは可能なのでしょうか?


カーネル2.2の頃は、/proc/sys 以下のパラメータでfreeを確保する量を
チューニングできましたが、カーネル2.4以降ではできません。
カーネルソース中にハードコーディングされています。
# カーネルソースを書き換えれば変更できますが

どうしてもusedを減らしたいのであれば、週次あるいは日次でのリブート
ということになるでしょう。定期リブートをするのは、悪い考えでは
ないと思います。
# 日次でも足りなければどうしようもなさそうですが。

スキルアップ/キャリアアップ(JOB@IT)