1

CentOS 6.4 で redis とくるみ割り人形をセットアップします。ServiceStack.Redis クライアントを使用して接続しようとしています。重大なパフォーマンスの問題が見つかりました。

テスト用に1つのredisインスタンスのみを残しました

beta:
  listen: 0.0.0.0:22122
  hash: fnv1a_64
  distribution: ketama
  auto_eject_hosts: true
  #timeout: 5000
  #server_retry_timeout: 2000
  #server_failure_limit: 3
  redis: true
  servers:
  #- 127.0.0.1:6379:1
   - 127.0.0.1:6380:1

次の単体テストでは、くるみ割り人形を介して 100k 文字列を redis に送信しようとしています。

[TestClass]
public class RedisProxyTest
{
    public string host = "192.168.56.112";
    //public int port = 6379;
    public int port = 22122;

    [TestMethod]
    public void TestMethod1()
    {
        var key = "l2";
        var count = 100000;
        using (var redisClient = new RedisClient(host, port))
        {
            var list = new List<string>();
            for (int i = 0; i < count; i++)
            {
                list.Add(Guid.NewGuid().ToString());
            }

            Utils.TimeLog("Remove", () => redisClient.Remove(key));

            Utils.TimeLog("AddRangeToList", () => redisClient.AddRangeToList(key, list));
        }

        using (var redisClient = new RedisClient(host, port))
        {
            redisClient.GetListCount(key);

            Utils.TimeLog("GetRangeFromList", () =>
            {
                var ret = redisClient.GetRangeFromList(key, count / 2, count - 1);
                Console.WriteLine(ret.Count);
            });
        }

    }
}

ナットクラッカーが再起動した後の最初の数回の実行では、AddRangeToList は 1 ~ 2 秒で機能します。ただし、その後の実行では、AddRangeToList のパフォーマンスが数分から 20 分を超えても大幅に低下します (タイムアウトが構成されていない場合)。redisを直接使用すると、同じことを再現できません。私はまだ他のクライアントを試していません。理由はありますか?

これは、単体テストの実行後にコンソールに表示されるものです。

Test Name:  TestMethod1
Test Outcome:   Passed  
Remove: 0.0331171
AddRangeToList: 806.8219166
50000
GetRangeFromList: 1.741737
4

2 に答える 2

2

この問題は、その量のデータを転送する際のメモリ使用量が多いことに関連しているようです。

デフォルトでは、nutcracker は各キーに 16k のバッファ サイズを割り当てます。私の場合、16k*100000 = 1.5Gbになります。ナットクラッカーのプロセスを見ていると、2Gb あたりのピークが見られました。Cent OS VM が過負荷になり、そのスパイクを処理するのに十分なメモリがありませんでした。

于 2013-11-17T00:55:38.020 に答える