kakts-log

programming について調べたことを整理していきます

Valkeyのビルド、サーバ起動方法とvalkey-benchmarkを使ったValkeyとredisのベンチマーク実行方法

概要

昨年 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

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のベンチマークを比較することができます。