Q4MのConditional Subscriptionのベンチマーク
Q4MのConditional Subscriptionを使う前にベンチマークを取ってみました。
マシン
Model Name: MacBook Pro Model Identifier: MacBookPro13,2 Processor Name: Intel Core i5 Processor Speed: 2.9 GHz Number of Processors: 1 Total Number of Cores: 2 L2 Cache (per Core): 256 KB L3 Cache: 4 MB Memory: 16 GB
テーブルスキーマ
CREATE TABLE `q4m_test` ( `id` varchar(255) COLLATE utf8mb4_bin NOT NULL, `payload` text COLLATE utf8mb4_bin NOT NULL, `enqueued_at` int(10) unsigned NOT NULL ) ENGINE=QUEUE;
enqueued_at
をConditional Subscriptionで使います。
enqueued_at
にはキューを入れた時間を入れています。
Conditional Subscriptionにはintegral values(整数値)なので、unixtimestamp形式で保存しています。
ベンチの条件
予め6000件のデータを作成しました。 payloadには1000バイトの文字列を入れています。
【1】6000件のデータのうち、最後の1000件のキューを取り出して処理するパフォーマンス
こんなスクリプトで計測しました。
require 'mysql2' require 'benchmark' client = Mysql2::Client.new(host: "localhost", username: "root", database: 'test') 1000.times do result = Benchmark.realtime do result = client.query("SELECT queue_wait('q4m_test:enqueued_at>=1501686146', 5)") client.query('select queue_end()') end puts "#{result}" end
結果
縦軸が秒になります。 横軸が時間軸になります。
特に劣化する様子はありません。
【2】5000件のデータを処理するパフォーマンス
上で5000件になったデータを全て順に処理していくようにして処理速度を計測してみました。
require 'mysql2' require 'benchmark' client = Mysql2::Client.new(host: "localhost", username: "root", database: 'test') 1000.times do result = Benchmark.realtime do result = client.query("SELECT queue_wait('q4m_test:enqueued_at<1501686146', 5)") client.query('select queue_end()') end puts "#{result}" end
結果
縦軸が秒になります。 横軸が時間軸になります。
1とくらべてもそこまで大きな変化はありませんでした。
キューを入れる処理
キューを入れるときも処理速度を計測してみました。
require 'mysql2' require 'benchmark' require 'securerandom' client = Mysql2::Client.new(host: "localhost", username: "root", database: 'test') payload = 'a' * 1000 stmt = client.prepare('INSERT INTO q4m_test VALUES (?, ?, ?)') 4000.times do result = Benchmark.realtime do stmt.execute(SecureRandom.uuid, payload, Time.now.to_i + 1000) end puts "#{result}" end
結果
○でくくったパフォーマンスが劣化した部分はおそらく、compactionが走った影響かと思われます。