はじめに
たまにサーバ速度がなんとなく遅いので、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になっています。
ここから、経過観察をしてみます。