何並列までいけるのか? - @ledsun blog で4並列で頭打ちになりました。 IOの影響をさらにそぎ落とすために、計測スクリプトを次のように改良しました。
require 'benchmark' require 'text_alignment' require 'active_support' require_relative 'config/initializers/ractor.rb' MAX=1 test_data = Dir["./tmp/send_data20221125-4914*/*"].map do |file| Marshal.load(File.binread(file)) end time = Benchmark.realtime do pipe = Ractor.new do loop do Ractor.yield Ractor.receive end end workers = (1..MAX).map do Ractor.new pipe do |pipe| while msg = pipe.take aligner = TextAlignment::TextAlignment.new(msg[:ref_text], msg[:options]) results = msg[:data].map do |datum| begin aligner.align(datum[:text], datum[:denotations] + datum[:blocks]) { denotations: aligner.transform_hdenotations(datum[:denotations]), blocks: aligner.transform_hdenotations(datum[:blocks]), lost_annotations: aligner.lost_annotations, block_alignment: aligner.lost_annotations.present? ? aligner.block_alignment : nil } rescue => e break { error: e.message } end end Ractor.yield(Ractor.make_shareable({ index: msg[:index], results: results }), move: true) end end end test_data.each do |send_data| pipe.send(send_data) end.each do _r, results = Ractor.select(*workers) end end p MAX, time
そして再計測してみました。
やはり4並列で頭打ちです。
ここでt3.2xlaregのコア数を確認してみます。
あれ?もしかしてvCPU数ってコア数じゃないですか?
CPU オプションの最適化 - Amazon Elastic Compute Cloud
Amazon EC2 インスタンスは、単一の Intel Xeon CPU コアで同時に複数のスレッドを実行できるマルチスレッドをサポートしています。各スレッドは、インスタンスの仮想 CPU (vCPU) として表されます。インスタンスには、インスタンスタイプによって異なるデフォルト数の CPU コアがあります。例えば、m5.xlarge インスタンスタイプには 2 つの CPU コアがあり、デフォルトでは各コアごとに 2 つのスレッドの合計で 4 つの vCPU があります。
もしかしてvCPU 8ってことは、4コア8スレッドってことですか? なるほど4並列を越えて試すには、t3.2xlargeは不適切だったようです。