CubicLouve

Spring_MTの技術ブログです。https://github.com/SpringMT (http://spring-mt.tumblr.com/ からの移転)

Q4MのConditional Subscriptionのベンチマーク

Q4MのConditional Subscriptionを使う前にベンチマークを取ってみました。

Q4M - Tutorial

マシン

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

結果

f:id:Spring_MT:20170803002413p:plain

縦軸が秒になります。 横軸が時間軸になります。

特に劣化する様子はありません。

【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

結果

f:id:Spring_MT:20170803002854p:plain

縦軸が秒になります。 横軸が時間軸になります。

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

結果

f:id:Spring_MT:20170803004509p:plain

○でくくったパフォーマンスが劣化した部分はおそらく、compactionが走った影響かと思われます。

参考にした記事

lestrrat.ldblog.jp