テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

I/O性能測定フレームワーク

自作中のS3クローンとminioとの性能比較を行おうと思うのだが, 良いツールが見つからない.

やりたいこととしては, boomというGo製ツールが出来るようなことがしたいのだが,

rakyll/boom · GitHub

S3には認証があるのでうまく行かない. SDKか, あるいはs3cmdやmcのようなコマンドを叩いて認証ヘッダを追加させる必要がある.

他にもbenchmarkライブラリというものがrubyscalaには存在するのだが, これらはCPUの計算時間を見るものであり, I/Oを見るにはあまり適さない. 例えば, 並行実行をすることが出来ない. 私が欲しいのは, RESTであればboom, ストレージであればfioのようなツールである. google/benchmark · GitHub というツールがあるようだが, やはりこれも適さない.

ScalaにはScalaMeterというフレームワークがあるが, これが目指しているのは, JVMJIT最適化やGC発動による実行時間のバラ付きを消して(JVMを各々立てるとか言ってる), 再現性のあるベンチマークをすることであり, うまく作られたツールだとは思うが, 私の用途には適さない(もちろん, よく作られているのでもしかしたら出来るかも知れない). おそらく, コード自体の実行効率をローカルで測定するためのツールだろう.

私がしたいことは以下である.

  • 対象の処理を繰り返したい
  • 実行間で共有するリソースがあってもよい
  • N並列で処理を実行したい
  • 時間を計測して, 統計をとりたい
  • 何かパラメータの組み合わせを指定して, それらについて網羅的な統計がほしい (例えば, 並列数, 転送するファイルの大きさ etc)
  • 可視化したい
  • ストレージ, DB, S3と言ったネットワーク越しのサーバに対してリクエストを送る用途に特化していてよい
  • 出来ればScalaで書きたい. ツールは, JVM上で動作することが多大なメリットになる

まず, この時点でこのようなフレームワークツールがすでに存在するという場合には教えて欲しい.


もし実装するのであれば, 直感的には

  • Futureのリストを作る
  • それらをFixedPoolで実行する
  • 結果を収集する
  • 統計を表示する

という感じのフローになる. コードでいうと,

val runner = RunnerBuilder.
  concurrentN(8).
  build
val futs = Seq(f1, f2, f3)
runner.run(futs)
runner.printStat

のような感じになるんでしょうか?

こんな簡単なものはすでにありそうなものなので, すでにあるよーというご連絡お待ちしています.


Akkaまで拡張すれば, 1つのサーバからではなく複数サーバからI/Oを打つ様子を模擬できないだろうか?dbenchのように