1 /*
2 * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package jdk.internal.platform.cgroupv1;
27
28 import java.io.IOException;
29 import java.nio.file.Path;
30 import java.nio.file.Paths;
31 import java.util.stream.Stream;
32
33 import jdk.internal.platform.CgroupSubsystem;
34 import jdk.internal.platform.CgroupSubsystemController;
35 import jdk.internal.platform.CgroupUtil;
36
37 public class CgroupV1Subsystem implements CgroupSubsystem {
38 private CgroupV1MemorySubSystemController memory;
39 private CgroupV1SubsystemController cpu;
40 private CgroupV1SubsystemController cpuacct;
41 private CgroupV1SubsystemController cpuset;
42 private CgroupV1SubsystemController blkio;
43 private boolean activeSubSystems;
44
45 private static final CgroupV1Subsystem INSTANCE = initSubSystem();
46
47 private static final String PROVIDER_NAME = "cgroupv1";
48
49 private CgroupV1Subsystem() {
50 activeSubSystems = false;
51 }
52
53 public static CgroupV1Subsystem getInstance() {
54 return INSTANCE;
55 }
266 parm,
267 CgroupV1SubsystemController::convertStringToLong);
268 }
269
270 public String getProvider() {
271 return PROVIDER_NAME;
272 }
273
274 /*****************************************************************
275 * CPU Accounting Subsystem
276 ****************************************************************/
277
278
279 public long getCpuUsage() {
280 return getLongValue(cpuacct, "cpuacct.usage");
281 }
282
283 public long[] getPerCpuUsage() {
284 String usagelist = CgroupSubsystemController.getStringValue(cpuacct, "cpuacct.usage_percpu");
285 if (usagelist == null) {
286 return new long[0];
287 }
288
289 String list[] = usagelist.split(" ");
290 long percpu[] = new long[list.length];
291 for (int i = 0; i < list.length; i++) {
292 percpu[i] = Long.parseLong(list[i]);
293 }
294 return percpu;
295 }
296
297 public long getCpuUserUsage() {
298 return CgroupSubsystemController.getLongEntry(cpuacct, "cpuacct.stat", "user");
299 }
300
301 public long getCpuSystemUsage() {
302 return CgroupSubsystemController.getLongEntry(cpuacct, "cpuacct.stat", "system");
303 }
304
305
306 /*****************************************************************
307 * CPU Subsystem
308 ****************************************************************/
309
310
311 public long getCpuPeriod() {
312 return getLongValue(cpu, "cpu.cfs_period_us");
313 }
314
315 public long getCpuQuota() {
316 return getLongValue(cpu, "cpu.cfs_quota_us");
317 }
318
319 public long getCpuShares() {
320 long retval = getLongValue(cpu, "cpu.shares");
321 if (retval == 0 || retval == 1024)
322 return -1;
323 else
324 return retval;
325 }
326
327 public long getCpuNumPeriods() {
328 return CgroupSubsystemController.getLongEntry(cpu, "cpu.stat", "nr_periods");
329 }
330
331 public long getCpuNumThrottled() {
332 return CgroupSubsystemController.getLongEntry(cpu, "cpu.stat", "nr_throttled");
333 }
334
335 public long getCpuThrottledTime() {
336 return CgroupSubsystemController.getLongEntry(cpu, "cpu.stat", "throttled_time");
337 }
338
339 public long getEffectiveCpuCount() {
340 return Runtime.getRuntime().availableProcessors();
341 }
342
348 public int[] getCpuSetCpus() {
349 return CgroupSubsystemController.stringRangeToIntArray(CgroupSubsystemController.getStringValue(cpuset, "cpuset.cpus"));
350 }
351
352 public int[] getEffectiveCpuSetCpus() {
353 return CgroupSubsystemController.stringRangeToIntArray(CgroupSubsystemController.getStringValue(cpuset, "cpuset.effective_cpus"));
354 }
355
356 public int[] getCpuSetMems() {
357 return CgroupSubsystemController.stringRangeToIntArray(CgroupSubsystemController.getStringValue(cpuset, "cpuset.mems"));
358 }
359
360 public int[] getEffectiveCpuSetMems() {
361 return CgroupSubsystemController.stringRangeToIntArray(CgroupSubsystemController.getStringValue(cpuset, "cpuset.effective_mems"));
362 }
363
364 public double getCpuSetMemoryPressure() {
365 return CgroupSubsystemController.getDoubleValue(cpuset, "cpuset.memory_pressure");
366 }
367
368 public boolean isCpuSetMemoryPressureEnabled() {
369 long val = getLongValue(cpuset, "cpuset.memory_pressure_enabled");
370 return (val == 1);
371 }
372
373
374 /*****************************************************************
375 * Memory Subsystem
376 ****************************************************************/
377
378
379 public long getMemoryFailCount() {
380 return getLongValue(memory, "memory.failcnt");
381 }
382
383 public long getMemoryLimit() {
384 long retval = getLongValue(memory, "memory.limit_in_bytes");
385 if (retval > CgroupV1SubsystemController.UNLIMITED_MIN) {
386 if (memory.isHierarchical()) {
387 // memory.limit_in_bytes returned unlimited, attempt
388 // hierarchical memory limit
456 // memory.memsw.limit_in_bytes returned unlimited, attempt
457 // hierarchical memory limit
458 String match = "hierarchical_memsw_limit";
459 retval = CgroupSubsystemController.getLongValueMatchingLine(memory,
460 "memory.stat",
461 match,
462 CgroupV1Subsystem::convertHierachicalLimitLine);
463 }
464 }
465 return CgroupV1SubsystemController.longValOrUnlimited(retval);
466 }
467
468 public long getMemoryAndSwapMaxUsage() {
469 return getLongValue(memory, "memory.memsw.max_usage_in_bytes");
470 }
471
472 public long getMemoryAndSwapUsage() {
473 return getLongValue(memory, "memory.memsw.usage_in_bytes");
474 }
475
476 public boolean isMemoryOOMKillEnabled() {
477 long val = CgroupSubsystemController.getLongEntry(memory, "memory.oom_control", "oom_kill_disable");
478 return (val == 0);
479 }
480
481 public long getMemorySoftLimit() {
482 return CgroupV1SubsystemController.longValOrUnlimited(getLongValue(memory, "memory.soft_limit_in_bytes"));
483 }
484
485
486 /*****************************************************************
487 * BlKIO Subsystem
488 ****************************************************************/
489
490
491 public long getBlkIOServiceCount() {
492 return CgroupSubsystemController.getLongEntry(blkio, "blkio.throttle.io_service_bytes", "Total");
493 }
494
495 public long getBlkIOServiced() {
496 return CgroupSubsystemController.getLongEntry(blkio, "blkio.throttle.io_serviced", "Total");
|
1 /*
2 * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package jdk.internal.platform.cgroupv1;
27
28 import java.io.IOException;
29 import java.nio.file.Path;
30 import java.nio.file.Paths;
31 import java.util.stream.Stream;
32
33 import jdk.internal.platform.CgroupSubsystem;
34 import jdk.internal.platform.CgroupSubsystemController;
35 import jdk.internal.platform.CgroupUtil;
36 import jdk.internal.platform.Metrics;
37
38 public class CgroupV1Subsystem implements CgroupSubsystem {
39 private CgroupV1MemorySubSystemController memory;
40 private CgroupV1SubsystemController cpu;
41 private CgroupV1SubsystemController cpuacct;
42 private CgroupV1SubsystemController cpuset;
43 private CgroupV1SubsystemController blkio;
44 private boolean activeSubSystems;
45
46 private static final CgroupV1Subsystem INSTANCE = initSubSystem();
47
48 private static final String PROVIDER_NAME = "cgroupv1";
49
50 private CgroupV1Subsystem() {
51 activeSubSystems = false;
52 }
53
54 public static CgroupV1Subsystem getInstance() {
55 return INSTANCE;
56 }
267 parm,
268 CgroupV1SubsystemController::convertStringToLong);
269 }
270
271 public String getProvider() {
272 return PROVIDER_NAME;
273 }
274
275 /*****************************************************************
276 * CPU Accounting Subsystem
277 ****************************************************************/
278
279
280 public long getCpuUsage() {
281 return getLongValue(cpuacct, "cpuacct.usage");
282 }
283
284 public long[] getPerCpuUsage() {
285 String usagelist = CgroupSubsystemController.getStringValue(cpuacct, "cpuacct.usage_percpu");
286 if (usagelist == null) {
287 return null;
288 }
289
290 String list[] = usagelist.split(" ");
291 long percpu[] = new long[list.length];
292 for (int i = 0; i < list.length; i++) {
293 percpu[i] = Long.parseLong(list[i]);
294 }
295 return percpu;
296 }
297
298 public long getCpuUserUsage() {
299 return CgroupSubsystemController.getLongEntry(cpuacct, "cpuacct.stat", "user");
300 }
301
302 public long getCpuSystemUsage() {
303 return CgroupSubsystemController.getLongEntry(cpuacct, "cpuacct.stat", "system");
304 }
305
306
307 /*****************************************************************
308 * CPU Subsystem
309 ****************************************************************/
310
311
312 public long getCpuPeriod() {
313 return getLongValue(cpu, "cpu.cfs_period_us");
314 }
315
316 public long getCpuQuota() {
317 return getLongValue(cpu, "cpu.cfs_quota_us");
318 }
319
320 public long getCpuShares() {
321 long retval = getLongValue(cpu, "cpu.shares");
322 if (retval == 0 || retval == 1024)
323 return Metrics.LONG_RETVAL_UNLIMITED;
324 else
325 return retval;
326 }
327
328 public long getCpuNumPeriods() {
329 return CgroupSubsystemController.getLongEntry(cpu, "cpu.stat", "nr_periods");
330 }
331
332 public long getCpuNumThrottled() {
333 return CgroupSubsystemController.getLongEntry(cpu, "cpu.stat", "nr_throttled");
334 }
335
336 public long getCpuThrottledTime() {
337 return CgroupSubsystemController.getLongEntry(cpu, "cpu.stat", "throttled_time");
338 }
339
340 public long getEffectiveCpuCount() {
341 return Runtime.getRuntime().availableProcessors();
342 }
343
349 public int[] getCpuSetCpus() {
350 return CgroupSubsystemController.stringRangeToIntArray(CgroupSubsystemController.getStringValue(cpuset, "cpuset.cpus"));
351 }
352
353 public int[] getEffectiveCpuSetCpus() {
354 return CgroupSubsystemController.stringRangeToIntArray(CgroupSubsystemController.getStringValue(cpuset, "cpuset.effective_cpus"));
355 }
356
357 public int[] getCpuSetMems() {
358 return CgroupSubsystemController.stringRangeToIntArray(CgroupSubsystemController.getStringValue(cpuset, "cpuset.mems"));
359 }
360
361 public int[] getEffectiveCpuSetMems() {
362 return CgroupSubsystemController.stringRangeToIntArray(CgroupSubsystemController.getStringValue(cpuset, "cpuset.effective_mems"));
363 }
364
365 public double getCpuSetMemoryPressure() {
366 return CgroupSubsystemController.getDoubleValue(cpuset, "cpuset.memory_pressure");
367 }
368
369 public Boolean isCpuSetMemoryPressureEnabled() {
370 long val = getLongValue(cpuset, "cpuset.memory_pressure_enabled");
371 return (val == 1);
372 }
373
374
375 /*****************************************************************
376 * Memory Subsystem
377 ****************************************************************/
378
379
380 public long getMemoryFailCount() {
381 return getLongValue(memory, "memory.failcnt");
382 }
383
384 public long getMemoryLimit() {
385 long retval = getLongValue(memory, "memory.limit_in_bytes");
386 if (retval > CgroupV1SubsystemController.UNLIMITED_MIN) {
387 if (memory.isHierarchical()) {
388 // memory.limit_in_bytes returned unlimited, attempt
389 // hierarchical memory limit
457 // memory.memsw.limit_in_bytes returned unlimited, attempt
458 // hierarchical memory limit
459 String match = "hierarchical_memsw_limit";
460 retval = CgroupSubsystemController.getLongValueMatchingLine(memory,
461 "memory.stat",
462 match,
463 CgroupV1Subsystem::convertHierachicalLimitLine);
464 }
465 }
466 return CgroupV1SubsystemController.longValOrUnlimited(retval);
467 }
468
469 public long getMemoryAndSwapMaxUsage() {
470 return getLongValue(memory, "memory.memsw.max_usage_in_bytes");
471 }
472
473 public long getMemoryAndSwapUsage() {
474 return getLongValue(memory, "memory.memsw.usage_in_bytes");
475 }
476
477 public Boolean isMemoryOOMKillEnabled() {
478 long val = CgroupSubsystemController.getLongEntry(memory, "memory.oom_control", "oom_kill_disable");
479 return (val == 0);
480 }
481
482 public long getMemorySoftLimit() {
483 return CgroupV1SubsystemController.longValOrUnlimited(getLongValue(memory, "memory.soft_limit_in_bytes"));
484 }
485
486
487 /*****************************************************************
488 * BlKIO Subsystem
489 ****************************************************************/
490
491
492 public long getBlkIOServiceCount() {
493 return CgroupSubsystemController.getLongEntry(blkio, "blkio.throttle.io_service_bytes", "Total");
494 }
495
496 public long getBlkIOServiced() {
497 return CgroupSubsystemController.getLongEntry(blkio, "blkio.throttle.io_serviced", "Total");
|