からあげ日記

Webエンジニア的なこととか。

サーバのメモリ使用率が高い・増加し続けている時の対処法

サーバのメモリ使用率が高い時に、調査したこととその対処法です。

該当のサーバの用途 : kusanagi + WordPress + MySQL ( Conoha VPS 4GB )

調査

メモリの使用率確認

# dstat -m
------memory-usage-----
 used  buff  cach  free
2823M    0   776M  192M
2823M    0   776M  192M
2823M    0   776M  192M

4GB 中 2.8GB 使用。

# free -m
              total        used        free      shared  buff/cache   available
Mem:           3790         816         184         233        2789        2412
Swap:          3967           4        3963

ページキャッシュとバッファキャッシュが大部分。

ページキャッシュ ファイルシステムに対するキャッシュで、ファイル単位でアクセスする際に使用
バッファキャッシュ ディスクブロックに対するキャッシュで、ブロックデバイスに直接アクセスする際に使用

メモリの用途を確認

# slabtop

 Active / Total Objects (% used)    : 10520156 / 10645459 (98.8%)
 Active / Total Slabs (% used)      : 499661 / 499661 (100.0%)
 Active / Total Caches (% used)     : 67 / 95 (70.5%)
 Active / Total Size (% used)       : 1990202.24K / 2019348.50K (98.6%)
 Minimum / Average / Maximum Object : 0.01K / 0.19K / 8.00K

  OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME
10153920 10153487  99%    0.19K 483520       21   1934080K dentry
184392 103697  56%    0.10K   4728   39     18912K buffer_head
106092 100896  95%    0.19K   5052   21     20208K kmalloc-192

メモリの使用の大部分が dentry_cache

dentry cache ディレクトリやファイル名と inode とを結びつけに使われるキャッシュ。
ディスクからのディレクトリエントリの読み取りをキャッシュする

存在しないディレクトリ情報( inode を持たない dentry )量を確認

# sar -v
Linux 3.10.0-514.6.1.el7.x86_64 (150-95-155-161)   06/29/2018   _x86_64_    (4 CPU)

12:00:01 AM dentunusd   file-nr  inode-nr    pty-nr
12:10:01 AM  10053432      1472     28047         0
12:20:01 AM  10052647      1472     27096         0
12:30:01 AM  10052899      1504     27339         0
12:40:01 AM  10053122      1504     27090         0
12:50:01 AM  10053338      1504     27276         0
dentunusd キャッシュされてしまっているが、存在しないディレクトリ情報( negative dentry )
file-nr システムで使用しているファイルハンドルの数
inode-nr システムで使用しているinodeハンドルの数
pty-nr システムで使用している疑似端末の数

対処法

  1. ファイルシステムのメモリバッファをディスクと同期させる
  2. dentry キャッシュを削除

1. ファイルシステムのメモリバッファをディスクと同期させる

メモリ内のオブジェクトのうち、変更後ディスクに書き込まれていないファイル(Dirtyオブジェクト)を確認

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

ファイルシステムのメモリバッファをディスクと同期させる

# sync

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

2. dentry キャッシュを削除

# echo 3 > /proc/sys/vm/drop_caches
1 ページキャッシュの解放
2 slab オブジェクトの解放
3 ページキャッシュと slab オブジェクトの解放
4 ログ( KERN_INFO )への出力の ON / OFF を切り替える

結果

# free -m
              total        used        free      shared  buff/cache   available
Mem:           3790         808        2615         233         366        2543
Swap:          3967           5        3962
# dstat -m
------memory-usage-----
 used  buff  cach  free
2766M    0   745M  280M
2766M    0   745M  280M
2435M    0   270M 1087M
2362M    0   270M 1160M
1365M    0   270M 2157M
1362M    0   270M 2159M
 869M    0   270M 2653M
 868M    0   270M 2653M

🎉

( buff / cach の値が少ないので、メモリを増やしたほうが良さそう)

間違い等あればご指摘いただけると嬉しいです。

参考

減り続けるメモリ残量! 果たしてその原因は!? (1/3):Linuxトラブルシューティング探偵団 番外編(1) - @IT

qiita.com

s-tajima.hateblo.jp

okisanjp.hatenablog.jp