EC2 t2.micro でメモリーが不足した場合の挙動について調べてみた

2014.12.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは植木和樹です。前回のブログでstressツールを使ってサーバーを高負荷にする方法をご紹介しました。

今回はstressツールを使って、メモリー搭載量の少ないt2.microインスタンスでメモリーを消費し続けた場合にどういう挙動になるのか調べてみました。

実験準備

t2.microはメモリー1GBですが、単純にメモリーを1GB(-m でワーカー4つ)割り当てようとするとメモリーが不足してstressツールが失敗してしまいます。

$ stress -m 4
stress: info: [22591] dispatching hogs: 0 cpu, 0 io, 4 vm, 0 hdd
stress: FAIL: [22595] (494) hogvm malloc failed: Cannot allocate memory
stress: FAIL: [22591] (394) <-- worker 22595 returned error 1
stress: WARN: [22591] (396) now reaping child worker processes
stress: FAIL: [22591] (451) failed run completed in 6s

そこでまずはスワップファイルを作成し、仮想メモリーを追加しておきましょう。

$ sudo -s
# fallocate -l 1024m /tmp/swap.img
# mkswap /tmp/swap.img
# chmod 600 /tmp/swap.img
# swapon /tmp/swap.img
$ free
             total       used       free     shared    buffers     cached
Mem:       1020140      61540     958600          0       2600      13452
-/+ buffers/cache:      45488     974652
Swap:      1048572          0    1048572

メモリー消費実験

スワップ発生

改めてメモリーの割り当て/解放を実施させた状態でvmstatをみてみました。

$ stress -m 4

stressを動かしてすぐは、メモリが足りなくなるためスワップが発生します。

procs -----------memory---------- ----swap---- -----io----- --system-- -----cpu------
 r  b   swpd   free   buff  cache    si     so    bi     bo   in   cs  us sy id wa st
 4  0      0 133480   2632  13668     0      0     0      0  129  100   5 36  0  0 59
 0  5 155972  54432    204   3900   900 221564   900 221600 2170 3281   0  6  0 89  5
 0  5 250928  65504     52   1156 85500  29576 85500  29576 3070 5698   0  1  0 93  6
 0  5 289572  70088     52   1148 33904  38644 33904  38644 1393 2231   0  0  0 96  4

スワップが発生している状態だと、vmstatでみた場合に次のような傾向があるようです。

  • 空きメモリが減少し、スワップが発生している(memory の freeとswpd)
  • SwapIn(si), SwapOut(so)が発生している
  • プロセスのブロックが発生している(procs b)
  • CPU Wait I/Oが発生している(cpu wa)

しばらくすると、スワップが落ち着きます(memory freeは変化しているが、それ以外は安定)。その後10分周期くらいでスワップ発生→落ち着くという挙動を繰り返します。

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 5  0  14876 636880   1712  14944    0    0     0     0  263  278  8 92  0  0  0
 4  0  14872 269892   1712  14948    0    0     0     0  264  281 11 89  0  0  0
 4  0  14872 194248   1712  14944    0    0     0     0  265  282  7 93  0  0  0
 4  0  14872 705100   1712  14944    0    0     0     0  261  283 10 90  0  0  0
 4  0  14872 346064   1712  14944    0    0     0     0  262  280 10 90  0  0  0

stressツールを動かしてから30分程経過するとCPU Credit Balanceを使い切ってしまいます。

20141229_001_cpu_credit_balance

そのためスワップに必要なCPUがStolenになってしまい、スワップが発生しにくくなります。下に掲載したvmstatのグラフで水色のsystem段階的に減少し、グレーのstolenが増えているのが分かりますね。

20141229_004_vmstat

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ ---timestamp---
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 5  0  17536 430848    448   3360    0    0     0     0   54   45  2 17  0  0 81        2014-12-29 06:09:57 UTC
 4  0  17536 166156    448   3360    0    0     0     0   55   44  1 16  0  0 83        2014-12-29 06:09:58 UTC
 2  7  73564  49524    448   3380   16 56028    16 56032  167  284  2  9  0 32 57       2014-12-29 06:09:59 UTC
 0  8 147132  52316    448   3784   68 73592   520 73592  610  436  0  7  0 69 24       2014-12-29 06:10:01 UTC
:
:
 0  5 565608  81912     44   1600 37328 40320 37328 40320 1610 2640  0  5  0 85 10      2014-12-29 06:10:32 UTC
 5  4 524284  73880     44   1488 49424 10668 49424 10668 1863 3463  1  9  0 62 28      2014-12-29 06:10:33 UTC
 5  4 524284  69316     44   1484 64708   16 64708    16 1977 4088  0  5  0 49 46       2014-12-29 06:10:34 UTC
 5  3 398652 231404     44   1488 50968  284 50968   284 1592 3257  0  8  0 41 51       2014-12-29 06:10:35 UTC
 6  0  50500 721144     44   1496 2584    0  2584     0  136  218  1 17  0  0 82        2014-12-29 06:10:36 UTC
 5  0  18520 552772     44   1484   36    0    36     0   60   66  1 17  0  0 82        2014-12-29 06:10:37 UTC

6:10頃に一時的に大量のスワップが発生していますが、vmstatのprocsがbrに戻るまでに通常の2〜3倍(30〜40秒)近くかかっています。もう少しプログラムレベルでみてみないと分かりませんが、もしかしたらmalloc処理で異常に時間がかかっているかもしれません。

まとめ

今回はstressツールを使って、大量スワッピング(スラッシング)を強制的に発生させてみました。

  • スワップが発生するとCPU Waitが発生し、procsのb(Block)の数値があがる。
  • メモリースワップにもCPU(System)を使用する。
  • t2ファミリーなどCPU Credit Balance枯渇によってCPU性能が大きく低下する場合、アプリケーション処理+メモリ確保それぞれで著しい性能低下が発生する。

新しインスタンスタイプを本番環境に投入する前には、負荷試験だけでなく耐久試験(エイジングテストと呼んだりもします)を行うのが良いかと思います。