2

Redis と Twemproxy を使用して非常に単純なセットアップをテストしようとしていますが、高速化する方法が見つかりません。

最小限の構成で実行する 2 つの redis サーバーがあります。

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

ソースからコンパイルされ、適切なメモリと CPU をすべて備えた 1 台のマシンで実行されます。

インスタンスの 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"

ここで、2 つのインスタンスの前で 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 を使用していることを忘れていました。

4

2 に答える 2

1

直感に反するように思えるかもしれませんが、redis の 2 つのインスタンスをその前にプロキシとともに配置すると、確実にパフォーマンスが低下します!

単一インスタンスのシナリオでは、redis-benchmark は直接 redis サーバーに接続するため、リクエストごとのレイテンシが最小限に抑えられます。

2 つのインスタンスと 1 つの temproxy をそれらの前に配置したら、何が起こるか考えてみてください。temproxy に接続すると、リクエストが分析され、適切なインスタンスが選択され、それに接続されます。

そのため、まず第一に、各リクエストには 1 つではなく 2 つのネットワーク ホップが移動するようになりました。レイテンシが追加されるということは、もちろんスループットが低下することを意味します。

また、temproxy インスタンスを 1 つだけ使用しています。したがって、temproxy 自体が多かれ少なかれ単一の redis インスタンスのように機能すると仮定しましょう。単一のプロキシで単一のインスタンスを打ち負かすことはできません。

Twemproxy は、スケールアップではなく、スケールアウトを容易にします。これにより、単一のインスタンスでは達成できないサイズまでクラスターを成長させることができます。しかし、支払うべき待ち時間の代償があり、単一のプロキシを使用している限り、それはスループットの代償でもあります.

于 2016-01-11T21:42:01.417 に答える
1

プロキシは、リクエストごとに少額の税金を課します。1 台のサーバーでプロキシを使用してスループットを測定します。スループットの増加が停止し、応答時間が遅くなるまで負荷をかけます。別のサーバーを追加すると、容量が 2 倍になるだけで、応答時間が通常に戻ることに注意してください。もちろん、応答時間がクロールを開始する前にサーバーを追加することをお勧めします。

于 2016-02-28T04:45:48.317 に答える