@ledsun blog

無味の味は佳境に入らざればすなわち知れず

EC2のvCPU数はハイパースレッディングを含む

何並列までいけるのか? - @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

そして再計測してみました。

t3.2xlaregインスタンス上での並列数の計測結果

やはり4並列で頭打ちです。

ここでt3.2xlaregのコア数を確認してみます。

t3.2xlaregのvCPU数は8

あれ?もしかして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は不適切だったようです。