では、ストレージとの同期情報まで加味したメモリの使用状況監視を行うには、どうすればよいのでしょうか? 実は現在(注2)のところ、「これで完ぺき」という方法はありません。ただ、それでは困るので、ここでは次善の策としてActiveとInactiveを監視する方法を挙げます。
ActiveとInactiveはvmstat -aやcat /proc/meminfoなどと入力することで取得できます(図5)。
Activeはページキャッシュや無名ページ(注3)のうち、最近利用したり、まだストレージとの同期が取れていない「捨てられない」ページです。Inactiveは、同じくページキャッシュや無名ページのうち、最後にアクセスされてからある程度時間がたち、ストレージとの同期も完了していて、すぐに捨てられるページです。よって、/proc/meminfoの出力でいうところのMemFreeとInactiveを足すことで確実に利用可能なメモリ量を算出することができます。
(実際に利用可能なメモリ量)≒(MemFree+Inactive)
この値を利用し、一定量を下回らないようにするのが、簡単・確実なメモリ利用率監視法といえます。
注2:Red Hat Enterprise Linux 5相当を最新のLinux OSと考えた場合です。
注3:Anonymous Pageともいい、主にユーザープロセスが利用しているページです。psなどで取得できるRSSとして表示される値がここに入ると考えると分かりやすいのですが、実際は、共有メモリがページキャッシュに含まれていたりして、正確に把握するのはかなりややこしいです。
メモリの利用状況について説明した事柄をまとめると、以下のようになります。
焦点となる問い合わせでは、今回説明したActiveとInactiveを考慮して監視しても、利用可能な物理メモリ量が減り続け、ついにはリブートが発生していることが判明しました。そこで次回は、ここでは避けて通った「無名ページ」やカーネル領域のメモリに迫ります。
ページキャッシュがいつまでも残り続けていることに不満を感じる声をよく聞きます。そんなあなたは、drop_cachesを使うと悩みを解決できるかもしれません。
drop_cachesは、既に利用されておらず、ストレージと同期の取れているページキャッシュやSlabキャッシュ(注4)をMemFreeに移動してくれます。つまり、MemFree≒利用可能なメモリとなるわけです。
使い方は以下のようになります。
0. デフォルト状態に戻す場合
# echo 0 > /proc/sys/vm/drop_caches
1. ページキャッシュのみを解放したい場合
# echo 1 > /proc/sys/vm/drop_caches
2. Slabキャッシュを解放したい場合
# echo 2 > /proc/sys/vm/drop_caches
3. ページキャッシュとSlabキャッシュを解放したい場合
# echo 3 > /proc/sys/vm/drop_caches
上記のようにdrop_cachesに設定した値は永続性を持ちませんので、常にキャッシュが無効になるわけではありません。必要に応じて実行するようにしてください。
注4:Slabキャッシュはディレクトリのメタデータ情報を格納するdentryやファイルのメタデータ情報を格納するinode構造体などをキャッシュしているカーネル内のメモリ領域です。これらはページキャッシュとは別にカーネルの中に確保されており、ストレージと同期していれば解放することができます。
Copyright © ITmedia, Inc. All Rights Reserved.