diff options
Diffstat (limited to 'lib/facter/physicalprocessorcount.rb')
-rw-r--r-- | lib/facter/physicalprocessorcount.rb | 57 |
1 files changed, 53 insertions, 4 deletions
diff --git a/lib/facter/physicalprocessorcount.rb b/lib/facter/physicalprocessorcount.rb index 8fe643e..22c00c1 100644 --- a/lib/facter/physicalprocessorcount.rb +++ b/lib/facter/physicalprocessorcount.rb @@ -1,7 +1,56 @@ -Facter.add("physicalprocessorcount") do - confine :kernel => :linux +# Fact: physicalprocessorcount +# +# Purpose: Return the number of physical processors. +# +# Resolution: +# +# Attempts to use sysfs to get the physical IDs of the processors. Falls +# back to /proc/cpuinfo and "physical id" if sysfs is not available. +# +# Caveats: +# +Facter.add('physicalprocessorcount') do + confine :kernel => :linux - setcode do - ppcount = Facter::Util::Resolution.exec('grep "physical id" /proc/cpuinfo|cut -d: -f 2|sort -u|wc -l') + setcode do + sysfs_cpu_directory = '/sys/devices/system/cpu' # This should always be there ... + + if File.exists?(sysfs_cpu_directory) + # + # We assume that the sysfs file system has the correct number of entries + # under the "/sys/device/system/cpu" directory and if so then we process + # content of the file "physical_package_id" located inside the "topology" + # directory in each of the per-CPU sub-directories. + # + # As per Linux Kernel documentation and the file "cputopology.txt" located + # inside the "/usr/src/linux/Documentation" directory we can find following + # short explanation: + # + # (...) + # + # 1) /sys/devices/system/cpu/cpuX/topology/physical_package_id: + # + # physical package id of cpuX. Typically corresponds to a physical + # socket number, but the actual value is architecture and platform + # dependent. + # + # (...) + # + lookup_pattern = "#{sysfs_cpu_directory}" + + "/cpu*/topology/physical_package_id" + + Dir.glob(lookup_pattern).collect { |f| Facter::Util::Resolution.exec("cat #{f}")}.uniq.size + + else + # + # Try to count number of CPUs using the proc file system next ... + # + # We assume that /proc/cpuinfo has what we need and is so then we need + # to make sure that we only count unique entries ... + # + str = Facter::Util::Resolution.exec("grep 'physical.\\+:' /proc/cpuinfo") + + if str then str.scan(/\d+/).uniq.size; end end + end end |