はじめに
たまにサーバ速度がなんとなく遅いので、topやps等を使って状態を調べてたところ、どうやらswapを使っていたみたいでした。
Swap: 1.0G 278M 742M
これはメモリを増やした方がいいかなーとぱっと考えていましたが、freeコマンドの全体はこんな感じでした。
onodes@Balthazar:~$ free -h
total used free shared buff/cache available
Mem: 985M 309M 311M 33M 364M 495M
Swap: 1.0G 278M 742M
availableを見ればわかるとおり、物理メモリの利用可能量も十分ある中で、278MBのswap inが発生していました。
スワップとは
改めてここでいうスワップ(swap)とは、物理メモリが不足した場合に、メモリ内のデータをディスク(HDD/SSD等)に移動させる機能のことです。
つまり、考え方としては物理メモリが不足していなければ、swapは発生しないことになります。
swappiness
物理メモリが空いているのにswapが利用される背景として、swappinessの設定があります。
swappinessはLinuxカーネルのパラメータで、スワップ処理を行う頻度変更、調整に用いるパラメータです。
Linuxカーネル2.6以上(大体世の中そうだと思いますが...)のLinuxで実装、採用されています。
onodes@Balthazar:~$ cat /proc/sys/vm/swappiness
60
未調整だとデフォルトで60が入っているはずです。この値は0から100までの調整が可能で値が大きいほどswapしやすくなります。
また、0にするとメモリが枯渇するまでswapを利用しないという設定になります。
値 | 頻度 |
---|---|
swappiness = 0 | メモリが一杯(枯渇)するまでswapをしない |
swappiness = 60 | デフォルト |
swappiness = 100 | 積極的にswapする。全体のパフォーマンス影響が出るレベル |
ここだけ見ると、swappiness = 0にしたほうがメモリをガンガン使ってパフォーマンスが上がりそうですが、0にしたら今度はOOM Killerが発生しやすくなりプロセスダウンが起きるので、やりすぎは禁物。
今回は若干日和って、swappiness = 10にしてみます。
swappinessの変更と反映
OSはUbuntu18.04です。
$ sudo vim /etc/sysctl.conf
下部に追記
vm.swappiness = 10
そして反映
$ sudo sysctl -p
vm.swappiness = 10
確認とswapの開放
freeを打ちます。
onodes@Balthazar:~$ free -h
total used free shared buff/cache available
Mem: 985M 384M 181M 56M 419M 396M
Swap: 1.0G 276M 744M
swapの値は変わっていない...ここではswapは開放されません。
swap usedの容量よりも実メモリの空き容量のほうが大きい場合はswapをオフにして開放して、再びオンにします。
もし、実メモリが少ない場合は色々プロセスを停止させて実メモリに空きを作りましょう。
そこまでメモリが有効活用されていれば、この記事の作業自体いらない気もします。
結果
onodes@Balthazar:~$ free -h
total used free shared buff/cache available
Mem: 985M 578M 95M 34M 311M 224M
Swap: 1.0G 0B 1.0G
スワップを開放した直後なので、0Bになっています。
ここから、経過観察をしてみます。