redis性能向上とNagelアルゴリズム

4064 ワード

江湖では、redisでcommand(「get or set key value」)のvalueの長さが1 kを超えると、その性能が急激に低下すると噂されている.
redisのコードを少し見て、そのネットワークモジュールがnagelアルゴリズムを閉じていることに気づきました.redisのソースコードを修正してこのアルゴリズムを起動したらどうなりますか.
1 redisデフォルトコードテストを採用(すなわちnagelアルゴリズムを閉じる)
このアルゴリズムが有効かどうかを検証するために、redisのパフォーマンスに影響を及ぼすかどうかを確認します.まずredisのコードを変更せずに、redis-benchmarkを使用してテストを行い、次のコマンドを実行します.
./redis-benchmark -p 30000 -n 50000 -k 1 -d 2048 -q

上記のコマンド関連パラメータは、接続サーバport 30000、テスト50000回、keepaliveオプションを開く、value長2 k、出力結果のみがテストプロセスを出力しないことを意味します. 
テスト結果は次のとおりです.
SET: 51599.59 requests per second
GET: 50403.23 requests per second
INCR: 55493.89 requests per second
LPUSH: 54112.55 requests per second
LPOP: 48875.86 requests per second
SADD: 54644.81 requests per second
SPOP: 54112.55 requests per second
LPUSH (needed to benchmark LRANGE): 49067.71 requests per second
LRANGE_600 (first 600 elements): 400.68 requests per second
MSET (10 keys): 33134.53 requests per second

    
2 socketデフォルト属性を使用
次は/redis-2.8.19/networkingです.cのcreateClient関数:
  53 redisClient *createClient(int fd) {
  54     redisClient *c = zmalloc(sizeof(redisClient));
  55 
  56     /* passing -1 as fd it is possible to create a non connected client.
  57      * This is useful since all the Redis commands needs to be executed
  58      * in the context of a client. When commands are executed in other
  59      * contexts (for instance a Lua script) we need a non connected client. */
  60     if (fd != -1) {
  61         anetNonBlock(NULL,fd);
  62         // anetEnableTcpNoDelay(NULL,fd);
  63         if (server.tcpkeepalive)
  64             anetKeepAlive(NULL,fd,server.tcpkeepalive);
  65         if (aeCreateFileEvent(server.el,fd,AE_READABLE,
  66             readQueryFromClient, c) == AE_ERR)
  67         {
  68             close(fd);
  69             zfree(c);
  70             return NULL;
  71         }
  72     }

ライン62を注釈し、システムのデフォルト設定を採用していることに注意してください.
同じコマンドを実行します.テストの結果は次のとおりです.
SET: 50968.40 requests per second
GET: 50607.29 requests per second
INCR: 55432.37 requests per second
LPUSH: 47438.33 requests per second
LPOP: 49950.05 requests per second
SADD: 54945.05 requests per second
SPOP: 55187.64 requests per second
LPUSH (needed to benchmark LRANGE): 47709.93 requests per second
LRANGE_600 (first 600 elements): 398.41 requests per second
MSET (10 keys): 26766.60 requests per second

3 Nagelアルゴリズムを明確に有効にする
同様に、Nagelアルゴリズムを明確に有効にするために、コードを修正することができ、同じコードブロックを修正すると、
  53 redisClient *createClient(int fd) {
  54     redisClient *c = zmalloc(sizeof(redisClient));
  55 
  56     /* passing -1 as fd it is possible to create a non connected client.
  57      * This is useful since all the Redis commands needs to be executed
  58      * in the context of a client. When commands are executed in other
  59      * contexts (for instance a Lua script) we need a non connected client. */
  60     if (fd != -1) {
  61         anetNonBlock(NULL,fd);
  62         // anetEnableTcpNoDelay(NULL,fd);
  63         anetDisableTcpNoDelay(NULL,fd);
  64         if (server.tcpkeepalive)
  65             anetKeepAlive(NULL,fd,server.tcpkeepalive);
  66         if (aeCreateFileEvent(server.el,fd,AE_READABLE,
  67             readQueryFromClient, c) == AE_ERR)
  68         {
  69             close(fd);
  70             zfree(c);
  71             return NULL;
  72         }
  73     }

Nagelアルゴリズムを明示的に有効にすると、テスト結果は次のとおりです.
SET: 49164.21 requests per second
GET: 48496.61 requests per second
INCR: 52910.05 requests per second
LPUSH: 50556.12 requests per second
LPOP: 49164.21 requests per second
SADD: 53937.43 requests per second
SPOP: 53248.14 requests per second
LPUSH (needed to benchmark LRANGE): 48169.56 requests per second
LRANGE_600 (first 600 elements): 406.73 requests per second
MSET (10 keys): 34106.41 requests per second

4まとめ
以上の比較結果から,ほとんどの場合nagelアルゴリズムが有効になった後,redisの性能[スループット率]は約2パーセント向上した.