序章

データベースサーバーの全体的なパフォーマンスを分析する場合、ベンチマークは重要なプラクティスです。 これは、ボトルネックと、それらのシステム内の改善の機会を特定するのに役立ちます。

Redis は、データベース、キャッシュ、メッセージブローカーとして使用できるインメモリデータストアです。 ハッシュ、文字列、ソートされたセット、ビットマップ、地理空間データなど、単純なデータ構造から複雑なデータ構造までをサポートします。 このガイドでは、いくつかの異なるツールと方法を使用して、Ubuntu18.04で実行されているRedisサーバーのパフォーマンスをベンチマークする方法を示します。

前提条件

このガイドに従うには、次のものが必要です。

  • 非rootsudoユーザーと基本ファイアウォールが構成された1つのUbuntu18.04サーバー。 これを設定するには、 Ubuntu18.04の初期サーバー設定ガイドに従ってください。
  • Ubuntu18.04にRedisをインストールして保護する方法に関するガイドで説明されているようにサーバーにRedisがインストールされています。

注:このチュートリアルで示されているコマンドは、4GBのDigitalOceanDropletで実行されている専用のRedisサーバーで実行されました。

付属のredis-benchmarkツールの使用

Redisには、redis-benchmarkと呼ばれるベンチマークツールが付属しています。 このプログラムを使用して、同時に接続し、サーバー上でアクションを実行する任意の数のクライアントをシミュレートし、要求が完了するまでにかかる時間を測定できます。 結果のデータから、Redisサーバーが1秒あたりに処理できるリクエストの平均数がわかります。

次のリストは、redis-benchmarkで使用される一般的なコマンドオプションの一部を示しています。

  • -h:Redisホスト。 デフォルトは127.0.0.1です。
  • -p:Redisポート。 デフォルトは6379です。
  • -a:サーバーで認証が必要な場合は、このオプションを使用してパスワードを入力できます。
  • -c:シミュレートするクライアント(並列接続)の数。 デフォルト値は50です。
  • -n:作成するリクエストの数。 デフォルトは100000です。
  • -dSETおよびGET値のデータサイズ(バイト単位)。 デフォルトは3です。
  • -t:テストのサブセットのみを実行します。 たとえば、-t get,setを使用して、GETおよびSETコマンドのパフォーマンスをベンチマークできます。
  • -P:パフォーマンスを向上させるためにパイプラインを使用します。
  • -q:クワイエットモード。1秒あたりの平均リクエスト情報のみを表示します。

たとえば、ローカルRedisサーバーが処理できる1秒あたりの平均リクエスト数を確認する場合は、次を使用できます。

  1. redis-benchmark -q

これと同様の出力が得られますが、数値が異なります。

Output
PING_INLINE: 85178.88 requests per second PING_BULK: 83056.48 requests per second SET: 72202.16 requests per second GET: 94607.38 requests per second INCR: 84961.77 requests per second LPUSH: 78988.94 requests per second RPUSH: 88652.48 requests per second LPOP: 87950.75 requests per second RPOP: 80971.66 requests per second SADD: 80192.46 requests per second HSET: 84317.03 requests per second SPOP: 78125.00 requests per second LPUSH (needed to benchmark LRANGE): 84175.09 requests per second LRANGE_100 (first 100 elements): 52383.45 requests per second LRANGE_300 (first 300 elements): 21547.08 requests per second LRANGE_500 (first 450 elements): 14471.78 requests per second LRANGE_600 (first 600 elements): 9383.50 requests per second MSET (10 keys): 71225.07 requests per second

-tパラメーターを使用して、選択したコマンドのサブセットにテストを制限することもできます。 次のコマンドは、GETおよびSETコマンドのみの平均を示しています。

  1. redis-benchmark -t set,get -q
Output
SET: 76687.12 requests per second GET: 82576.38 requests per second

デフォルトのオプションでは、50の並列接続を使用して、Redisサーバーへの100000のリクエストを作成します。 並列接続の数を増やして使用量のピークをシミュレートする場合は、-cオプションを使用できます。

  1. redis-benchmark -t set,get -q -c 1000

これはデフォルトの50ではなく1000の同時接続を使用するため、パフォーマンスの低下が予想されます。

Output
SET: 69444.45 requests per second GET: 70821.53 requests per second

出力に詳細情報が必要な場合は、-qオプションを削除できます。 次のコマンドは、100の並列接続を使用して、サーバー上で1000000のSET要求を実行します。

  1. redis-benchmark -t set -c 100 -n 1000000

次のような出力が得られます。

Output
====== SET ====== 1000000 requests completed in 11.29 seconds 100 parallel clients 3 bytes payload keep alive: 1 95.22% <= 1 milliseconds 98.97% <= 2 milliseconds 99.86% <= 3 milliseconds 99.95% <= 4 milliseconds 99.99% <= 5 milliseconds 99.99% <= 6 milliseconds 100.00% <= 7 milliseconds 100.00% <= 8 milliseconds 100.00% <= 8 milliseconds 88605.35 requests per second

デフォルト設定では、キー値に3バイトが使用されます。 これは、オプション-dで変更できます。 次のコマンドは、1MBのキー値を使用してGETおよびSETコマンドのベンチマークを行います。

  1. redis-benchmark -t set,get -d 1000000 -n 1000 -q

今回はサーバーがはるかに大きなペイロードで動作しているため、パフォーマンスの大幅な低下が予想されます。

Output
SET: 1642.04 requests per second GET: 822.37 requests per second

これらの数値は、Redisインスタンスのパフォーマンスをすばやく評価する方法としては役立ちますが、Redisインスタンスが維持できる最大スループットを表すものではないことを理解することが重要です。 パイプラインを使用すると、アプリケーションは一度に複数のコマンドを送信して、サーバーが処理できる1秒あたりのリクエスト数を増やすことができます。 redis-benchmarkを使用すると、-Pオプションを使用して、このRedis機能を利用する実際のアプリケーションをシミュレートできます。

違いを比較するには、最初にGETおよびSETテストに対して、デフォルト値でパイプラインなしでredis-benchmarkコマンドを実行します。

  1. redis-benchmark -t get,set -q
Output
SET: 86281.27 requests per second GET: 89847.26 requests per second

次のコマンドは同じテストを実行しますが、8つのコマンドを一緒にパイプラインします。

  1. redis-benchmark -t get,set -q -P 8
Output
SET: 653594.81 requests per second GET: 793650.75 requests per second

出力からわかるように、パイプラインを使用するとパフォーマンスが大幅に向上します。

redis-cliでレイテンシーを確認する

リクエストがレスポンスを受信するのにかかる平均時間を簡単に測定したい場合は、Redisクライアントを使用してサーバーの平均レイテンシを確認できます。 Redisのコンテキストでは、レイテンシーはpingコマンドがサーバーからの応答を受信するのにかかる時間の尺度です。

次のコマンドは、Redisサーバーのリアルタイムのレイテンシ統計を表示します。

  1. redis-cli --latency

これと同様の出力が得られ、サンプル数の増加と平均レイテンシの変動が示されます。

Output
min: 0, max: 1, avg: 0.18 (970 samples)

このコマンドは無期限に実行され続けます。 CTRL+Cで止めることができます。

特定の期間の遅延を監視するには、次を使用できます。

  1. redis-cli --latency-history

これにより、デフォルトで15秒に設定された構成可能な間隔で、時間の経過に伴う遅延の平均が追跡されます。 次のような出力が得られます。

Output
min: 0, max: 1, avg: 0.18 (1449 samples) -- 15.01 seconds range min: 0, max: 1, avg: 0.16 (1449 samples) -- 15.00 seconds range min: 0, max: 1, avg: 0.17 (1449 samples) -- 15.00 seconds range min: 0, max: 1, avg: 0.17 (1444 samples) -- 15.01 seconds range min: 0, max: 1, avg: 0.17 (1446 samples) -- 15.01 seconds range min: 0, max: 1, avg: 0.17 (1449 samples) -- 15.00 seconds range min: 0, max: 1, avg: 0.16 (1444 samples) -- 15.00 seconds range min: 0, max: 1, avg: 0.17 (1445 samples) -- 15.01 seconds range min: 0, max: 1, avg: 0.16 (1445 samples) -- 15.01 seconds range ...

この例のRedisサーバーはアイドル状態であるため、レイテンシーサンプル間で大きな変動はありません。 ただし、使用量にピークがある場合は、これを結果内のレイテンシーの増加として反映する必要があります。

システムのレイテンシーのみを測定したい場合は、--intrinsic-latencyを使用できます。 固有のレイテンシーは、ハードウェア、カーネル、サーバーネイバーなどの要因、およびRedisによって制御されないその他の要因に応じて、環境に固有のものです。

固有のレイテンシーは、Redisの全体的なパフォーマンスのベースラインとして見ることができます。 次のコマンドは、30秒間テストを実行して、固有のシステム遅延をチェックします。

  1. redis-cli --intrinsic-latency 30

次のような出力が得られるはずです。

Output
… 498723744 total runs (avg latency: 0.0602 microseconds / 60.15 nanoseconds per run). Worst run took 22975x longer than the average latency.

両方の遅延テストを比較すると、Redisサーバーのパフォーマンスに影響を与える可能性のあるハードウェアまたはシステムのボトルネックを特定するのに役立ちます。 サンプルサーバーへのリクエストの合計レイテンシーの完了までの平均時間が0.18マイクロ秒であることを考慮すると、0.06マイクロ秒の固有のレイテンシーは、合計リクエスト時間の3分の1がRedisによって制御されていないプロセスでシステムによって費やされることを意味します。

Memtierベンチマークツールの使用

Memtier は、RedisLabsによって作成されたRedisおよびMemcachedのハイスループットベンチマークツールです。 さまざまな点でredis-benchmarkと非常に似ていますが、Memtierには、クラスターサポートの提供に加えて、Redisサーバーで予想される種類の負荷をより適切にエミュレートするように調整できるいくつかの構成オプションがあります。

Memtierをサーバーにインストールするには、ソフトウェアをソースからコンパイルする必要があります。 まず、コードのコンパイルに必要な依存関係をインストールします。

  1. sudo apt-get install build-essential autoconf automake libpcre3-dev libevent-dev pkg-config zlib1g-dev

次に、ホームディレクトリに移動し、[X43X]Githubリポジトリ