让AWS的Redis和Google Cloud Platform的Redis进行速度对比
首先
这个和这个的续集
由于Google Cloud Platform(GCP)早前发布了全托管的Redis服务Memorystore,因此我无法压制住对于AWS的Redis和Memorystore哪个更快的疑问。
为了弄清ElasticCache和Memorystore哪个更快,我只能让它们展开一场较量。
顺便也会让我本地环境的Redis参与比拼。
测量的方法
-
- 計測にはredis-benchmarkコマンドを使用
-
- redis-benchmarkコマンドを3回実行して、その平均の値を使用
-
- AWSとGCPでは、可能な限り性能を合わせてみる
-
- redisにはEC2, GCEの各インスタンスから接続する
-
- ローカル環境は……特に何も考えません
-
- 実行結果は1sあたりに実行できた処理数
- プログラムがバグってたらごめんなさい
测量用程序
我尝试用Python2编写了一下。
# -*- coding: utf-8 -*-
import subprocess
import sys
import re
args = sys.argv
retry_count = 3
redis_host = args[1]
redis_connection_str = args[2]
redis_connections = redis_connection_str.split(",")
result_dict = {}
# 実行
for set_connection in redis_connections:
process_input = ["redis-benchmark", "-h", redis_host, "-p", "6379", "-c", set_connection, "-n", "500", "-q"]
for try_count in range(0, retry_count):
print("run -c {} try {}".format(set_connection, try_count))
stdout_str = subprocess.check_output(process_input)
each_rows = map(lambda x: re.sub(".+\r", "", x).strip(), stdout_str.split("\n"))
filter_rows = filter(lambda x: len(x) > 0, each_rows)
for command_row in filter_rows:
m = re.search("(.+?): (.+?) ", command_row)
result_key = m.group(1)
result_value = float(m.group(2))
if result_key not in result_dict:
result_dict[result_key] = {}
if set_connection not in result_dict[result_key]:
result_dict[result_key][set_connection] = []
result_dict[result_key][set_connection].append(result_value)
# 以降、実行結果をmarkdownに変換する文字列処理
开始测量!
快!
苹果电脑的本地环境
在Docker容器中启动Redis,并从主机上无休止地执行用于检查的程序……
主机是一代前的MacBook Pro。
由于触控栏和键盘反应非常差,有人能帮忙修一下吗……
同時接続数1102550100PING_INLINE2353.457969.5110608.4710929.517835.25PING_BULK2457.268510.7811025.6410512.610974.02SET2537.68268.410007.4210601.738585.86GET2586.338697.7610262.8410400.138389.2INCR2587.778756.119828.311441.88391.34LPUSH2466.039024.129926.8610679.279633.19RPUSH2257.28204.3410591.1310001.469817.63LPOP2486.27955.2310054.518888.899131.58RPOP2668.438421.6610245.5111472.838703.7SADD2424.718680.5611253.569685.858341.1SPOP2444.038451.559960.8810357.1410296.1LPUSH2466.039024.129926.8610679.279633.19LRANGE_100 (first 100 elements)2164.166744.588044.588136.867559.84LRANGE_300 (first 300 elements)1739.924482.194727.964270.314625.08LRANGE_500 (first 450 elements)1516.723545.413720.643268.293397.3LRANGE_600 (first 600 elements)1345.152773.832866.992661.242449.77MSET (10 keys)2462.28429.910256.118439.718446.97
AWS的弹性缓存
-
- EC2のスペック
EC2ではt2.2xlargeのマシンを選択しました
vCPU8, メモリ32GB
ElasticCacheのスペック
cache.r4.largeを選択
vCPU2, メモリ12.3GB
0.273$/h
redisのバージョンは最新で可用性は全てオミット
同時接続数1102550100PING_INLINE4486.4629090.9139285.7137500.032222.22PING_BULK4461.0530000.039285.7136111.1133333.34SET4647.0329090.9137500.037500.037896.83GET4483.6129090.9139285.7136111.1136785.71INCR4225.9129090.9137500.037500.038571.43LPUSH4168.328181.8237500.036111.1137896.83RPUSH4508.4130000.039285.7136111.1136785.71LPOP4524.228181.8237500.036111.1142857.14RPOP4328.3128181.8237500.036111.1136904.76SADD4353.3230000.039285.7134722.2237662.34HSET4266.7430000.039285.7136111.1135876.62SPOP4391.0930000.037500.036111.1140043.29LPUSH4168.328181.8237500.036111.1137896.83LRANGE_100 (first 100 elements)3820.8622527.4725000.025384.6229090.91LRANGE_300 (first 300 elements)2922.1410114.9410229.8911367.5312681.16LRANGE_500 (first 450 elements)2542.737570.68293.468354.019096.48LRANGE_600 (first 600 elements)2268.066464.297022.367147.445341.01MSET (10 keys)4225.9126515.1534722.2239285.7132222.22
GCP的Memorystore
-
- GCEのスペック
vCPU8
CPU数8、メモリ数30GBでEC2と比べると気持ちスペック低い
Memorystoreのスペック
cache.r4.largeを選択
CPUについては記載なし、メモリ12GB
ネットワークスループットは375MB/s
0.384$/h
redisのバージョンは最新で可用性は全てオミット
GCPでは4系は使えず3.2が最新でした
同時接続数1102550100PING_INLINE6149.8336111.1147619.0542857.1441071.43PING_BULK7083.3343452.3850000.045238.142857.14SET6778.8337896.8347619.0542857.1442857.14GET5960.7837896.8350000.045238.141071.43INCR7011.2941071.4350000.042857.1439285.71LPUSH6468.5337500.047619.0545238.141071.43RPUSH7169.0242857.1450000.042857.1441071.43LPOP6192.3541071.4347619.0542857.1442857.14RPOP7505.2839682.5450000.045238.141071.43SADD6310.6737500.050000.035238.139285.71SPOP6886.7941071.4347619.0545238.141071.43LPUSH6468.5337500.047619.0545238.141071.43LRANGE_100 (first 100 elements)4898.5823926.0828181.8225000.025116.55LRANGE_300 (first 300 elements)3169.6311549.8612681.1611396.0110114.94LRANGE_500 (first 450 elements)2487.127677.128337.628036.986999.5LRANGE_600 (first 600 elements)2281.76255.556433.226255.325661.72MSET (10 keys)6634.8330202.0236111.1137500.033333.34
在同时连接数为100的情况下进行对比的结果!
localAWSGCPPING_INLINE7835.2532222.2241071.43PING_BULK10974.0233333.3442857.14SET8585.8637896.8342857.14GET8389.236785.7141071.43INCR8391.3438571.4339285.71LPUSH9633.1937896.8341071.43RPUSH9817.6336785.7141071.43LPOP9131.5842857.1442857.14RPOP8703.736904.7641071.43SADD8341.137662.3439285.71SPOP10296.140043.2941071.43LPUSH9633.1937896.8341071.43LRANGE_100 (first 100 elements)7559.8429090.9125116.55LRANGE_300 (first 300 elements)4625.0812681.1610114.94LRANGE_500 (first 450 elements)3397.39096.486999.5LRANGE_600 (first 600 elements)2449.775341.015661.72MSET (10 keys)8446.9732222.2233333.34
本地的MacBook…嗯,无论什么都可以。
尝试比较了AWS和GCP,结果挺有趣的,对吧?
结果 (jié guǒ)
-
- PING_INLINE〜LPUSHまでの操作についてはGCPの方が気持ち早い? 単純な操作だと高速?
-
- LRANGE_100〜600が複数個のデータの取得のはずなんですが、多くなるにつれてAWSの方が早くなってきている?
-
- ただ、猛烈に差があるという訳でもないので誤差かもしれない……
-
- AWSはredis4、GCPはredis3というバージョンの違いがあるので、ここが同じになると結果が変わってくるかもしれない
-
- もっと大規模データになった時、GCPの方はスループットの方が上がるっぽそうだけれども、AWSの方はどうなんだろう?
-
- 性能にそこまで差がないのであれば、時間あたりの費用がお安めのAWSの方がコスパがいい?
- ただ、このあたりはレプリケーションやクラスタを組んでみたら結果が変わるかもしれない。
在Redis中速度并没有太大差异。
这是不是平局呢……?
如果要做出判断的话,算是AWS的胜利判定?
其实两者都已经足够快了。