-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathProcNumaMaps.rb
73 lines (64 loc) · 1.39 KB
/
ProcNumaMaps.rb
1
2
3
4
5
6
7
8
9
10
11
12
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#
# SPDX-License-Identifier: GPL-2.0
#
# Copyright (c) 2018 Intel Corporation
#
# Authors: Fengguang Wu <[email protected]>
#
class ProcNumaMaps
attr_reader :numa_maps
def load(pid)
@numa_maps = Hash.new
@numa_kb = nil
File.open("/proc/#{pid}/numa_maps").each do |line|
fields = line.chomp.split
addr = fields.shift.hex
mpol = fields.shift
pairs = Hash.new
fields.each do |field|
key, val = field.split '='
if val
val = val.to_i if val =~ /^[0-9]+$/
pairs[key] = val
else
# handle heap, stack
end
end
@numa_maps[addr] = pairs
end
end
def numa_kb
@numa_kb ||= calc_numa_kb
end
def calc_numa_kb
numa_kb = Hash.new
@numa_maps.each do |k, v|
pagesize = v["kernelpagesize_kB"]
next unless pagesize
v.each do |kk, vv|
next if kk == "kernelpagesize_kB"
next if String === vv
numa_kb[kk] ||= 0
numa_kb[kk] += vv * pagesize
end
end
numa_kb
end
def total_numa_kb
sum = 0
numa_kb.each do |k, v|
next unless k =~ /^N\d+$/
sum += v;
end
sum
end
def show_numa_placement
sum = total_numa_kb
return unless sum && sum > 0
numa_kb.each do |k, v|
next unless k =~ /^N\d+$/
percent = 100 * v / sum
puts "#{k} #{v >> 10}M #{percent}%"
end
end
end