2014年4月19日土曜日

EC2 で Redis を使うなら HVM AMI で使うと幸せかも

ご存知のとおり、Redis latency problems troubleshooting には
「EC2ではforkがとっても遅い」旨書かれている。EC2というよりはXenの issue。
これ =>  bug 1815 - Xen fork() system call is to slow 

だがしかし、paravirtual でのみ測ったものではないのかな?と思ったのでHVMとで比較してみたところ、これからはHVMだね(ニッコリ という結果だった。
現行世代でparavirtual/HVMが選べる場合は、HVMがよいでしょう。
https://aws.amazon.com/amazon-linux-ami/instance-type-matrix/ 

こんなのも。  Forking time in Xen 

http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html
をみると、
With HVM virtualization, the guest VM runs as if it were on a native hardware platform, except that it still uses PV network and storage drivers for improved performance.
と書かれているので、EC2でいう「HVM」はXenでの厳密な区分でいう「PVHVM」にあたるんだろう。=> http://wiki.xen.org/wiki/Xen_Overview#Guest_Types

これでもう「EC2だとfork遅いから云々」というのは過去のものになる(なりつつある)かな。まだまだ(旧世代のも含め) paravirtualでの利用は多いんだろうけど。

EC2 にかぎらず、AWS自体が前の知識のままでいると置いてかれるので、定期的に「前のあれ今やってみるとどうなるかなー」と試してみると良いかんじね。

その後ぐぐってみると、2012年11月の時点で検証してる人いたので、「なにを今更・・・」感はある。。これ。
Benchmarking the new AWS M3 instances with Redis
この場合は m2.2xlarge と m3.2xlarge の比較。
stackoverflow にも。
Best EC2 setup for redis server

それはさておき、つぎのように実施した。

環境
・リージョン: Oregon
・EC2 m3.2xlarge (当初m3.mediumでやってたけどトロいので変更)
・AMI
 amzn-ami-hvm-2014.03.1.x86_64-ebs (ami-383a5008)
 amzn-ami-pv-2014.03.1.x86_64-ebs (ami-043a5034)
・Redis 2.8.8
  ソースから make ; make install していれただけ
  redis.conf は 次のとおり. diff元はtar玉に入っていたもの。

$ diff  redis.conf /usr/local/etc/redis.conf
37c37
< daemonize no
---
> daemonize yes
103c103
< logfile ""
---
> logfile /usr/local/var/redis/redis.log
187c187
< dir ./
---
> dir /usr/local/var/redis

・m3.2xlarge なんで今回きにしなくていいんだけど vm.overcommit_memory を 1にしておいてもよい


準備
・てきとうにデータを投入(キー数1億. メモリ使用量が8G強)

その1
・bgsave 後に redis-cli info してでてくる latest_fork_usec を確認
・繰り返し

その2
・起動
・停止
・をひたすら繰り返し、ログにでてくる DB loaded from disk を確認

その1結果
HVM: 4900us 弱 (5ms 弱)
paravirtual: 1840000us 強 (1.8s 強)

* コマンドラインで叩いた場合、paravirtualだと「もっさり感」がある。


その2結果
HVM: 94s
paravirtual: 114s


ほか
・slave作成時もHVMが高速なんじゃないかな
・インスタンスストア使わずにルートボリュームに dump.rdb おいてたので、インスタンスストア使うとその2は違ってくるかも
・redis-cli --latency -h `host` -p `port` をしておいてもよかった


その1結果詳細
HVM:
Background saving started
used_memory_human:8.30G
latest_fork_usec:4838
db0:keys=100000000,expires=0,avg_ttl=0

Background saving started
used_memory_human:8.30G
latest_fork_usec:4730
db0:keys=100000000,expires=0,avg_ttl=0

Background saving started
used_memory_human:8.30G
latest_fork_usec:4827
db0:keys=100000000,expires=0,avg_ttl=0

Background saving started
used_memory_human:8.30G
latest_fork_usec:4734
db0:keys=100000000,expires=0,avg_ttl=0

Background saving started
used_memory_human:8.30G
latest_fork_usec:4871
db0:keys=100000000,expires=0,avg_ttl=0

Background saving started
used_memory_human:8.30G
latest_fork_usec:4855
db0:keys=100000000,expires=0,avg_ttl=0

Background saving started
used_memory_human:8.30G
latest_fork_usec:4852
db0:keys=100000000,expires=0,avg_ttl=0

Background saving started
used_memory_human:8.30G
latest_fork_usec:4833
db0:keys=100000000,expires=0,avg_ttl=0

Background saving started
used_memory_human:8.30G
latest_fork_usec:4858
db0:keys=100000000,expires=0,avg_ttl=0

Background saving started
used_memory_human:8.30G
latest_fork_usec:4808
db0:keys=100000000,expires=0,avg_ttl=0

paravirtual:
Background saving started
used_memory_human:8.30G
latest_fork_usec:1844786
db0:keys=100000000,expires=0,avg_ttl=0

Background saving started
used_memory_human:8.30G
latest_fork_usec:1844741
db0:keys=100000000,expires=0,avg_ttl=0

Background saving started
used_memory_human:8.30G
latest_fork_usec:1843755
db0:keys=100000000,expires=0,avg_ttl=0

Background saving started
used_memory_human:8.30G
latest_fork_usec:1842669
db0:keys=100000000,expires=0,avg_ttl=0

Background saving started
used_memory_human:8.30G
latest_fork_usec:1847125
db0:keys=100000000,expires=0,avg_ttl=0

Background saving started
used_memory_human:8.30G
latest_fork_usec:1845629
db0:keys=100000000,expires=0,avg_ttl=0

Background saving started
used_memory_human:8.30G
latest_fork_usec:1845080
db0:keys=100000000,expires=0,avg_ttl=0

Background saving started
used_memory_human:8.30G
latest_fork_usec:1844727
db0:keys=100000000,expires=0,avg_ttl=0

Background saving started
used_memory_human:8.30G
latest_fork_usec:1845251
db0:keys=100000000,expires=0,avg_ttl=0

Background saving started
used_memory_human:8.30G
latest_fork_usec:1849802
db0:keys=100000000,expires=0,avg_ttl=0


その2結果詳細
HVM:
DB loaded from disk: 94.132 seconds
DB loaded from disk: 93.905 seconds
DB loaded from disk: 93.713 seconds
DB loaded from disk: 94.064 seconds
DB loaded from disk: 93.946 seconds
DB loaded from disk: 94.087 seconds
DB loaded from disk: 94.007 seconds
DB loaded from disk: 94.474 seconds
DB loaded from disk: 94.197 seconds
DB loaded from disk: 93.898 seconds

paravirtual:
DB loaded from disk: 115.066 seconds
DB loaded from disk: 113.277 seconds
DB loaded from disk: 113.989 seconds
DB loaded from disk: 114.039 seconds
DB loaded from disk: 114.327 seconds
DB loaded from disk: 113.247 seconds
DB loaded from disk: 114.156 seconds
DB loaded from disk: 114.122 seconds
DB loaded from disk: 114.245 seconds
DB loaded from disk: 118.952 seconds


おまけ
MBP Mid 2012 での結果. latest_fork_usecだけ.
latest_fork_usec:4225
latest_fork_usec:4409
latest_fork_usec:4322
latest_fork_usec:4616
latest_fork_usec:4328
latest_fork_usec:4300
latest_fork_usec:4447
latest_fork_usec:4253
latest_fork_usec:4216

0 件のコメント:

コメントを投稿