概要
昨年 redisからフォークされたvalkeyがリリースされました。
redisからvalkeyへは、互換性があるため比較的容易に切り替えができると思います。
ここでは、ローカル環境でvalkeyをビルドして利用する方法と、valkeyの公式で用意されているベンチマークツールであるvalkey-benchmark
コマンドによるベンチマークについてまとめます。
調査環境
- macOS 15.2
- Valkey 8.0.2
- redis 7.2.7
valkey-benchmark コマンド
Valkeyのビルド
Valkeyをビルドして、valkey-serverやclientなどのコマンドをローカルで使えるようにします。
valkey-io/valkey で公式のリポジトリをクローン
上記のリポジトリをクローンします。 今回はValkey v8.0.2を使うため v8.0.2のタグをチェックアウトします
$ git checkout -b 8.0.2 refs/tags/8.0.2 $ git branch * 8.0.2 unstable
Valkeyリポジトリのビルド
ビルド作業自体は簡単で、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に対するベンチマーク
まず、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 # Warning: no config file specified, using the default config. In order to specify a config file use ./src/valkey-server /path/to/valkey.conf 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 # WARNING: The TCP backlog setting of 511 cannot be enforced because kern.ipc.somaxconn is set to the lower value of 128. 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に対するベンチマーク
続いて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 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf 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 # WARNING: The TCP backlog setting of 511 cannot be enforced because kern.ipc.somaxconn is set to the lower value of 128. 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のベンチマークを比較することができます。