Module: Kanrisuru::ProcessorCount

Defined in:
lib/kanrisuru/processor_count.rb

Overview

Class Method Summary collapse

Class Method Details

.physical_processor_countObject

Number of physical processor cores on the current system.



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/kanrisuru/processor_count.rb', line 13

def self.physical_processor_count
  @physical_processor_count ||= begin
    ppc =
      case RbConfig::CONFIG["target_os"]
      when /darwin[12]/
        IO.popen("/usr/sbin/sysctl -n hw.physicalcpu").read.to_i
      when /linux/
        cores = {} # unique physical ID / core ID combinations
        phy = 0
        IO.read("/proc/cpuinfo").scan(/^physical id.*|^core id.*/) do |ln|
          if ln.start_with?("physical")
            phy = ln[/\d+/]
          elsif ln.start_with?("core")
            cid = "#{phy}:#{ln[/\d+/]}"
            cores[cid] = true unless cores[cid]
          end
        end
        cores.count
      when /mswin|mingw/
        require 'win32ole'
        result_set = WIN32OLE.connect("winmgmts://").ExecQuery(
          "select NumberOfCores from Win32_Processor"
        )
        result_set.to_enum.collect(&:NumberOfCores).reduce(:+)
      else
        processor_count
      end
    # fall back to logical count if physical info is invalid
    ppc > 0 ? ppc : processor_count
  end
end

.processor_countObject

Number of processors seen by the OS, used for process scheduling



8
9
10
# File 'lib/kanrisuru/processor_count.rb', line 8

def self.processor_count
  @processor_count ||= Integer(ENV['PARALLEL_PROCESSOR_COUNT'] || Etc.nprocessors)
end