前書き

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

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

前提条件

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

付属の `+ redis-benchmark +`ツールを使用する

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

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

  • + -h +:Redisホスト。 デフォルトは「127.0.0.1」です。

  • + -p +:Redisポート。 デフォルトは `+ 6379 +`です。

  • + -a +:サーバーで認証が必要な場合、このオプションを使用してパスワードを提供できます。

  • + -c +:シミュレートするクライアント(並列接続)の数。 デフォルト値は50です。

  • + -n +:作成するリクエストの数。 デフォルトは100000です。

  • + -d +:バイト単位で測定された + SET`および + GET`値のデータサイズ。 デフォルトは3です。

  • + -t +:テストのサブセットのみを実行します。 たとえば、「-t get、set」を使用して、「 GET」および「+ SET」コマンドのパフォーマンスをベンチマークできます。

  • + -P +:パフォーマンスの改善のためにパイプラインを使用します。

  • + -q +:クワイエットモード、1秒あたりの平均リクエスト数情報のみを表示します。

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

redis-benchmark -q

次のような出力が得られますが、番号が異なります。

OutputPING_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」コマンドの平均のみを表示します。

redis-benchmark  -q
OutputSET: 76687.12 requests per second
GET: 82576.38 requests per second

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

redis-benchmark -t set,get -q

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

OutputSET: 69444.45 requests per second
GET: 70821.53 requests per second

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

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 `で変更できます。 次のコマンドは、1 MBのキー値を使用して、「 GET」および「+ SET」コマンドのベンチマークを実行します。

redis-benchmark -t set,get  -n 1000 -q

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

OutputSET: 1642.04 requests per second
GET: 822.37 requests per second

これらの数値はRedisインスタンスのパフォーマンスをすばやく評価する方法としては有用ですが、Redisインスタンスが維持できる最大スループットを表すものではないことを認識することが重要です。 _https://redis.io/topics/pipelining [pipelining] _を使用することにより、アプリケーションが複数のコマンドを一度に送信して、サーバーが処理できる1秒あたりのリクエスト数を改善できます。 `+ redis-benchmark `では、 ` -P +`オプションを使用して、このRedis機能を利用する実際のアプリケーションをシミュレートできます。

違いを比較するには、まず、 `+ GET `および ` SET `テストのために、デフォルト値とパイプラインなしで ` redis-benchmark +`コマンドを実行します。

redis-benchmark -t get,set -q
OutputSET: 86281.27 requests per second
GET: 89847.26 requests per second

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

redis-benchmark -t get,set -q
OutputSET: 653594.81 requests per second
GET: 793650.75 requests per second

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

`+ redis-cli`でレイテンシをチェックする

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

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

redis-cli --latency

次のような出力が得られ、サンプル数の増加と平均遅延の変動が示されます。

Outputmin: 0, max: 1, avg: 0.18 (970 samples)

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

特定の期間のレイテンシを監視するには、次を使用できます。

redis-cli --latency-history

これは、デフォルトで15秒に設定された設定可能な間隔で、時間の経過に伴う平均レイテンシを追跡します。 次のような出力が得られます。

Outputmin: 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サーバーはアイドル状態であるため、レイテンシサンプル間に大きな違いはありません。 ただし、使用量にピークがある場合は、結果内の遅延の増加としてこれを反映する必要があります。

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

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

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マイクロ秒の本質的な待機時間は、Redisによって制御されていないプロセスで合計リクエスト時間の3分の1がシステムによって費やされることを意味します

Memtier Benchmark Toolの使用

MemtierはRedisおよびhttps://memcached.org/[Memcached]用の高スループットベンチマークツールであり、Redis Labsによって作成されました。 さまざまな面で「+ redis-benchmark +」に非常に似ていますが、Memtierには、クラスターサポートの提供に加えて、Redisサーバーで予想される種類の負荷をよりよくエミュレートするように調整できるいくつかの構成オプションがあります。

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

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

次に、ホームディレクトリに移動し、https://github.com/RedisLabs/memtier_benchmark [Githubリポジトリ]から `+ memtier_benchmark +`プロジェクトのクローンを作成します。

cd
git clone https://github.com/RedisLabs/memtier_benchmark.git

プロジェクトディレクトリに移動し、 `+ autoreconf +`コマンドを実行して、アプリケーション構成スクリプトを生成します。

cd memtier_benchmark
autoreconf -ivf

コンパイルに必要なアプリケーションアーティファクトを生成するには、 `+ configure +`スクリプトを実行します。

./configure

ここで、 `+ make +`を実行してアプリケーションをコンパイルします。

make

ビルドが完了したら、次を使用して実行可能ファイルをテストできます。

./memtier_benchmark --version

これにより、次のような出力が得られます。

Outputmemtier_benchmark 1.2.17
Copyright (C) 2011-2017 Redis Labs Ltd.
This is free software.  You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.

次のリストには、 `+ memtier_benchmark +`コマンドで使用される最も一般的なオプションの一部が含まれています。

  • + -s +:サーバーホスト。 デフォルトは* localhost *です。

  • + -p +:サーバーポート。 デフォルトは `+ 6379 +`です。

  • + -a +:指定されたパスワードを使用してリクエストを認証します。

  • + -n +:クライアントごとのリクエスト数(デフォルトは10000)。

  • + -c +:クライアントの数(デフォルトは50)。

  • + -t +:スレッドの数(デフォルトは4)。

  • +-pipeline +:パイプラインを有効にします。

  • +-ratio:` + SET`コマンドと `+ GET`コマンドの比率。デフォルトは1:10です。

  • +-hide-histogram +:詳細な出力情報を非表示にします。

これらのオプションのほとんどは、 `+ redis-benchmark `にあるオプションと非常に似ていますが、Memtierは異なる方法でパフォーマンスをテストします。 一般的な実際の環境をよりよくシミュレートするために、 ` memtier_benchmark `によって実行されるデフォルトのベンチマークは、1対10の比率で、 ` GET `および ` SET `リクエストのみをテストします。 テストの各SET操作に対して10個のGET操作があるため、この配置は、Redisをデータベースまたはキャッシュとして使用する一般的なWebアプリケーションをよりよく表しています。 オプション `-ratio +`で比率の値を調整できます。

次のコマンドは、デフォルト設定で `+ memtier_benchmark +`を実行し、高レベルの出力情報のみを提供します。

./memtier_benchmark --hide-histogram

次のような出力が表示されます。

Output...

4         Threads
50        Connections per thread
10000     Requests per client


ALL STATS
=========================================================================
Type         Ops/sec     Hits/sec   Misses/sec      Latency       KB/sec
-------------------------------------------------------------------------
Sets         8258.50          ---          ---      2.19800       636.05
Gets        82494.28     41483.10     41011.18      2.19800      4590.88
Waits           0.00          ---          ---      0.00000          ---
Totals      90752.78     41483.10     41011.18      2.19800      5226.93

この + memtier_benchmark +`の実行によると、Redisサーバーは1:10の `+ SET + / `+ GET +`の比率で毎秒約9万の操作を実行できます。

各ベンチマークツールには、パフォーマンステストとデータ表示のための独自のアルゴリズムがあることに注意することが重要です。 そのため、同様の設定を使用している場合でも、同じサーバーでわずかに異なる結果が得られるのは普通です。

結論

このガイドでは、2つの異なるツールを使用してRedisサーバーでベンチマークテストを実行する方法を示しました:付属の `+ redis-benchmark `とRedis Labsが開発した ` memtier_benchmark `ツール。 また、 ` redis-cli`を使用してサーバーのレイテンシを確認する方法も確認しました。 これらのテストから得られたデータに基づいて、パフォーマンスの観点からRedisサーバーに何を期待するか、現在のセットアップのボトルネックは何かをよりよく理解できます。