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