【问题标题】:Benchmark Redis under Twemproxy with redis-benchmark使用 redis-benchmark 在 Twemproxy 下对 Redis 进行基准测试
【发布时间】:2016-01-11 20:33:07
【问题描述】:

我正在尝试使用 Redis 和 Twemproxy 测试一个非常简单的设置,但我找不到让它更快的方法。

我有 2 个以最低配置运行的 redis 服务器:

./redis-server --port 6370
./redis-server --port 6371

从源代码编译并在具有所有适当内存和 CPU 的 1 台机器下运行。

如果我在其中一个实例中运行 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

【问题讨论】:

    标签: redis benchmarking twemproxy


    【解决方案1】:

    这似乎违反直觉,但将两个带有代理的 redis 实例放在它们前面肯定会降低性能!

    在单实例场景中,redis-benchmark 直接连接到 redis 服务器,因此每个请求的延迟最小。

    一旦您将两个实例和一个 twemproxy 放在它们前面,想想会发生什么 - 您连接到 twemproxy,它会分析请求、选择正确的实例并连接到它。

    因此,首先,每个请求现在都有两个网络跃点,而不是一个。增加的延迟当然意味着更少的吞吐量。

    另外,您只使用了一个 twemproxy 实例。因此,我们假设 twemproxy 本身的性能或多或少类似于单个 redis 实例,您永远无法使用单个代理击败单个实例。

    Twemproxy 便于横向扩展,而不是纵向扩展。它允许您将集群扩展到单个实例永远无法达到的大小。但是要付出延迟的代价,而且只要您使用单个代理,它也是吞吐量的代价。

    【讨论】:

    • 很好的答案-> +1。然而,我首先不同意“肯定会降低性能!”的绝对语气。 :) 在某些情况下,代理实际上会提高性能(例如,通过保持低连接数、执行隐式流水线和保持持久连接),因此它非常依赖于具体情况。此外,如果代理和实例位于同一服务器上,您可以节省大部分额外跃点的延迟(至少在某些情况下可行)。最后,单个代理可能会使用多个线程,因此它可能通过跨多个 Redis 并行化请求来击败单个 Redis #JustSayin'
    • @ItamarHaber 整个实验是在单台机器上完成的,所以我猜 CPU 利用率也会发挥作用,假设有 2-4 个内核。但是是的,理论上如果你有 4 个核心、2 个 redis 实例和一个带有 2 个 io 线程的 twemproxy,并且你在外部运行 redis-benchmark,你可能会看到更长的操作的吞吐量增加。简而言之(get/set)我会说瓶颈是延迟,所以你不会看到太大的变化。
    • 非常感谢您的回答!您对我设置的场景有什么建议,以便我可以看到性能提升?例如如果我要求 redis-benchmark 有更多的连接?还是别的什么??
    • 另外,如果我理解正确的话,性能下降的问题是由于额外的延迟而不是由于吞吐量饱和,对吧?
    • @ΑναστάσηςΑνδρονίδης 尝试流水线,将 -P 500 添加到 redis 基准参数
    【解决方案2】:

    代理对每个请求征收少量税款。使用带有一台服务器的代理来测量吞吐量。施加负载,直到吞吐量停止增长并且响应时间缓慢到爬行。添加另一台服务器并注意响应时间恢复正常,而容量刚刚翻了一番。当然,您需要在响应时间开始爬行之前添加服务器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-05
      • 1970-01-01
      • 2013-02-25
      • 2016-12-24
      • 2022-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多