:>/dev/null

ラガードエンジニアの不撓不屈の精神

mongodb 2.6 クラスタ構成で過負荷対応

クラスタ構成環境のmongosで下記エラー発生。
調査・対応を下記へ記載しておく。

対応方法

1.カーネル設定

vm.swappinessの設定をします。
vm.swappinessは、swap領域の扱いを制御するカーネルの設定です。
この設定値が小さければ小さいほどswapを抑制します。
デフォルトは、vm.swappiness=60です。

参考)Swappiness
vm.swappiness = 0 メモリが一杯になるまでスワップを利用しない
vm.swappiness = 60 規定値
vm.swappiness = 100 全体のパフォーマンスに影響しうるほど積極的にスワップ処理を行う

Swappiness - Wikipedia

設定確認
# sysctl vm.swappiness
vm.swappiness = 60
設定変更
# echo 10 > /proc/sys/vm/swappiness
設定確認
# sysctl vm.swappiness
vm.swappiness = 10
sysctl.confに設定を追記
# vim /etc/sysctl.conf
vm.swappiness = 10

2.logrotate設定

公式ドキュメントによると下記3パターンの設定方法がある。

  • mongo shell

    • mongos> db.runCommand( { logRotate : 1 } )
    • { "ok" : 1 }
  • bash

    • shell> kill -SIGUSR1
    • shell> killall -SIGUSR1 mongod

Rotate Log Files — MongoDB Manual 2.6

bashを使用したローテーションが簡易で良いと考えたが、
実行した場合mongosが落ちるという事象が発生。
原因不明な為、mongo shellを使用したケースで対応。

### cat /root/mongologrotate.sh 
#/bin/sh

# mongod log lotate
mongo --quiet admin /root/MongoLogRotate.js

# clear old olgs
cd {/mongologdir}
DELDAY=`date --date '30 days ago' '+%Y-%m-%d'`

for LINE in `find -iname "mongod.log.$DELDAY*"`
do
  echo "delete $LINE"
  rm -f $LINE
done

### cat /root/MongoLogRotate.js 
db.auth("root", "******")
db.runCommand( { logRotate : 1 } )

### crontab -l
00 15 * * * /bin/sh /root/mongologrotate.sh

3.[slab | page]cache設定

上記2パターンを実行したケースにおいても現象改善されない状況。下記記事からcache設定。

UPDATE: It's fair that the memory usage looks high, which might lead to the conclusion it's another process. There's no other processes using any significant memory on the server; the memory appears to be consumed in the cache, but I'm not clear why that would be the case:

mongodb - Mongod resident memory usage low - Stack Overflow

OS側が保持している各cache設定を開放。

開放前のメモリー使用状況

### free -m
             total       used       free     shared    buffers     cached
Mem:         15951      15204        746          0        145      10355
-/+ buffers/cache:       4703      11248 
Swap:          511        140        371 

### cat /proc/meminfo 
MemTotal:       16334048 kB
MemFree:          764992 kB
Buffers:          149060 kB
Cached:         10604528 kB
SwapCached:         7712 kB
Active:          8825784 kB
Inactive:        5337972 kB
Active(anon):    2757160 kB
Inactive(anon):   653428 kB
Active(file):    6068624 kB
Inactive(file):  4684544 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:        524284 kB
SwapFree:         380280 kB
Dirty:                36 kB

OS保持の各cache開放

# free && sync && echo 3 > /proc/sys/vm/drop_caches && echo "" && free

開放後のメモリー使用状況

### free -m
             total       used       free     shared    buffers     cached
Mem:         15951       4908      11042          0        166       1183
-/+ buffers/cache:       3559      12392 
Swap:          511        124        387 

### cat /proc/meminfo 
MemTotal:       16334048 kB
MemFree:        11306796 kB
Buffers:          170120 kB
Cached:          1212012 kB
SwapCached:         5716 kB
Active:          3907484 kB
Inactive:          99016 kB
Active(anon):    2608944 kB
Inactive(anon):    15848 kB
Active(file):    1298540 kB
Inactive(file):    83168 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:        524284 kB
SwapFree:         396408 kB
Dirty:                40 kB
Writeback:             0 kB
AnonPages:       2618788 kB
Mapped:            14892 kB
Shmem:               424 kB
Slab:             326744 kB
SReclaimable:      84616 kB
SUnreclaim:       242128 kB
KernelStack:      410944 kB
PageTables:        63036 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     8691308 kB
Committed_AS:   28622200 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      171952 kB
VmallocChunk:   34359558216 kB
HardwareCorrupted:     0 kB
AnonHugePages:   1978368 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       10240 kB
DirectMap2M:    16766976 kB

cache開放後、free領域がmongoに割り当てされれば問題ない為
mongo shell 起動し、物理メモリ(resident)領域がcache開放前後で増加しているか確認。

mongos> db.serverStatus().mem
{ "bits" : 64, "resident" : 3299, "virtual" : 29016, "supported" : true }

Linuxでページキャッシュを確認・解放してみた - Qiita