Skip to content

Commit 857cd50

Browse files
authored
Interpret microseconds cpu stats from cgroups2 properly as nanos (#96924)
1 parent 52914e4 commit 857cd50

File tree

3 files changed

+38
-18
lines changed

3 files changed

+38
-18
lines changed

docs/changelog/96924.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pr: 96924
2+
summary: Interpret microseconds cpu stats from cgroups2 properly as nanos
3+
area: Infra/Core
4+
type: bug
5+
issues:
6+
- 96089

server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -692,7 +692,7 @@ private OsStats.Cgroup getCgroup() {
692692
// `cpuacct` was merged with `cpu` in v2
693693
final Map<String, Long> cpuStatsMap = getCgroupV2CpuStats(cpuControlGroup);
694694

695-
cgroupCpuAcctUsageNanos = cpuStatsMap.get("usage_usec");
695+
cgroupCpuAcctUsageNanos = cpuStatsMap.get("usage_usec") * 1000; // convert from micros to nanos
696696

697697
long[] cpuLimits = getCgroupV2CpuLimit(cpuControlGroup);
698698
cgroupCpuAcctCpuCfsQuotaMicros = cpuLimits[0];
@@ -701,7 +701,7 @@ private OsStats.Cgroup getCgroup() {
701701
cpuStat = new OsStats.Cgroup.CpuStat(
702702
cpuStatsMap.get("nr_periods"),
703703
cpuStatsMap.get("nr_throttled"),
704-
cpuStatsMap.get("throttled_usec")
704+
cpuStatsMap.get("throttled_usec") * 1000
705705
);
706706

707707
cgroupMemoryLimitInBytes = getCgroupV2MemoryLimitInBytes(memoryControlGroup);

server/src/test/java/org/elasticsearch/monitor/os/OsProbeTests.java

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -185,20 +185,34 @@ public void testCgroupProbe() {
185185

186186
final OsStats.Cgroup cgroup = probe.osStats().getCgroup();
187187

188-
if (availableCgroupsVersion > 0) {
189-
assertNotNull(cgroup);
190-
assertThat(cgroup.getCpuAcctControlGroup(), equalTo("/" + hierarchy));
191-
assertThat(cgroup.getCpuAcctUsageNanos(), equalTo(364869866063112L));
192-
assertThat(cgroup.getCpuControlGroup(), equalTo("/" + hierarchy));
193-
assertThat(cgroup.getCpuCfsPeriodMicros(), equalTo(100000L));
194-
assertThat(cgroup.getCpuCfsQuotaMicros(), equalTo(50000L));
195-
assertThat(cgroup.getCpuStat().getNumberOfElapsedPeriods(), equalTo(17992L));
196-
assertThat(cgroup.getCpuStat().getNumberOfTimesThrottled(), equalTo(1311L));
197-
assertThat(cgroup.getCpuStat().getTimeThrottledNanos(), equalTo(139298645489L));
198-
assertThat(cgroup.getMemoryLimitInBytes(), equalTo("18446744073709551615"));
199-
assertThat(cgroup.getMemoryUsageInBytes(), equalTo("4796416"));
200-
} else {
201-
assertNull(cgroup);
188+
switch (availableCgroupsVersion) {
189+
case 0 -> assertNull(cgroup);
190+
case 1 -> {
191+
assertNotNull(cgroup);
192+
assertThat(cgroup.getCpuAcctControlGroup(), equalTo("/" + hierarchy));
193+
assertThat(cgroup.getCpuAcctUsageNanos(), equalTo(364869866063112L));
194+
assertThat(cgroup.getCpuControlGroup(), equalTo("/" + hierarchy));
195+
assertThat(cgroup.getCpuCfsPeriodMicros(), equalTo(100000L));
196+
assertThat(cgroup.getCpuCfsQuotaMicros(), equalTo(50000L));
197+
assertThat(cgroup.getCpuStat().getNumberOfElapsedPeriods(), equalTo(17992L));
198+
assertThat(cgroup.getCpuStat().getNumberOfTimesThrottled(), equalTo(1311L));
199+
assertThat(cgroup.getCpuStat().getTimeThrottledNanos(), equalTo(139298645489L));
200+
assertThat(cgroup.getMemoryLimitInBytes(), equalTo("18446744073709551615"));
201+
assertThat(cgroup.getMemoryUsageInBytes(), equalTo("4796416"));
202+
}
203+
case 2 -> {
204+
assertNotNull(cgroup);
205+
assertThat(cgroup.getCpuAcctControlGroup(), equalTo("/" + hierarchy));
206+
assertThat(cgroup.getCpuAcctUsageNanos(), equalTo(364869866063000L));
207+
assertThat(cgroup.getCpuControlGroup(), equalTo("/" + hierarchy));
208+
assertThat(cgroup.getCpuCfsPeriodMicros(), equalTo(100000L));
209+
assertThat(cgroup.getCpuCfsQuotaMicros(), equalTo(50000L));
210+
assertThat(cgroup.getCpuStat().getNumberOfElapsedPeriods(), equalTo(17992L));
211+
assertThat(cgroup.getCpuStat().getNumberOfTimesThrottled(), equalTo(1311L));
212+
assertThat(cgroup.getCpuStat().getTimeThrottledNanos(), equalTo(139298645000L));
213+
assertThat(cgroup.getMemoryLimitInBytes(), equalTo("18446744073709551615"));
214+
assertThat(cgroup.getMemoryUsageInBytes(), equalTo("4796416"));
215+
}
202216
}
203217
}
204218

@@ -447,12 +461,12 @@ String readSysFsCgroupV2MemoryUsageInBytes(String controlGroup) {
447461
List<String> readCgroupV2CpuStats(String controlGroup) {
448462
assertThat(controlGroup, equalTo("/" + hierarchy));
449463
return List.of(
450-
"usage_usec 364869866063112",
464+
"usage_usec 364869866063",
451465
"user_usec 34636",
452466
"system_usec 9896",
453467
"nr_periods 17992",
454468
"nr_throttled 1311",
455-
"throttled_usec 139298645489"
469+
"throttled_usec 139298645"
456470
);
457471
}
458472

0 commit comments

Comments
 (0)