概要
昨年 redisからフォークされたvalkeyがリリースされました。
redisからvalkeyへは、互換性があるため比較的容易に切り替えができると思います。
ここでは、ローカル環境でvalkeyをビルドして利用する方法と、valkeyの公式で用意されているベンチマークツールであるvalkey-benchmark
コマンドによるベンチマークについてまとめます。
調査環境
- macOS 15.2
- Valkey 8.0.2
- redis 7.2.7
valkey-benchmark コマンド
valkey.io
Valkeyのビルド
Valkeyをビルドして、valkey-serverやclientなどのコマンドをローカルで使えるようにします。
valkey-io/valkey で公式のリポジトリをクローン
github.com
上記のリポジトリをクローンします。
今回はValkey v8.0.2を使うため v8.0.2のタグをチェックアウトします
$ git checkout -b 8.0.2 refs/tags/8.0.2
$ git branch
* 8.0.2
unstable
ビルド作業自体は簡単で、Makeコマンドにより簡単にビルドできます
make
これにより、 リポジトリのsrcディレクトリ配下に関連するビルドの成果物として、valkey-serverなどのコマンドが存在することを確認できます。
valkey-benchmarkについて
次に、Valkeyのビルドにより生成されたvalkey-benchmarkコマンドを使って、valkeyとredisのベンチマークを実行していきます。
valkeyリポジトリのsrc
ディレクトリ配下に、valkey-server, valkey-benchmarkが生成されているかを確認します。
valkey-benchmarkというコマンドのドキュメントは下記になります。
valkey.io
コマンドのオプションとしてvalkeyにリクエストするクライアント数や、総リクエスト数などの値を設定し、
実行できます。
例
valkey-benchmark -r 10000 -n 10000 lpush mylist __rand_int__
valkey-benchmark -t set -n 1000000 -r 100000000
valkey-benchmark によるベンチマーク実行
ここで、valkey-benchmarkによるベンチマークの実行を行います。
ここで、Valkeyはredisとも互換性があるため、valkey, redisでそれぞれサーバを立てて、valkey-benchmarkによりValkey, Redisそれぞれで同じ条件でベンチマークが実行できます。
ここではそのベンチマーク結果についての説明はしませんが、実行方法は下記となります。
まず、valkey-serverコマンドを実行してvalkeyサーバを立ち上げます。
先ほど書いた通り、redisとは互換性があり、Valkeyもデフォルトポートが6379でredisと同じです。
./src/valkey-server
50692:M 11 Jan 2025 00:52:59.061 * oO0OoO0OoO0Oo Valkey is starting oO0OoO0OoO0Oo
50692:M 11 Jan 2025 00:52:59.061 * Valkey version=255.255.255, bits=64, commit=e60990e5, modified=0, pid=50692, just started
50692:M 11 Jan 2025 00:52:59.061
50692:M 11 Jan 2025 00:52:59.062 * Increased maximum number of open files to 10032 (it was originally set to 2560).
50692:M 11 Jan 2025 00:52:59.062 * monotonic clock: POSIX clock_gettime
.+^+.
.+#########+.
.+########+########+. Valkey 255.255.255 (e60990e5/0) 64 bit
.+########+' '+########+.
.########+' .+. '+########. Running in standalone mode
|####+' .+#######+. '+####| Port: 6379
|###| .+###############+. |###| PID: 50692
|###| |#####*'' ''*#####| |###|
|###| |####' .-. '####| |###|
|###| |###( (@@@) )###| |###| https://valkey.io
|###| |####. '-' .####| |###|
|###| |#####*. .*#####| |###|
|###| '+#####| |#####+' |###|
|####+. +##| |#+' .+####|
'#######+ |##| .+########'
'+###| |##| .+########+'
'| |####+########+'
+#########+'
'+v+'
50692:M 11 Jan 2025 00:52:59.062
50692:M 11 Jan 2025 00:52:59.063 * Server initialized
50692:M 11 Jan 2025 00:52:59.064 * Loading RDB produced by Redis version 7.2.7
50692:M 11 Jan 2025 00:52:59.064 * RDB age 4 seconds
50692:M 11 Jan 2025 00:52:59.064 * RDB memory usage when created 112.49 Mb
50692:M 11 Jan 2025 00:52:59.482 * Done loading RDB, keys loaded: 994882, keys expired: 0.
50692:M 11 Jan 2025 00:52:59.482 * DB loaded from disk: 0.419 seconds
50692:M 11 Jan 2025 00:52:59.482 * Ready to accept connections tcp
そして、valkey-benchmark
コマンドを実行してみます。
./src/valkey-benchmark -q -n 100000
PING_INLINE: 174825.17 requests per second, p50=0.151 msec
PING_MBULK: 187969.92 requests per second, p50=0.151 msec
SET: 182815.36 requests per second, p50=0.151 msec
GET: 185185.17 requests per second, p50=0.151 msec
INCR: 190114.06 requests per second, p50=0.151 msec
LPUSH: 168634.06 requests per second, p50=0.151 msec
RPUSH: 189035.92 requests per second, p50=0.151 msec
LPOP: 186219.73 requests per second, p50=0.151 msec
RPOP: 188679.25 requests per second, p50=0.151 msec
SADD: 185528.77 requests per second, p50=0.151 msec
HSET: 188679.25 requests per second, p50=0.151 msec
SPOP: 188323.91 requests per second, p50=0.151 msec
ZADD: 188679.25 requests per second, p50=0.151 msec
ZPOPMIN: 189035.92 requests per second, p50=0.151 msec
LPUSH (needed to benchmark LRANGE): 188679.25 requests per second, p50=0.151 msec
LRANGE_100 (first 100 elements): 103950.10 requests per second, p50=0.271 msec
LRANGE_300 (first 300 elements): 52521.01 requests per second, p50=0.503 msec
LRANGE_500 (first 500 elements): 36218.76 requests per second, p50=0.719 msec
LRANGE_600 (first 600 elements): 29316.92 requests per second, p50=0.863 msec
MSET (10 keys): 183150.19 requests per second, p50=0.215 msec
XADD: 186219.73 requests per second, p50=0.159 msec
これで Valkeyに対するベンチマークを実行することができました。
続いてredisについてまとめます。 特に変わったことはせず、一度valkey-serverを止めた上でredis-serverを立ち上げ、また同じvalkey-benchmarkのコマンドを実行してあげるだけで完了です。
今回はvalkey redisともに同じデフォルトポートで立ち上げるのですが、使うポートを分けて、valkey-benchmarkで向き先ポートを分けて実行するのもありかと思います。
特に説明はしませんが、 mac OS環境でbrew install redisでredis v7をインストールした上でサーバを起動します。
redis-server
55389:C 11 Jan 2025 00:59:15.438 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
55389:C 11 Jan 2025 00:59:15.438 * Redis version=7.2.7, bits=64, commit=00000000, modified=0, pid=55389, just started
55389:C 11 Jan 2025 00:59:15.438
55389:M 11 Jan 2025 00:59:15.438 * Increased maximum number of open files to 10032 (it was originally set to 2560).
55389:M 11 Jan 2025 00:59:15.438 * monotonic clock: POSIX clock_gettime
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 7.2.7 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 55389
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | https://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
55389:M 11 Jan 2025 00:59:15.439
55389:M 11 Jan 2025 00:59:15.440 * Server initialized
55389:M 11 Jan 2025 00:59:15.440 * RDB age 4 seconds
55389:M 11 Jan 2025 00:59:15.440 * RDB memory usage when created 79.60 Mb
55389:M 11 Jan 2025 00:59:15.806 * Done loading RDB, keys loaded: 994882, keys expired: 0.
55389:M 11 Jan 2025 00:59:15.806 * DB loaded from disk: 0.367 seconds
55389:M 11 Jan 2025 00:59:15.806 * Ready to accept connections tcp
あとは先ほどのvalkey-benchmarkコマンドを実行してみます。
./src/valkey-benchmark -q -n 100000
PING_INLINE: 181488.20 requests per second, p50=0.151 msec
PING_MBULK: 188679.25 requests per second, p50=0.151 msec
SET: 187265.92 requests per second, p50=0.151 msec
GET: 183150.19 requests per second, p50=0.151 msec
INCR: 188323.91 requests per second, p50=0.151 msec
LPUSH: 185528.77 requests per second, p50=0.151 msec
RPUSH: 184501.84 requests per second, p50=0.151 msec
LPOP: 182481.77 requests per second, p50=0.151 msec
RPOP: 187969.92 requests per second, p50=0.151 msec
SADD: 189753.31 requests per second, p50=0.151 msec
HSET: 185873.61 requests per second, p50=0.151 msec
SPOP: 187617.27 requests per second, p50=0.151 msec
ZADD: 189035.92 requests per second, p50=0.151 msec
ZPOPMIN: 189753.31 requests per second, p50=0.151 msec
LPUSH (needed to benchmark LRANGE): 187617.27 requests per second, p50=0.151 msec
LRANGE_100 (first 100 elements): 108108.11 requests per second, p50=0.279 msec
LRANGE_300 (first 300 elements): 52493.44 requests per second, p50=0.575 msec
LRANGE_500 (first 500 elements): 33300.03 requests per second, p50=1.023 msec
LRANGE_600 (first 600 elements): 28034.76 requests per second, p50=1.167 msec
MSET (10 keys): 192678.23 requests per second, p50=0.175 msec
XADD: 186219.73 requests per second, p50=0.159 msec
これでredisに対してもvalkey-benchmarkによるベンチマークが実行できました。
ざっと比較してみるとややValkeyの方がスループットが高いですが、大差はなく、もっと複雑な状況下、大きい負荷をかけた時に違いが出てくるのだと思います。
valkey-benchmarkによるベンチマークが実行できたので、これにより色々な条件でValkey, redisのベンチマークを比較することができます。