このBlogに何度か記事にしていますが、このBlogはLightsailに複数のDockerインスタンスを立てて運用しています。契約しているのは月5ドルのメモリが1GBのプランであり、CPUはまったく使っていないものの、メモリは不足した状態で、エラーが出てしまうため、SWAPをONにして運用していました。※SWAPONの方法はこちら ところが最近徐々にCPUが使用率が高騰し、全くサービスが継続不能な自体に何度か陥りましたので、その対策をします。
原因はswap処理
サーバーにSSHでログインしTOPコマンドで状況を確認していると、なんだかちらほらkswapd0が上位にチラホラ、調べてみるとkswapdは仮想メモリを管理するプロセスのようです。
なぜサービス提供不能に陥るのか?
EC2やLightsailのインスタンスでSWAPは初期立ち上げ時に設定されておらず、私が後から設定しました。しかしながら、物理サーバにUbuntu18をインストールした場合、標準でSWAPが設定され使用していないメモリ領域などの退避などに日常的に使われているはずです。Lightsailのインスタンスでなぜうまく機能しないのか不思議に思っていました。
亡くなる寸前を捉える
ログインしてVMSTAT 10を仕掛けておいたところ、亡くなる寸前を捉えました。procsのbの値(IO待ちスレッド数)があがり、cpuのwaが99か100となっています。つまりIOボトルネックにより何も処理出来ない状態を示しています。
SWAP書き込み速度が気になる
SWAPが連続的に発生すると収集つかない状態になるのが気になり、インスタンスディスクの読み書きの速度を計測しました。結果は読み込みが81.12MB/sec、書き込みが68.1MB/s うあ、HDDでも100MB/sec超える時代にこれは遅い・・・テストはシーケンシャルな書き込みなので、ランダムの場合はもっと遅い可能性があります。
$ sudo hdparm -tT /dev/xvda1 /dev/xvda1: Timing cached reads: 18120 MB in 1.99 seconds = 9107.81 MB/sec Timing buffered disk reads: 246 MB in 3.03 seconds = 81.12 MB/sec $ dd bs=1M count=1000 if=/dev/zero of=/home/ubuntu/disktest oflag=direct 1000+0 records in 1000+0 records out 1048576000 bytes (1.0 GB, 1000 MiB) copied, 15.3883 s, 68.1 MB/s
本当にメモリは足りないのか?
もちろんメモリはあればあるほどよいです。でもDockerで使用しているのは500MBを下回る値、全てがフル稼働しているわけではないので、適切にSWAPを活用しながら動いてほしいのです。
UtuntuのSWAP設定の変更で改善
SWAPについて調べていたところ、以下の記事にたどり着いた。
スワップされて困っちゃうのでswappinessを設定する
https://qiita.com/ikuwow/items/f0b4d1f509a0b83b5d7e
どうやら記事によると、Linuxカーネル2.6移行メモリスワップの度合いを調整出来るとのこと。0から100までの間で設定できて、0にするとRAMを使いきるまでスワップしない。100だとパフォーマンスに悪影響を及ぼすレベルでガンガンスワップする。らしい。ちなみにデフォルトは60
デフォルトが60に嫌な感じがしました。60なのでどちらかというとSWAPに優先的に貯めておきましょうという設定。起動時は問題なく徐々に死んでいくのは使っていくうちにSWAPに蓄積される量が増えてその分IOwaitが増えていくのではないかと考えました。
同記事を参考にvm.swappinessを変更変更は簡単です。
#現在の設定を確認 $ sudo sysctl vm.swappiness vm.swappiness = 60 #設定を変更する $ sudo sysctl vm.swappiness=10 vm.swappiness = 10 変更された設定を確認 $ sudo sysctl vm.swappiness vm.swappiness = 10 #定常的に変更を行いたい場合 $ sudo vi /etc/sysctl.conf vm.swappiness = 10 #追記 #設定を読み込み $ sudo sysctl -p vm.swappiness = 10 設定を確認 ubuntu@ubu01:~/docker$ sudo sysctl vm.swappiness vm.swappiness = 10
今の所安定稼働
もちろんメモリ使用量を減らしたり、メモリを増設することが一番ですが、上記チューニングでサービス提供負荷となることはなくなりました。さらに継続運用して状況を見てみたいと思います。
“AWS EC2インスタンスのメモリ不足対策” に1件のコメント