ログってなんぼ

日々のメモです

Linux:キャッシュを開放する(/proc/sys/vm/drop_caches)

同じ構成+同じアプリケーションのサーバーなのに片方のサーバーのメモリ使用率が100%近くに張り付いてしまっていたので調査したメモです

f:id:Okisanjp:20170105103439p:plain f:id:Okisanjp:20170105103445p:plain

正常なサーバー

$ free -m
             total       used       free     shared    buffers     cached
Mem:          3763       3547        215          0         33       1585
-/+ buffers/cache:       1928       1835
Swap:         4095        141       3954

Alerm発生サーバー

$ free -m
             total       used       free     shared    buffers     cached
Mem:          3763       3743         19          0       1178       1240
-/+ buffers/cache:       1325       2438
Swap:         2047         45       2002

meminfoを見てみる

cat /proc/meminfoで正常鯖とAlerm鯖を見比べてみます

f:id:Okisanjp:20170105103503p:plain

slabtopも見る

 OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME
476671 339609  71%    0.10K  12883       37     51532K buffer_head
 97556  95459  97%    0.85K  24389        4     97556K ext4_inode_cache
 83776  77047  91%    0.55K  11968        7     47872K radix_tree_node
 79120  69919  88%    0.19K   3956       20     15824K dentry

対応する

ページキャッシュとSlab(dentry:ディレクトリエントリやinodeのキャッシュ)を開放します

https://linuxjm.osdn.jp/html/LDP_man-pages/man5/proc.5.htmllinuxjm.osdn.jp

/proc/sys/vm/drop_caches (Linux 2.6.16 以降) このファイルに書き込みを行うと、カーネルに、 クリーンなキャッシュ、 dentry、 inode をメモリーから追い出して、 メモリーを解放させることができる。 この機能はメモリー管理のテストや再現可能なファイルシステムのベンチマークを行うのに役立つ。 このファイルへの書き込みはキャッシュの利点を失うことになるので、システム全体の性能は低下する可能性がある。 ページキャッシュを解放するには、以下のようにする。

    echo 1 > /proc/sys/vm/drop_caches

dentry と inode を解放するには、以下のようにする。

    echo 2 > /proc/sys/vm/drop_caches

ページキャッシュ、 dentry、 inode を解放するには、以下のようにする。

    echo 3 > /proc/sys/vm/drop_caches

このファイルへの書き込みは非破壊的な操作で、 ダーティな (dirty) オブジェクトは 解放されないので、 この操作を行う際は最初に sync(1) を実行しておくべきである。

引用元:Man page of PROC はてなブックマーク - Man page of PROC

Dirtyオブジェクトの確認

変更されたがHDDに書き込まれていないファイル(Dirtyオブジェクト)を確認します

# grep 'Dirty' /proc/meminfo
Dirty:               144 kB

キャッシュのクリア

syncしてDirtyオブジェクトがなくなってからコマンドを実行します

# sync
# grep 'Dirty' /proc/meminfo
Dirty:                 0 kB
# cat /proc/sys/vm/drop_caches
0

# echo 3 > /proc/sys/vm/drop_caches

# cat /proc/sys/vm/drop_caches
3
# free -m
             total       used       free     shared    buffers     cached
Mem:          3763        990       2772          0         16         17
-/+ buffers/cache:        956       2806
Swap:         2047         45       2002

# slabtop
  OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME
 15320   4069  26%    0.19K    766       20      3064K dentry
 14784  10452  70%    0.05K    192       77       768K anon_vma_chain
 12408  10161  81%    0.17K    564       22      2256K vm_area_struct
  8917   4038  45%    0.10K    241       37       964K buffer_head

ちなみに

# cat /proc/sys/vm/drop_caches
3

この操作によってdrop_cachesが3になりましたが、初期値の0に戻す必要は特にありません

とりあえずコレでしばらく様子を見ます