// Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. package org.apache.cloudstack.utils.linux; import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; import org.apache.log4j.Logger; public class CPUStat { private static final Logger s_logger = Logger.getLogger(CPUStat.class); private Integer _cores; private UptimeStats _lastStats; private final String _sysfsCpuDir = "/sys/devices/system/cpu"; private final String _uptimeFile = "/proc/uptime"; class UptimeStats { public Double upTime = 0d; public Double cpuIdleTime = 0d; public UptimeStats(Double upTime, Double cpuIdleTime) { this.upTime = upTime; this.cpuIdleTime = cpuIdleTime; } } public CPUStat () { init(); } private void init() { _cores = getCoresFromLinux(); _lastStats = getUptimeAndCpuIdleTime(); } private UptimeStats getUptimeAndCpuIdleTime() { UptimeStats uptime = new UptimeStats(0d, 0d); File f = new File(_uptimeFile); try (Scanner scanner = new Scanner(f,"UTF-8");) { String[] stats = scanner.useDelimiter("\\Z").next().split("\\s+"); uptime = new UptimeStats(Double.parseDouble(stats[0]), Double.parseDouble(stats[1])); } catch (FileNotFoundException ex) { s_logger.warn("File " + _uptimeFile + " not found:" + ex.toString()); } return uptime; } private Integer getCoresFromLinux() { Integer cpus = 0; File cpuDir = new File(_sysfsCpuDir); File[] files = cpuDir.listFiles(); if (files != null) { for (File file : files) { if (file.getName().matches("cpu\\d+")) { cpus++; } } } return cpus; } public Integer getCores() { return _cores; } public Double getCpuUsedPercent() { Double cpuUsed = 0d; if (_cores == null || _cores == 0) { _cores = getCoresFromLinux(); } UptimeStats currentStats = getUptimeAndCpuIdleTime(); if (currentStats == null) { return cpuUsed; } Double timeElapsed = currentStats.upTime - _lastStats.upTime; Double cpuElapsed = (currentStats.cpuIdleTime - _lastStats.cpuIdleTime) / _cores; if (timeElapsed > 0) { cpuUsed = (1 - (cpuElapsed / timeElapsed)) * 100; } if (cpuUsed < 0) { cpuUsed = 0d; } _lastStats = currentStats; return cpuUsed; } }