AWS EC2インスタンスのメモリ不足対策

このBlogに何度か記事にしていますが、このBlogはLightsailに複数のDockerインスタンスを立てて運用しています。契約しているのは月5ドルのメモリが1GBのプランであり、CPUはまったく使っていないものの、メモリは不足した状態で、エラーが出てしまうため、SWAPをONにして運用していました。※SWAPONの方法はこちら ところが最近徐々にCPUが使用率が高騰し、全くサービスが継続不能な自体に何度か陥りましたので、その対策をします。

徐々にCPU使用率が上がり最後には動かなくなる。

原因はswap処理

サーバーにSSHでログインしTOPコマンドで状況を確認していると、なんだかちらほらkswapd0が上位にチラホラ、調べてみるとkswapdは仮想メモリを管理するプロセスのようです。

暫く運用すると、物理メモリは1GBに対して、物理とSwapのUsed合計が1.2GBを超える

なぜサービス提供不能に陥るのか?

EC2やLightsailのインスタンスでSWAPは初期立ち上げ時に設定されておらず、私が後から設定しました。しかしながら、物理サーバにUbuntu18をインストールした場合、標準でSWAPが設定され使用していないメモリ領域などの退避などに日常的に使われているはずです。Lightsailのインスタンスでなぜうまく機能しないのか不思議に思っていました。

亡くなる寸前を捉える

ログインしてVMSTAT 10を仕掛けておいたところ、亡くなる寸前を捉えました。procsのbの値(IO待ちスレッド数)があがり、cpuのwaが99か100となっています。つまりIOボトルネックにより何も処理出来ない状態を示しています。

徐々にbの値があがり、waが100%に張り付く

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を活用しながら動いてほしいのです。

docker statsによるメモリ使用量の確認 LIMITを100MBに設定しているが問題が発生する。

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

今の所安定稼働

もちろんメモリ使用量を減らしたり、メモリを増設することが一番ですが、上記チューニングでサービス提供負荷となることはなくなりました。さらに継続運用して状況を見てみたいと思います。

投稿を作成しました 103

AWS EC2インスタンスのメモリ不足対策” に1件のコメント

コメントを残す

関連する投稿

検索語を上に入力し、 Enter キーを押して検索します。キャンセルするには ESC を押してください。

トップに戻る
%d人のブロガーが「いいね」をつけました。