@@ -12,6 +12,7 @@ def initialize
12
12
@processor_count = Delay . new { compute_processor_count }
13
13
@physical_processor_count = Delay . new { compute_physical_processor_count }
14
14
@cpu_quota = Delay . new { compute_cpu_quota }
15
+ @cpu_shares = Delay . new { compute_cpu_shares }
15
16
end
16
17
17
18
def processor_count
@@ -41,6 +42,10 @@ def cpu_quota
41
42
@cpu_quota . value
42
43
end
43
44
45
+ def cpu_shares
46
+ @cpu_shares . value
47
+ end
48
+
44
49
private
45
50
46
51
def compute_processor_count
@@ -113,6 +118,20 @@ def compute_cpu_quota
113
118
end
114
119
end
115
120
end
121
+
122
+ def compute_cpu_shares
123
+ if RbConfig ::CONFIG [ "target_os" ] . include? ( "linux" )
124
+ if File . exist? ( "/sys/fs/cgroup/cpu.weight" )
125
+ # cgroups v2: https://docs.kernel.org/admin-guide/cgroup-v2.html#cpu-interface-files
126
+ # Ref: https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/2254-cgroup-v2#phase-1-convert-from-cgroups-v1-settings-to-v2
127
+ weight = File . read ( "/sys/fs/cgroup/cpu.weight" ) . to_f
128
+ ( ( ( ( weight - 1 ) * 262142 ) / 9999 ) + 2 ) / 1024
129
+ elsif File . exist? ( "/sys/fs/cgroup/cpu/cpu.shares" )
130
+ # cgroups v1: https://kernel.googlesource.com/pub/scm/linux/kernel/git/glommer/memcg/+/cpu_stat/Documentation/cgroups/cpu.txt
131
+ File . read ( "/sys/fs/cgroup/cpu/cpu.shares" ) . to_f / 1024
132
+ end
133
+ end
134
+ end
116
135
end
117
136
end
118
137
@@ -187,4 +206,12 @@ def self.available_processor_count
187
206
def self . cpu_quota
188
207
processor_counter . cpu_quota
189
208
end
209
+
210
+ # The CPU shares requested by the process. For performance reasons the calculated
211
+ # value will be memoized on the first call.
212
+ #
213
+ # @return [Float, nil] CPU shares requested by the process, or nil if not set
214
+ def self . cpu_shares
215
+ processor_counter . cpu_shares
216
+ end
190
217
end
0 commit comments