NUMA topology discovering
Implements: blueprint support-numa-cpu-pinning Depends-On: Id91c479f74d4e4945a6a1340e3f73a8789961b66 Change-Id: I7ef4fdd6a1e5501a47090badc38df8992595bd0b
This commit is contained in:
parent
18289c69ff
commit
ea47b9cde1
50
agent
50
agent
@ -31,6 +31,8 @@ require 'timeout'
|
||||
require 'uri'
|
||||
# TODO(vsharshov): replace below lines by this string after excluding Ruby 1.8
|
||||
require 'pathname'
|
||||
require 'rexml/document'
|
||||
include REXML
|
||||
|
||||
unless Process.euid == 0
|
||||
puts "You must be root"
|
||||
@ -147,6 +149,7 @@ class NodeAgent
|
||||
@api_url = "#{scheme}://#{@api_ip}:#{api_port}/api"
|
||||
@logger.info("API URL is #{@api_url}")
|
||||
@os = ohai_system_info
|
||||
@numa_topology = get_numa_topology
|
||||
end
|
||||
|
||||
def get_scheme_and_port
|
||||
@ -276,6 +279,7 @@ class NodeAgent
|
||||
:disks => [],
|
||||
:memory => (_dmi_memory or _ohai_memory),
|
||||
:pci_devices => _get_pci_dev_list,
|
||||
:numa_topology => @numa_topology,
|
||||
}
|
||||
|
||||
admin_mac = (_master_ip_and_mac[:mac] or @os[:macaddress]) rescue nil
|
||||
@ -806,6 +810,52 @@ class NodeAgent
|
||||
@logger.warn("Can't get data from lshw. Reason: #{e.message}")
|
||||
end
|
||||
|
||||
def get_numa_topology
|
||||
# Output EXAMPLE:
|
||||
# <distances nbobjs="2" relative_depth="1" latency_base="10.000000">
|
||||
# <latency value="1.000000"/>
|
||||
# <latency value="2.100000"/>
|
||||
# <latency value="2.100000"/>
|
||||
# <latency value="1.000000"/>
|
||||
# </distances>
|
||||
# <object type="NUMANode" os_index="0" cpuset="0x3ff003ff" complete_cpuset="0x3ff003ff" online_cpuset="0x3ff003ff" allowed_cpuset="0x3ff003ff" nodeset="0x00000001" complete_nodeset="0x00000001" allowed_nodeset="0x00000001" local_memory="67452473344">
|
||||
# <page_type size="4096" count="14370737"/>
|
||||
# <page_type size="1073741824" count="8"/>
|
||||
doc = Document.new `lstopo --no-caches --of xml`
|
||||
|
||||
topology = {:numa_nodes => [], :supported_hugepages => supported_hugepages, :distances => nil}
|
||||
|
||||
doc.elements.each('/topology/object/distances/') do |dist|
|
||||
topology[:distances] = dist.elements.collect{|v| v.attributes['value']}
|
||||
.each_slice(dist.attributes['nbobjs'].to_i).to_a
|
||||
end
|
||||
|
||||
numa_node = "/topology/object/object[@type='NUMANode']"
|
||||
element = doc.elements[numa_node] ? numa_node : "/topology/object[@type='Machine']"
|
||||
|
||||
doc.elements.each(element) do |numa|
|
||||
|
||||
struct = {:id=> nil, :cpus => [], :memory => nil}
|
||||
struct[:id] = numa.attributes['os_index'].to_i
|
||||
struct[:memory] = numa.attributes['local_memory'].to_i
|
||||
|
||||
numa.elements.each("object/object/object[@type='PU']") do |pu|
|
||||
struct[:cpus] << pu.attributes['os_index'].to_i
|
||||
end
|
||||
topology[:numa_nodes] << struct
|
||||
end
|
||||
topology
|
||||
rescue e
|
||||
logger.error "Something went wrong with parsing lstopo: #{e.backtrace}"
|
||||
nil
|
||||
end
|
||||
|
||||
def supported_hugepages
|
||||
return [2048, 1048576] if @os[:cpu]['0']['flags'].include?('pdpe1gb')
|
||||
return [2048] if @os[:cpu]['0']['flags'].include?('pse')
|
||||
[]
|
||||
end
|
||||
|
||||
def update_state
|
||||
@node_state = nil
|
||||
if File.exist?("/etc/nailgun_systemtype")
|
||||
|
Loading…
Reference in New Issue
Block a user