[go: nahoru, domu]

blob: 87cf1f9373b14c76ffab837116c3e1ee849a8583 [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_SYSTEM_CPU_CORE_TIMES_H_
#define COMPONENTS_SYSTEM_CPU_CORE_TIMES_H_
#include <stdint.h>
#include <initializer_list>
#include "base/gtest_prod_util.h"
namespace system_cpu {
// CPU core utilization statistics.
//
// Linux:
// Quantities are expressed in "user hertz", which is a Linux kernel
// configuration knob (USER_HZ). Typical values range between 1/100 seconds
// and 1/1000 seconds. The denominator can be obtained from
// sysconf(_SC_CLK_TCK).
//
// Mac:
// Quantities are expressed in "CPU Ticks", which is an arbitrary unit of time
// recording how many intervals of time elapsed, typically 1/100 of a second.
class CoreTimes {
public:
CoreTimes() = default;
~CoreTimes() = default;
// Normal processes executing in user mode.
uint64_t user() const { return times_[0]; }
// Niced processes executing in user mode.
uint64_t nice() const { return times_[1]; }
// Processes executing in kernel mode.
uint64_t system() const { return times_[2]; }
// Twiddling thumbs.
uint64_t idle() const { return times_[3]; }
// Waiting for I/O to complete. Unreliable.
uint64_t iowait() const { return times_[4]; }
// Servicing interrupts.
uint64_t irq() const { return times_[5]; }
// Servicing softirqs.
uint64_t softirq() const { return times_[6]; }
// Involuntary wait.
uint64_t steal() const { return times_[7]; }
// Running a normal guest.
uint64_t guest() const { return times_[8]; }
// Running a niced guest.
uint64_t guest_nice() const { return times_[9]; }
// Setters.
//
// Ensure that the reported core usage times are monotonically increasing.
// We assume that by any decrease is a temporary blip.
void set_user(uint64_t time);
void set_nice(uint64_t time);
void set_system(uint64_t time);
void set_idle(uint64_t time);
void set_iowait(uint64_t time);
void set_irq(uint64_t time);
void set_softirq(uint64_t time);
void set_steal(uint64_t time);
void set_guest(uint64_t time);
void set_guest_nice(uint64_t time);
// Computes a CPU's utilization over the time between two stat snapshots.
//
// Returns a value between 0.0 and 1.0 on success, and -1.0 when given
// invalid data, such as a `baseline` that does not represent a stat
// snapshot collected before `this` snapshot.
double TimeUtilization(const CoreTimes& baseline) const;
private:
FRIEND_TEST_ALL_PREFIXES(CoreTimesTest, TimeUtilizationBalanced);
FRIEND_TEST_ALL_PREFIXES(CoreTimesTest, TimeUtilizationEmptyRange);
FRIEND_TEST_ALL_PREFIXES(CoreTimesTest, TimeUtilizationNegativeRange);
FRIEND_TEST_ALL_PREFIXES(CoreTimesTest, TimeUtilizationComputation);
// Used by CoreTimesTest.
CoreTimes(const std::initializer_list<uint64_t>& times);
uint64_t times_[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
};
} // namespace system_cpu
#endif // COMPONENTS_SYSTEM_CPU_CORE_TIMES_H_