2014年10月10日金曜日

MySQLサーバのswap増加を解決するチューニングのヒント

MySQLサーバでスワップ(swap)が増えていたので、これを解消しました。
カーネルの設定 vm.swappiness = 1 を入れて解決しています。
こちらのスライドの17ページを参考にしました。



OSは、CentOS6.5です。
# cat /etc/redhat-release
CentOS release 6.5 (Final)


swapを確認
sysstatでswapの状況を確認してみます。
メモリに関しては、こちらのスライドが参考になります。



swapの発生状況を確認

# sar -W
12:00:01 AM  pswpin/s pswpout/s
12:10:01 AM      0.00      0.00
12:20:01 AM      0.00      0.00
12:30:01 AM      0.00      0.00
12:40:01 AM      0.00      0.00
12:50:01 AM      0.00      0.00

pswpin/s 1秒間にスワップ領域からメモリに読み込んだページ数
pswpout/s 1秒間にメモリからスワップ領域へ書き込んだページ数

スワップが多発している訳ではなことがわかります。

swap回数の統計を確認

# sar -B
12:00:01 AM  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
12:10:01 AM      1.04   7490.29   2939.23      0.03   9099.59    106.70      0.00    106.70    100.00
12:20:01 AM      0.68    700.46   1314.42      0.02   5203.37     28.75      0.00     28.75    100.00
12:30:01 AM      0.19   1187.17   1449.92      0.01   4704.59     37.38      0.00     37.38    100.00
12:40:01 AM      0.29   2224.01   1333.28      0.01   6425.57    121.65      0.00    121.65    100.00
12:50:01 AM      0.45    671.65   1443.74      0.01   3858.88     42.24      0.00     42.24    100.00

pgpgin/s 1秒間にスワップ領域からメモリへページ・インしたページ数
pgpgout/s 1秒間にメモリからスワップ領域へページ・アウトしたページ数
%vmeff pgsteal / pgscanとして計算された数で、ページ回収の効率性を示す。100%に近い場合、ほぼ全ての非活動リストの末尾から来るページが回収された事を意味する。低すぎる場合(30%以下)、仮想メモリは何らかの問題を有している。出力対象の期間の間にページのスキャンが行われない場合は、このフィールドはゼロを示す。

ページ・アウトが発生していますが、ページ・インは少ないので、スラッシングは少ない状況です。
ページ・インが多い場合は、スラッシングが多発し、アプリケーションのパフォーマンスが劣化している状況なので、サーバのメモリ搭載量を増やすなどの対応が必要です。

参考)sarコマンドのマニュアル
http://backslash0134.blog.fc2.com/blog-entry-63.html


カーネルの設定

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

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

設定を確認
# sysctl vm.swappiness
vm.swappiness = 60

設定変更
# echo 1 > /proc/sys/vm/swappiness

再度、設定を確認
# sysctl vm.swappiness
vm.swappiness = 1

sysctl.confに設定を追記
# vim /etc/sysctl.conf
vm.swappiness = 1

参考)
Linux performance tuning tips for MySQL
http://www.percona.com/blog/2013/12/07/linux-performance-tuning-tips-mysql/
OOM relation to vm.swappiness=0 in new kernel; kills MySQL server process
https://www.percona.com/blog/2014/04/28/oom-relation-vm-swappiness0-new-kernel/


swapしたデータをメモリに戻す

# swapoff -a && swapon -a

swapの量によって時間がかかります。
若干の負荷かかるので注意してください。
今回は、ロードアベレージが +1 ほど増えました。

以上で、MySQLサーバのswap増加を解決しました。
メモリの量を見てみましょう。チューニングを実施したところからメモリとスワップの使用率が変化しているのがわかります。