Skip to content

Commit e299ead

Browse files
committed
Enable getting user usage of CPU microsecond from cgroup v2
1 parent 5f08fef commit e299ead

2 files changed

Lines changed: 20 additions & 3 deletions

File tree

sams/sampler/SlurmCGroup.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,15 +152,29 @@ def _get_cgroup_item_path(self, resource_type, value):
152152
return os.path.join(self.cgroup_base, resource_type,
153153
self.cgroup, value)
154154

155-
def read_cgroup(self, *items):
155+
def read_cgroup(self, *items, metric_name=None):
156+
"""Get metric value from target file. If `metric_name` is provided,
157+
file will be parsed to return the first found value. Otherwise the file
158+
should have one line indicating the value.
159+
"""
156160
path = self._get_cgroup_item_path(*items)
157161
try:
158162
with open(path, "r") as file:
159-
return file.readline().strip()
163+
if not metric_name:
164+
return file.readline().strip()
165+
else:
166+
for line in file:
167+
if line.startswith(metric_name):
168+
return line.split()[1].strip()
169+
else:
170+
raise RuntimeError(f"Failed to extract {metric_name} value from {path}")
160171
except OSError as err:
161172
logger.error(f"Failed to open {path} for reading")
162173
logger.error(err)
163174
return ""
175+
except RuntimeError as err:
176+
logger.error(err)
177+
return ""
164178

165179
@classmethod
166180
def final_data(cls):

sams/sampler/SlurmCGroup2.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ def sample(self):
3232
logger.debug("sample()")
3333

3434
cpus = self._cpucount(self.read_cgroup("cpuset.cpus"))
35+
user_cpu_usec = self.read_cgroup("cpu.stat", metric_name="user_usec")
3536
memory_usage = self.read_cgroup("memory.current")
3637
memory_limit = self.read_cgroup("memory.high")
3738
memory_max_usage = self.read_cgroup("memory.max")
@@ -40,10 +41,12 @@ def sample(self):
4041

4142
entry = {
4243
"cpus": cpus,
44+
"user_cpu_usec": user_cpu_usec,
4345
"memory_usage": memory_usage,
4446
"memory_limit": memory_limit,
4547
"memory_max_usage": memory_max_usage,
46-
"memory_swap": str(int(memory_usage_and_swap) - int(memory_usage))}
48+
"memory_swap": str(int(memory_usage_and_swap) - int(memory_usage)),
49+
}
4750
self.compute_sample_averages(entry)
4851
self._most_recent_sample = [self._storage_wrapping(entry)]
4952
self.store(entry)

0 commit comments

Comments
 (0)