使用 redis-benchmark 在 Twemproxy 下对 Redis 进行基准测试
Benchmark Redis under Twemproxy with redis-benchmark
我正在尝试使用 Redis 和 Twemproxy 测试一个非常简单的设置,但我找不到让它更快的方法。
我有 2 个 redis 服务器,我 运行 具有最低配置:
./redis-server --port 6370
./redis-server --port 6371
从源代码编译和 运行在 1 台具有所有适当内存和 CPU 的机器下运行。
如果我 运行 在其中一个实例中使用 redis-benchmark,我会得到以下结果:
./redis-benchmark --csv -q -p 6371 -t set,get,incr,lpush,lpop,sadd,spop -r 100000000
"SET","161290.33"
"GET","176366.86"
"INCR","170940.17"
"LPUSH","178571.42"
"LPOP","168350.17"
"SADD","176991.16"
"SPOP","168918.92"
现在我想在两个实例前面使用Twemproxy来分发请求并获得更高的吞吐量(至少这是我期望的!)。
我为 Twemproxy 使用了以下配置:
my_cluster:
listen: 127.0.0.1:6379
hash: fnv1a_64
distribution: ketama
auto_eject_hosts: false
redis: true
servers:
- 127.0.0.1:6371:1 server1
- 127.0.0.1:6372:1 server2
而我 运行 胡桃夹子作为:
./nutcracker -c twemproxy_redis.yml -i 5
结果很失望:
./redis-benchmark -r 1000000 --csv -q -p 6379 -t set,get,incr,lpush,lpop,sadd,spop-q -p 6379
"SET","112485.94"
"GET","113895.21"
"INCR","110987.79"
"LPUSH","145560.41"
"LPOP","149700.61"
"SADD","122100.12"
我试图通过获取 Twemproxy 的统计数据来了解发生了什么:
telnet 127.0.0.1 22222
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
{
"service": "nutcracker",
"source": "localhost.localdomain",
"version": "0.4.1",
"uptime": 10,
"timestamp": 1452545028,
"total_connections": 303,
"curr_connections": 3,
"my_cluster": {
"client_eof": 300,
"client_err": 0,
"client_connections": 0,
"server_ejects": 0,
"forward_error": 0,
"fragments": 0,
"server1": {
"server_eof": 0,
"server_err": 0,
"server_timedout": 0,
"server_connections": 1,
"server_ejected_at": 0,
"requests": 246791,
"request_bytes": 11169484,
"responses": 246791,
"response_bytes": 1104215,
"in_queue": 0,
"in_queue_bytes": 0,
"out_queue": 0,
"out_queue_bytes": 0
},
"server2": {
"server_eof": 0,
"server_err": 0,
"server_timedout": 0,
"server_connections": 1,
"server_ejected_at": 0,
"requests": 353209,
"request_bytes": 12430516,
"responses": 353209,
"response_bytes": 2422648,
"in_queue": 0,
"in_queue_bytes": 0,
"out_queue": 0,
"out_queue_bytes": 0
}
}
}
Connection closed by foreign host.
是否有任何其他基准可以正常工作?或者 redis-benchmark
应该有效?
我忘了说我正在使用 Redis:3.0.6 和 Twemproxy:0.4.1
看似counter-intuitive,但是把两个带代理的redis实例放在前面肯定会降低性能!
在单实例场景中,redis-benchmark 直接连接到 redis 服务器,因此每个请求的延迟最小。
一旦您将两个实例和一个 twemproxy 放在它们前面,想想会发生什么 - 您连接到 twemproxy,它分析请求,选择正确的实例,然后连接到它。
因此,首先,每个请求现在有两个网络跃点要传输,而不是一个。当然,增加的延迟意味着更少的吞吐量。
此外,您只使用了一个 twemproxy 实例。因此,让我们假设 twemproxy 本身的性能或多或少类似于单个 redis 实例,您永远无法用单个代理击败单个实例。
Twemproxy 有助于横向扩展,而不是纵向扩展。它允许您将集群扩展到单个实例永远无法达到的规模。但是要付出延迟的代价,而且只要您使用的是单个代理,这也是吞吐量的代价。
代理对每个请求征收少量税款。在一台服务器上使用代理测量吞吐量。施加负载,直到吞吐量停止增长并且响应时间变慢。添加另一台服务器并注意响应时间恢复正常,而容量增加了一倍。当然,您会希望在响应时间开始变慢之前添加服务器。
我正在尝试使用 Redis 和 Twemproxy 测试一个非常简单的设置,但我找不到让它更快的方法。
我有 2 个 redis 服务器,我 运行 具有最低配置:
./redis-server --port 6370
./redis-server --port 6371
从源代码编译和 运行在 1 台具有所有适当内存和 CPU 的机器下运行。
如果我 运行 在其中一个实例中使用 redis-benchmark,我会得到以下结果:
./redis-benchmark --csv -q -p 6371 -t set,get,incr,lpush,lpop,sadd,spop -r 100000000
"SET","161290.33"
"GET","176366.86"
"INCR","170940.17"
"LPUSH","178571.42"
"LPOP","168350.17"
"SADD","176991.16"
"SPOP","168918.92"
现在我想在两个实例前面使用Twemproxy来分发请求并获得更高的吞吐量(至少这是我期望的!)。
我为 Twemproxy 使用了以下配置:
my_cluster:
listen: 127.0.0.1:6379
hash: fnv1a_64
distribution: ketama
auto_eject_hosts: false
redis: true
servers:
- 127.0.0.1:6371:1 server1
- 127.0.0.1:6372:1 server2
而我 运行 胡桃夹子作为:
./nutcracker -c twemproxy_redis.yml -i 5
结果很失望:
./redis-benchmark -r 1000000 --csv -q -p 6379 -t set,get,incr,lpush,lpop,sadd,spop-q -p 6379
"SET","112485.94"
"GET","113895.21"
"INCR","110987.79"
"LPUSH","145560.41"
"LPOP","149700.61"
"SADD","122100.12"
我试图通过获取 Twemproxy 的统计数据来了解发生了什么:
telnet 127.0.0.1 22222
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
{
"service": "nutcracker",
"source": "localhost.localdomain",
"version": "0.4.1",
"uptime": 10,
"timestamp": 1452545028,
"total_connections": 303,
"curr_connections": 3,
"my_cluster": {
"client_eof": 300,
"client_err": 0,
"client_connections": 0,
"server_ejects": 0,
"forward_error": 0,
"fragments": 0,
"server1": {
"server_eof": 0,
"server_err": 0,
"server_timedout": 0,
"server_connections": 1,
"server_ejected_at": 0,
"requests": 246791,
"request_bytes": 11169484,
"responses": 246791,
"response_bytes": 1104215,
"in_queue": 0,
"in_queue_bytes": 0,
"out_queue": 0,
"out_queue_bytes": 0
},
"server2": {
"server_eof": 0,
"server_err": 0,
"server_timedout": 0,
"server_connections": 1,
"server_ejected_at": 0,
"requests": 353209,
"request_bytes": 12430516,
"responses": 353209,
"response_bytes": 2422648,
"in_queue": 0,
"in_queue_bytes": 0,
"out_queue": 0,
"out_queue_bytes": 0
}
}
}
Connection closed by foreign host.
是否有任何其他基准可以正常工作?或者 redis-benchmark
应该有效?
我忘了说我正在使用 Redis:3.0.6 和 Twemproxy:0.4.1
看似counter-intuitive,但是把两个带代理的redis实例放在前面肯定会降低性能!
在单实例场景中,redis-benchmark 直接连接到 redis 服务器,因此每个请求的延迟最小。
一旦您将两个实例和一个 twemproxy 放在它们前面,想想会发生什么 - 您连接到 twemproxy,它分析请求,选择正确的实例,然后连接到它。
因此,首先,每个请求现在有两个网络跃点要传输,而不是一个。当然,增加的延迟意味着更少的吞吐量。
此外,您只使用了一个 twemproxy 实例。因此,让我们假设 twemproxy 本身的性能或多或少类似于单个 redis 实例,您永远无法用单个代理击败单个实例。
Twemproxy 有助于横向扩展,而不是纵向扩展。它允许您将集群扩展到单个实例永远无法达到的规模。但是要付出延迟的代价,而且只要您使用的是单个代理,这也是吞吐量的代价。
代理对每个请求征收少量税款。在一台服务器上使用代理测量吞吐量。施加负载,直到吞吐量停止增长并且响应时间变慢。添加另一台服务器并注意响应时间恢复正常,而容量增加了一倍。当然,您会希望在响应时间开始变慢之前添加服务器。