前書き
データベースサーバーの全体的なパフォーマンスを分析する場合、ベンチマークは重要なプラクティスです。 これらのシステムのボトルネックや改善の機会を特定するのに役立ちます。
Redisは、データベース、キャッシュ、およびメッセージブローカーとして使用できるインメモリデータストアです。 ハッシュ、文字列、ソートされたセット、ビットマップ、地理空間データなどの単純なデータ構造から複雑なデータ構造までをサポートしています。 このガイドでは、いくつかの異なるツールと方法を使用して、Ubuntu 18.04で実行されているRedisサーバーのパフォーマンスをベンチマークする方法を示します。
前提条件
このガイドに従うには、次のものが必要です。
-
非ルートsudoユーザーと基本ファイアウォールが構成された1つのUbuntu 18.04サーバー。 これを設定するには、Initial Server Setup Guide for Ubuntu 18.04をたどることができます。
-
How to Install and Secure Redis on Ubuntu 18.04に関するガイドで説明されているように、Redisがサーバーにインストールされています。
[.note]#Note:このチュートリアルで示されているコマンドは、4GB DigitalOcean Dropletで実行されている専用の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
:クワイエットモード。平均的なrequests per second情報のみを表示します。
たとえば、ローカル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 -t set,get -q
OutputSET: 76687.12 requests per second
GET: 82576.38 requests per second
デフォルトのオプションでは、50の並列接続を使用して、Redisサーバーへの100000リクエストを作成します。 並列接続の数を増やして使用量のピークをシミュレートする場合は、そのために-c
オプションを使用できます。
redis-benchmark -t set,get -q -c 1000
これにより、デフォルトの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
で変更できます。 次のコマンドは、1MBのキー値を使用してGET
およびSET
コマンドのベンチマークを行います。
redis-benchmark -t set,get -d 1000000 -n 1000 -q
今回はサーバーがはるかに大きなペイロードで動作しているため、パフォーマンスの大幅な低下が予想されます。
OutputSET: 1642.04 requests per second
GET: 822.37 requests per second
これらの数値はRedisインスタンスのパフォーマンスをすばやく評価する方法としては有用ですが、Redisインスタンスが維持できる最大スループットを表すものではないことを認識することが重要です。 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 -P 8
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およびRedis Labsによって作成されたMemcachedの高スループットベンチマークツールです。 さまざまな面でredis-benchmark
と非常に似ていますが、Memtierには、クラスターサポートの提供に加えて、Redisサーバーで予想される種類の負荷をより適切にエミュレートするように調整できるいくつかの構成オプションがあります。
サーバーにMemtierをインストールするには、ソースからソフトウェアをコンパイルする必要があります。 最初に、コードのコンパイルに必要な依存関係をインストールします。
sudo apt-get install build-essential autoconf automake libpcre3-dev libevent-dev pkg-config zlib1g-dev
次に、ホームディレクトリに移動し、Github repositoryから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 .
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
[。注意]##
Note:認証を要求するようにRedisサーバーを構成した場合は、memtier_benchmark
コマンドにRedisパスワードとともに-a
オプションを指定する必要があります。
./memtier_benchmark --hide-histogram -a your_redis_password
次のような出力が表示されます。
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:10SET
/GET
の比率で1秒あたり約9万回の操作を実行できます。
各ベンチマークツールには、パフォーマンステストとデータ表示のための独自のアルゴリズムがあることに注意することが重要です。 そのため、同様の設定を使用している場合でも、同じサーバーでわずかに異なる結果が得られるのは普通です。
結論
このガイドでは、付属のredis-benchmark
ツールとRedis Labsが開発したmemtier_benchmark
ツールの2つの異なるツールを使用して、Redisサーバーでベンチマークテストを実行する方法を示しました。 また、redis-cli
を使用してサーバーの待ち時間を確認する方法も確認しました。 これらのテストから得られたデータに基づいて、パフォーマンスに関してRedisサーバーに期待すること、および現在のセットアップのボトルネックについて理解を深めることができます。