xref: /aosp_15_r20/external/cronet/base/process/process_metrics.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker // This file contains routines for gathering resource statistics for processes
6*6777b538SAndroid Build Coastguard Worker // running on the system.
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #ifndef BASE_PROCESS_PROCESS_METRICS_H_
9*6777b538SAndroid Build Coastguard Worker #define BASE_PROCESS_PROCESS_METRICS_H_
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
12*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
13*6777b538SAndroid Build Coastguard Worker 
14*6777b538SAndroid Build Coastguard Worker #include <memory>
15*6777b538SAndroid Build Coastguard Worker #include <string_view>
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/gtest_prod_util.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/process/process_handle.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
22*6777b538SAndroid Build Coastguard Worker #include "base/types/expected.h"
23*6777b538SAndroid Build Coastguard Worker #include "base/values.h"
24*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_APPLE)
27*6777b538SAndroid Build Coastguard Worker #include <mach/mach.h>
28*6777b538SAndroid Build Coastguard Worker #include "base/process/port_provider_mac.h"
29*6777b538SAndroid Build Coastguard Worker 
30*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_IOS)
31*6777b538SAndroid Build Coastguard Worker #include <mach/mach_vm.h>
32*6777b538SAndroid Build Coastguard Worker #endif
33*6777b538SAndroid Build Coastguard Worker #endif
34*6777b538SAndroid Build Coastguard Worker 
35*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
36*6777b538SAndroid Build Coastguard Worker #include "base/win/scoped_handle.h"
37*6777b538SAndroid Build Coastguard Worker #include "base/win/windows_types.h"
38*6777b538SAndroid Build Coastguard Worker #endif
39*6777b538SAndroid Build Coastguard Worker 
40*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || \
41*6777b538SAndroid Build Coastguard Worker     BUILDFLAG(IS_AIX)
42*6777b538SAndroid Build Coastguard Worker #include <string>
43*6777b538SAndroid Build Coastguard Worker #include <utility>
44*6777b538SAndroid Build Coastguard Worker #include <vector>
45*6777b538SAndroid Build Coastguard Worker 
46*6777b538SAndroid Build Coastguard Worker #include "base/threading/platform_thread.h"
47*6777b538SAndroid Build Coastguard Worker #endif
48*6777b538SAndroid Build Coastguard Worker 
49*6777b538SAndroid Build Coastguard Worker namespace base {
50*6777b538SAndroid Build Coastguard Worker 
51*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
52*6777b538SAndroid Build Coastguard Worker // Minor and major page fault counts since the process creation.
53*6777b538SAndroid Build Coastguard Worker // Both counts are process-wide, and exclude child processes.
54*6777b538SAndroid Build Coastguard Worker //
55*6777b538SAndroid Build Coastguard Worker // minor: Number of page faults that didn't require disk IO.
56*6777b538SAndroid Build Coastguard Worker // major: Number of page faults that required disk IO.
57*6777b538SAndroid Build Coastguard Worker struct PageFaultCounts {
58*6777b538SAndroid Build Coastguard Worker   int64_t minor;
59*6777b538SAndroid Build Coastguard Worker   int64_t major;
60*6777b538SAndroid Build Coastguard Worker };
61*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) ||
62*6777b538SAndroid Build Coastguard Worker         // BUILDFLAG(IS_ANDROID)
63*6777b538SAndroid Build Coastguard Worker 
64*6777b538SAndroid Build Coastguard Worker // Convert a POSIX timeval to microseconds.
65*6777b538SAndroid Build Coastguard Worker BASE_EXPORT int64_t TimeValToMicroseconds(const struct timeval& tv);
66*6777b538SAndroid Build Coastguard Worker 
67*6777b538SAndroid Build Coastguard Worker enum class ProcessCPUUsageError {
68*6777b538SAndroid Build Coastguard Worker   // The OS returned an error while measuring the CPU usage. The possible causes
69*6777b538SAndroid Build Coastguard Worker   // vary by platform.
70*6777b538SAndroid Build Coastguard Worker   kSystemError,
71*6777b538SAndroid Build Coastguard Worker 
72*6777b538SAndroid Build Coastguard Worker   // Process CPU usage couldn't be measured because the process wasn't running.
73*6777b538SAndroid Build Coastguard Worker   // Some platforms may return kSystemError instead in this situation.
74*6777b538SAndroid Build Coastguard Worker   kProcessNotFound,
75*6777b538SAndroid Build Coastguard Worker 
76*6777b538SAndroid Build Coastguard Worker   // CPU usage measurement isn't implemented on this platform.
77*6777b538SAndroid Build Coastguard Worker   kNotImplemented,
78*6777b538SAndroid Build Coastguard Worker };
79*6777b538SAndroid Build Coastguard Worker 
80*6777b538SAndroid Build Coastguard Worker // Provides performance metrics for a specified process (CPU usage and IO
81*6777b538SAndroid Build Coastguard Worker // counters). Use CreateCurrentProcessMetrics() to get an instance for the
82*6777b538SAndroid Build Coastguard Worker // current process, or CreateProcessMetrics() to get an instance for an
83*6777b538SAndroid Build Coastguard Worker // arbitrary process. Then, access the information with the different get
84*6777b538SAndroid Build Coastguard Worker // methods.
85*6777b538SAndroid Build Coastguard Worker //
86*6777b538SAndroid Build Coastguard Worker // This class exposes a few platform-specific APIs for parsing memory usage, but
87*6777b538SAndroid Build Coastguard Worker // these are not intended to generalize to other platforms, since the memory
88*6777b538SAndroid Build Coastguard Worker // models differ substantially.
89*6777b538SAndroid Build Coastguard Worker //
90*6777b538SAndroid Build Coastguard Worker // To obtain consistent memory metrics, use the memory_instrumentation service.
91*6777b538SAndroid Build Coastguard Worker //
92*6777b538SAndroid Build Coastguard Worker // For further documentation on memory, see
93*6777b538SAndroid Build Coastguard Worker // https://chromium.googlesource.com/chromium/src/+/HEAD/docs/README.md#Memory
94*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT ProcessMetrics {
95*6777b538SAndroid Build Coastguard Worker  public:
96*6777b538SAndroid Build Coastguard Worker   ProcessMetrics(const ProcessMetrics&) = delete;
97*6777b538SAndroid Build Coastguard Worker   ProcessMetrics& operator=(const ProcessMetrics&) = delete;
98*6777b538SAndroid Build Coastguard Worker 
99*6777b538SAndroid Build Coastguard Worker   ~ProcessMetrics();
100*6777b538SAndroid Build Coastguard Worker 
101*6777b538SAndroid Build Coastguard Worker   // Creates a ProcessMetrics for the specified process.
102*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_MAC)
103*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<ProcessMetrics> CreateProcessMetrics(
104*6777b538SAndroid Build Coastguard Worker       ProcessHandle process);
105*6777b538SAndroid Build Coastguard Worker #else
106*6777b538SAndroid Build Coastguard Worker 
107*6777b538SAndroid Build Coastguard Worker   // The port provider needs to outlive the ProcessMetrics object returned by
108*6777b538SAndroid Build Coastguard Worker   // this function. If NULL is passed as provider, the returned object
109*6777b538SAndroid Build Coastguard Worker   // only returns valid metrics if |process| is the current process.
110*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<ProcessMetrics> CreateProcessMetrics(
111*6777b538SAndroid Build Coastguard Worker       ProcessHandle process,
112*6777b538SAndroid Build Coastguard Worker       PortProvider* port_provider);
113*6777b538SAndroid Build Coastguard Worker #endif  // !BUILDFLAG(IS_MAC)
114*6777b538SAndroid Build Coastguard Worker 
115*6777b538SAndroid Build Coastguard Worker   // Creates a ProcessMetrics for the current process. This a cross-platform
116*6777b538SAndroid Build Coastguard Worker   // convenience wrapper for CreateProcessMetrics().
117*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<ProcessMetrics> CreateCurrentProcessMetrics();
118*6777b538SAndroid Build Coastguard Worker 
119*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
120*6777b538SAndroid Build Coastguard Worker   // Resident Set Size is a Linux/Android specific memory concept. Do not
121*6777b538SAndroid Build Coastguard Worker   // attempt to extend this to other platforms.
122*6777b538SAndroid Build Coastguard Worker   BASE_EXPORT size_t GetResidentSetSize() const;
123*6777b538SAndroid Build Coastguard Worker #endif
124*6777b538SAndroid Build Coastguard Worker 
125*6777b538SAndroid Build Coastguard Worker   // Returns the percentage of time spent executing, across all threads of the
126*6777b538SAndroid Build Coastguard Worker   // process, in the interval since the last time the method was called, using
127*6777b538SAndroid Build Coastguard Worker   // the current |cumulative_cpu|. Since this considers the total execution time
128*6777b538SAndroid Build Coastguard Worker   // across all threads in a process, the result can easily exceed 100% in
129*6777b538SAndroid Build Coastguard Worker   // multi-thread processes running on multi-core systems. In general the result
130*6777b538SAndroid Build Coastguard Worker   // is therefore a value in the range 0% to
131*6777b538SAndroid Build Coastguard Worker   // SysInfo::NumberOfProcessors() * 100%.
132*6777b538SAndroid Build Coastguard Worker   //
133*6777b538SAndroid Build Coastguard Worker   // To obtain the percentage of total available CPU resources consumed by this
134*6777b538SAndroid Build Coastguard Worker   // process over the interval, the caller must divide by NumberOfProcessors().
135*6777b538SAndroid Build Coastguard Worker   //
136*6777b538SAndroid Build Coastguard Worker   // Since this API measures usage over an interval, it will return zero on the
137*6777b538SAndroid Build Coastguard Worker   // first call, and an actual value only on the second and subsequent calls.
138*6777b538SAndroid Build Coastguard Worker   [[nodiscard]] double GetPlatformIndependentCPUUsage(TimeDelta cumulative_cpu);
139*6777b538SAndroid Build Coastguard Worker 
140*6777b538SAndroid Build Coastguard Worker   // Same as the above, but automatically calls GetCumulativeCPUUsage() to
141*6777b538SAndroid Build Coastguard Worker   // determine the current cumulative CPU. Returns nullopt if
142*6777b538SAndroid Build Coastguard Worker   // GetCumulativeCPUUsage() fails.
143*6777b538SAndroid Build Coastguard Worker   base::expected<double, ProcessCPUUsageError> GetPlatformIndependentCPUUsage();
144*6777b538SAndroid Build Coastguard Worker 
145*6777b538SAndroid Build Coastguard Worker   // Returns the cumulative CPU usage across all threads of the process since
146*6777b538SAndroid Build Coastguard Worker   // process start, or nullopt on error. In case of multi-core processors, a
147*6777b538SAndroid Build Coastguard Worker   // process can consume CPU at a rate higher than wall-clock time, e.g. two
148*6777b538SAndroid Build Coastguard Worker   // cores at full utilization will result in a time delta of 2 seconds/per 1
149*6777b538SAndroid Build Coastguard Worker   // wall-clock second.
150*6777b538SAndroid Build Coastguard Worker   base::expected<TimeDelta, ProcessCPUUsageError> GetCumulativeCPUUsage();
151*6777b538SAndroid Build Coastguard Worker 
152*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || \
153*6777b538SAndroid Build Coastguard Worker     BUILDFLAG(IS_AIX)
154*6777b538SAndroid Build Coastguard Worker   // Emits the cumulative CPU usage for all currently active threads since they
155*6777b538SAndroid Build Coastguard Worker   // were started into the output parameter (replacing its current contents).
156*6777b538SAndroid Build Coastguard Worker   // Threads that have already terminated will not be reported. Thus, the sum of
157*6777b538SAndroid Build Coastguard Worker   // these times may not equal the value returned by GetCumulativeCPUUsage().
158*6777b538SAndroid Build Coastguard Worker   // Returns false on failure. We return the usage via an output parameter to
159*6777b538SAndroid Build Coastguard Worker   // allow reuse of CPUUsagePerThread's std::vector by the caller, e.g. to avoid
160*6777b538SAndroid Build Coastguard Worker   // allocations between repeated calls to this method.
161*6777b538SAndroid Build Coastguard Worker   // NOTE: Currently only supported on Linux/Android.
162*6777b538SAndroid Build Coastguard Worker   using CPUUsagePerThread = std::vector<std::pair<PlatformThreadId, TimeDelta>>;
163*6777b538SAndroid Build Coastguard Worker   bool GetCumulativeCPUUsagePerThread(CPUUsagePerThread&);
164*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) ||
165*6777b538SAndroid Build Coastguard Worker         // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_AIX)
166*6777b538SAndroid Build Coastguard Worker 
167*6777b538SAndroid Build Coastguard Worker   // Returns the number of average idle cpu wakeups per second since the last
168*6777b538SAndroid Build Coastguard Worker   // call.
169*6777b538SAndroid Build Coastguard Worker   int GetIdleWakeupsPerSecond();
170*6777b538SAndroid Build Coastguard Worker 
171*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_APPLE)
172*6777b538SAndroid Build Coastguard Worker   // Returns the number of average "package idle exits" per second, which have
173*6777b538SAndroid Build Coastguard Worker   // a higher energy impact than a regular wakeup, since the last call.
174*6777b538SAndroid Build Coastguard Worker   //
175*6777b538SAndroid Build Coastguard Worker   // From the powermetrics man page:
176*6777b538SAndroid Build Coastguard Worker   // "With the exception of some Mac Pro systems, Mac and
177*6777b538SAndroid Build Coastguard Worker   // iOS systems are typically single package systems, wherein all CPUs are
178*6777b538SAndroid Build Coastguard Worker   // part of a single processor complex (typically a single IC die) with shared
179*6777b538SAndroid Build Coastguard Worker   // logic that can include (depending on system specifics) shared last level
180*6777b538SAndroid Build Coastguard Worker   // caches, an integrated memory controller etc. When all CPUs in the package
181*6777b538SAndroid Build Coastguard Worker   // are idle, the hardware can power-gate significant portions of the shared
182*6777b538SAndroid Build Coastguard Worker   // logic in addition to each individual processor's logic, as well as take
183*6777b538SAndroid Build Coastguard Worker   // measures such as placing DRAM in to self-refresh (also referred to as
184*6777b538SAndroid Build Coastguard Worker   // auto-refresh), place interconnects into lower-power states etc"
185*6777b538SAndroid Build Coastguard Worker   int GetPackageIdleWakeupsPerSecond();
186*6777b538SAndroid Build Coastguard Worker #endif
187*6777b538SAndroid Build Coastguard Worker 
188*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_POSIX)
189*6777b538SAndroid Build Coastguard Worker   // Returns the number of file descriptors currently open by the process, or
190*6777b538SAndroid Build Coastguard Worker   // -1 on error.
191*6777b538SAndroid Build Coastguard Worker   int GetOpenFdCount() const;
192*6777b538SAndroid Build Coastguard Worker 
193*6777b538SAndroid Build Coastguard Worker   // Returns the soft limit of file descriptors that can be opened by the
194*6777b538SAndroid Build Coastguard Worker   // process, or -1 on error.
195*6777b538SAndroid Build Coastguard Worker   int GetOpenFdSoftLimit() const;
196*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_POSIX)
197*6777b538SAndroid Build Coastguard Worker 
198*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
199*6777b538SAndroid Build Coastguard Worker   // Bytes of swap as reported by /proc/[pid]/status.
200*6777b538SAndroid Build Coastguard Worker   uint64_t GetVmSwapBytes() const;
201*6777b538SAndroid Build Coastguard Worker 
202*6777b538SAndroid Build Coastguard Worker   // Minor and major page fault count as reported by /proc/[pid]/stat.
203*6777b538SAndroid Build Coastguard Worker   // Returns true for success.
204*6777b538SAndroid Build Coastguard Worker   bool GetPageFaultCounts(PageFaultCounts* counts) const;
205*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) ||
206*6777b538SAndroid Build Coastguard Worker         // BUILDFLAG(IS_ANDROID)
207*6777b538SAndroid Build Coastguard Worker 
208*6777b538SAndroid Build Coastguard Worker   // Returns total memory usage of malloc.
209*6777b538SAndroid Build Coastguard Worker   size_t GetMallocUsage();
210*6777b538SAndroid Build Coastguard Worker 
211*6777b538SAndroid Build Coastguard Worker  private:
212*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_MAC)
213*6777b538SAndroid Build Coastguard Worker   explicit ProcessMetrics(ProcessHandle process);
214*6777b538SAndroid Build Coastguard Worker #else
215*6777b538SAndroid Build Coastguard Worker   ProcessMetrics(ProcessHandle process, PortProvider* port_provider);
216*6777b538SAndroid Build Coastguard Worker #endif  // !BUILDFLAG(IS_MAC)
217*6777b538SAndroid Build Coastguard Worker 
218*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
219*6777b538SAndroid Build Coastguard Worker     BUILDFLAG(IS_AIX)
220*6777b538SAndroid Build Coastguard Worker   int CalculateIdleWakeupsPerSecond(uint64_t absolute_idle_wakeups);
221*6777b538SAndroid Build Coastguard Worker #endif
222*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_APPLE)
223*6777b538SAndroid Build Coastguard Worker   // The subset of wakeups that cause a "package exit" can be tracked on macOS.
224*6777b538SAndroid Build Coastguard Worker   // See |GetPackageIdleWakeupsForSecond| comment for more info.
225*6777b538SAndroid Build Coastguard Worker   int CalculatePackageIdleWakeupsPerSecond(
226*6777b538SAndroid Build Coastguard Worker       uint64_t absolute_package_idle_wakeups);
227*6777b538SAndroid Build Coastguard Worker 
228*6777b538SAndroid Build Coastguard Worker   // Queries the port provider if it's set.
229*6777b538SAndroid Build Coastguard Worker   mach_port_t TaskForHandle(ProcessHandle process_handle) const;
230*6777b538SAndroid Build Coastguard Worker #endif
231*6777b538SAndroid Build Coastguard Worker 
232*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
233*6777b538SAndroid Build Coastguard Worker   win::ScopedHandle process_;
234*6777b538SAndroid Build Coastguard Worker #else
235*6777b538SAndroid Build Coastguard Worker   ProcessHandle process_;
236*6777b538SAndroid Build Coastguard Worker #endif
237*6777b538SAndroid Build Coastguard Worker 
238*6777b538SAndroid Build Coastguard Worker   // Used to store the previous times and CPU usage counts so we can
239*6777b538SAndroid Build Coastguard Worker   // compute the CPU usage between calls.
240*6777b538SAndroid Build Coastguard Worker   TimeTicks last_cpu_time_;
241*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_FREEBSD) || !BUILDFLAG(IS_POSIX)
242*6777b538SAndroid Build Coastguard Worker   TimeDelta last_cumulative_cpu_;
243*6777b538SAndroid Build Coastguard Worker #endif
244*6777b538SAndroid Build Coastguard Worker 
245*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
246*6777b538SAndroid Build Coastguard Worker     BUILDFLAG(IS_AIX)
247*6777b538SAndroid Build Coastguard Worker   // Same thing for idle wakeups.
248*6777b538SAndroid Build Coastguard Worker   TimeTicks last_idle_wakeups_time_;
249*6777b538SAndroid Build Coastguard Worker   uint64_t last_absolute_idle_wakeups_;
250*6777b538SAndroid Build Coastguard Worker #endif
251*6777b538SAndroid Build Coastguard Worker 
252*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_APPLE)
253*6777b538SAndroid Build Coastguard Worker   // And same thing for package idle exit wakeups.
254*6777b538SAndroid Build Coastguard Worker   TimeTicks last_package_idle_wakeups_time_;
255*6777b538SAndroid Build Coastguard Worker   uint64_t last_absolute_package_idle_wakeups_;
256*6777b538SAndroid Build Coastguard Worker 
257*6777b538SAndroid Build Coastguard Worker   // Works around a race condition when combining two task_info() calls to
258*6777b538SAndroid Build Coastguard Worker   // measure CPU time.
259*6777b538SAndroid Build Coastguard Worker   TimeDelta last_measured_cpu_;
260*6777b538SAndroid Build Coastguard Worker #endif
261*6777b538SAndroid Build Coastguard Worker 
262*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_MAC)
263*6777b538SAndroid Build Coastguard Worker   raw_ptr<PortProvider> port_provider_;
264*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_MAC)
265*6777b538SAndroid Build Coastguard Worker };
266*6777b538SAndroid Build Coastguard Worker 
267*6777b538SAndroid Build Coastguard Worker // Returns the memory committed by the system in KBytes.
268*6777b538SAndroid Build Coastguard Worker // Returns 0 if it can't compute the commit charge.
269*6777b538SAndroid Build Coastguard Worker BASE_EXPORT size_t GetSystemCommitCharge();
270*6777b538SAndroid Build Coastguard Worker 
271*6777b538SAndroid Build Coastguard Worker // Returns the maximum number of file descriptors that can be open by a process
272*6777b538SAndroid Build Coastguard Worker // at once. If the number is unavailable, a conservative best guess is returned.
273*6777b538SAndroid Build Coastguard Worker BASE_EXPORT size_t GetMaxFds();
274*6777b538SAndroid Build Coastguard Worker 
275*6777b538SAndroid Build Coastguard Worker // Returns the maximum number of handles that can be open at once per process.
276*6777b538SAndroid Build Coastguard Worker BASE_EXPORT size_t GetHandleLimit();
277*6777b538SAndroid Build Coastguard Worker 
278*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_POSIX)
279*6777b538SAndroid Build Coastguard Worker // Increases the file descriptor soft limit to |max_descriptors| or the OS hard
280*6777b538SAndroid Build Coastguard Worker // limit, whichever is lower. If the limit is already higher than
281*6777b538SAndroid Build Coastguard Worker // |max_descriptors|, then nothing happens.
282*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void IncreaseFdLimitTo(unsigned int max_descriptors);
283*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_POSIX)
284*6777b538SAndroid Build Coastguard Worker 
285*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) ||      \
286*6777b538SAndroid Build Coastguard Worker     BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_AIX) || \
287*6777b538SAndroid Build Coastguard Worker     BUILDFLAG(IS_FUCHSIA)
288*6777b538SAndroid Build Coastguard Worker // Data about system-wide memory consumption. Values are in KB. Available on
289*6777b538SAndroid Build Coastguard Worker // Windows, Mac, Linux, Android and Chrome OS.
290*6777b538SAndroid Build Coastguard Worker //
291*6777b538SAndroid Build Coastguard Worker // Total memory are available on all platforms that implement
292*6777b538SAndroid Build Coastguard Worker // GetSystemMemoryInfo(). Total/free swap memory are available on all platforms
293*6777b538SAndroid Build Coastguard Worker // except on Mac. Buffers/cached/active_anon/inactive_anon/active_file/
294*6777b538SAndroid Build Coastguard Worker // inactive_file/dirty/reclaimable/pswpin/pswpout/pgmajfault are available on
295*6777b538SAndroid Build Coastguard Worker // Linux/Android/Chrome OS. Shmem/slab are Chrome OS only.
296*6777b538SAndroid Build Coastguard Worker // Speculative/file_backed/purgeable are Mac and iOS only.
297*6777b538SAndroid Build Coastguard Worker // Free is absent on Windows (see "avail_phys" below).
298*6777b538SAndroid Build Coastguard Worker struct BASE_EXPORT SystemMemoryInfoKB {
299*6777b538SAndroid Build Coastguard Worker   SystemMemoryInfoKB();
300*6777b538SAndroid Build Coastguard Worker   SystemMemoryInfoKB(const SystemMemoryInfoKB& other);
301*6777b538SAndroid Build Coastguard Worker   SystemMemoryInfoKB& operator=(const SystemMemoryInfoKB& other);
302*6777b538SAndroid Build Coastguard Worker 
303*6777b538SAndroid Build Coastguard Worker   // Serializes the platform specific fields to value.
304*6777b538SAndroid Build Coastguard Worker   Value::Dict ToDict() const;
305*6777b538SAndroid Build Coastguard Worker 
306*6777b538SAndroid Build Coastguard Worker   int total = 0;
307*6777b538SAndroid Build Coastguard Worker 
308*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_WIN)
309*6777b538SAndroid Build Coastguard Worker   int free = 0;
310*6777b538SAndroid Build Coastguard Worker #endif
311*6777b538SAndroid Build Coastguard Worker 
312*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
313*6777b538SAndroid Build Coastguard Worker   // "This is the amount of physical memory that can be immediately reused
314*6777b538SAndroid Build Coastguard Worker   // without having to write its contents to disk first. It is the sum of the
315*6777b538SAndroid Build Coastguard Worker   // size of the standby, free, and zero lists." (MSDN).
316*6777b538SAndroid Build Coastguard Worker   // Standby: not modified pages of physical ram (file-backed memory) that are
317*6777b538SAndroid Build Coastguard Worker   // not actively being used.
318*6777b538SAndroid Build Coastguard Worker   int avail_phys = 0;
319*6777b538SAndroid Build Coastguard Worker #endif
320*6777b538SAndroid Build Coastguard Worker 
321*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || \
322*6777b538SAndroid Build Coastguard Worker     BUILDFLAG(IS_AIX)
323*6777b538SAndroid Build Coastguard Worker   // This provides an estimate of available memory as described here:
324*6777b538SAndroid Build Coastguard Worker   // https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773
325*6777b538SAndroid Build Coastguard Worker   // NOTE: this is ONLY valid in kernels 3.14 and up.  Its value will always
326*6777b538SAndroid Build Coastguard Worker   // be 0 in earlier kernel versions.
327*6777b538SAndroid Build Coastguard Worker   // Note: it includes _all_ file-backed memory (active + inactive).
328*6777b538SAndroid Build Coastguard Worker   int available = 0;
329*6777b538SAndroid Build Coastguard Worker #endif
330*6777b538SAndroid Build Coastguard Worker 
331*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_APPLE)
332*6777b538SAndroid Build Coastguard Worker   int swap_total = 0;
333*6777b538SAndroid Build Coastguard Worker   int swap_free = 0;
334*6777b538SAndroid Build Coastguard Worker #endif
335*6777b538SAndroid Build Coastguard Worker 
336*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
337*6777b538SAndroid Build Coastguard Worker     BUILDFLAG(IS_AIX) || BUILDFLAG(IS_FUCHSIA)
338*6777b538SAndroid Build Coastguard Worker   int buffers = 0;
339*6777b538SAndroid Build Coastguard Worker   int cached = 0;
340*6777b538SAndroid Build Coastguard Worker   int active_anon = 0;
341*6777b538SAndroid Build Coastguard Worker   int inactive_anon = 0;
342*6777b538SAndroid Build Coastguard Worker   int active_file = 0;
343*6777b538SAndroid Build Coastguard Worker   int inactive_file = 0;
344*6777b538SAndroid Build Coastguard Worker   int dirty = 0;
345*6777b538SAndroid Build Coastguard Worker   int reclaimable = 0;
346*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) ||
347*6777b538SAndroid Build Coastguard Worker         // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_AIX) BUILDFLAG(IS_FUCHSIA)
348*6777b538SAndroid Build Coastguard Worker 
349*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_CHROMEOS)
350*6777b538SAndroid Build Coastguard Worker   int shmem = 0;
351*6777b538SAndroid Build Coastguard Worker   int slab = 0;
352*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_CHROMEOS)
353*6777b538SAndroid Build Coastguard Worker 
354*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_APPLE)
355*6777b538SAndroid Build Coastguard Worker   int speculative = 0;
356*6777b538SAndroid Build Coastguard Worker   int file_backed = 0;
357*6777b538SAndroid Build Coastguard Worker   int purgeable = 0;
358*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_APPLE)
359*6777b538SAndroid Build Coastguard Worker };
360*6777b538SAndroid Build Coastguard Worker 
361*6777b538SAndroid Build Coastguard Worker // On Linux/Android/Chrome OS, system-wide memory consumption data is parsed
362*6777b538SAndroid Build Coastguard Worker // from /proc/meminfo and /proc/vmstat. On Windows/Mac, it is obtained using
363*6777b538SAndroid Build Coastguard Worker // system API calls.
364*6777b538SAndroid Build Coastguard Worker //
365*6777b538SAndroid Build Coastguard Worker // Fills in the provided |meminfo| structure. Returns true on success.
366*6777b538SAndroid Build Coastguard Worker // Exposed for memory debugging widget.
367*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool GetSystemMemoryInfo(SystemMemoryInfoKB* meminfo);
368*6777b538SAndroid Build Coastguard Worker 
369*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) ||
370*6777b538SAndroid Build Coastguard Worker         // BUILDFLAG(IS_CHROMEOS) BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_AIX) ||
371*6777b538SAndroid Build Coastguard Worker         // BUILDFLAG(IS_FUCHSIA)
372*6777b538SAndroid Build Coastguard Worker 
373*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || \
374*6777b538SAndroid Build Coastguard Worker     BUILDFLAG(IS_AIX)
375*6777b538SAndroid Build Coastguard Worker // Parse the data found in /proc/<pid>/stat and return the sum of the
376*6777b538SAndroid Build Coastguard Worker // CPU-related ticks.  Returns -1 on parse error.
377*6777b538SAndroid Build Coastguard Worker // Exposed for testing.
378*6777b538SAndroid Build Coastguard Worker BASE_EXPORT int ParseProcStatCPU(std::string_view input);
379*6777b538SAndroid Build Coastguard Worker 
380*6777b538SAndroid Build Coastguard Worker // Get the number of threads of |process| as available in /proc/<pid>/stat.
381*6777b538SAndroid Build Coastguard Worker // This should be used with care as no synchronization with running threads is
382*6777b538SAndroid Build Coastguard Worker // done. This is mostly useful to guarantee being single-threaded.
383*6777b538SAndroid Build Coastguard Worker // Returns 0 on failure.
384*6777b538SAndroid Build Coastguard Worker BASE_EXPORT int64_t GetNumberOfThreads(ProcessHandle process);
385*6777b538SAndroid Build Coastguard Worker 
386*6777b538SAndroid Build Coastguard Worker // /proc/self/exe refers to the current executable.
387*6777b538SAndroid Build Coastguard Worker BASE_EXPORT extern const char kProcSelfExe[];
388*6777b538SAndroid Build Coastguard Worker 
389*6777b538SAndroid Build Coastguard Worker // Parses a string containing the contents of /proc/meminfo
390*6777b538SAndroid Build Coastguard Worker // returns true on success or false for a parsing error
391*6777b538SAndroid Build Coastguard Worker // Exposed for testing.
392*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool ParseProcMeminfo(std::string_view input,
393*6777b538SAndroid Build Coastguard Worker                                   SystemMemoryInfoKB* meminfo);
394*6777b538SAndroid Build Coastguard Worker 
395*6777b538SAndroid Build Coastguard Worker // Returns the memory committed by the system in KBytes, as from
396*6777b538SAndroid Build Coastguard Worker // GetSystemCommitCharge(), using data from `meminfo` instead of /proc/meminfo.
397*6777b538SAndroid Build Coastguard Worker // Exposed for testing.
398*6777b538SAndroid Build Coastguard Worker BASE_EXPORT size_t
399*6777b538SAndroid Build Coastguard Worker GetSystemCommitChargeFromMeminfo(const SystemMemoryInfoKB& meminfo);
400*6777b538SAndroid Build Coastguard Worker 
401*6777b538SAndroid Build Coastguard Worker // Data from /proc/vmstat.
402*6777b538SAndroid Build Coastguard Worker struct BASE_EXPORT VmStatInfo {
403*6777b538SAndroid Build Coastguard Worker   // Serializes the platform specific fields to value.
404*6777b538SAndroid Build Coastguard Worker   Value::Dict ToDict() const;
405*6777b538SAndroid Build Coastguard Worker 
406*6777b538SAndroid Build Coastguard Worker   uint64_t pswpin = 0;
407*6777b538SAndroid Build Coastguard Worker   uint64_t pswpout = 0;
408*6777b538SAndroid Build Coastguard Worker   uint64_t pgmajfault = 0;
409*6777b538SAndroid Build Coastguard Worker   uint64_t oom_kill = 0;
410*6777b538SAndroid Build Coastguard Worker };
411*6777b538SAndroid Build Coastguard Worker 
412*6777b538SAndroid Build Coastguard Worker // Retrieves data from /proc/vmstat about system-wide vm operations.
413*6777b538SAndroid Build Coastguard Worker // Fills in the provided |vmstat| structure. Returns true on success.
414*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool GetVmStatInfo(VmStatInfo* vmstat);
415*6777b538SAndroid Build Coastguard Worker 
416*6777b538SAndroid Build Coastguard Worker // Parses a string containing the contents of /proc/vmstat
417*6777b538SAndroid Build Coastguard Worker // returns true on success or false for a parsing error
418*6777b538SAndroid Build Coastguard Worker // Exposed for testing.
419*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool ParseProcVmstat(std::string_view input, VmStatInfo* vmstat);
420*6777b538SAndroid Build Coastguard Worker 
421*6777b538SAndroid Build Coastguard Worker // Data from /proc/diskstats about system-wide disk I/O.
422*6777b538SAndroid Build Coastguard Worker struct BASE_EXPORT SystemDiskInfo {
423*6777b538SAndroid Build Coastguard Worker   SystemDiskInfo();
424*6777b538SAndroid Build Coastguard Worker   SystemDiskInfo(const SystemDiskInfo&);
425*6777b538SAndroid Build Coastguard Worker   SystemDiskInfo& operator=(const SystemDiskInfo&);
426*6777b538SAndroid Build Coastguard Worker 
427*6777b538SAndroid Build Coastguard Worker   // Serializes the platform specific fields to value.
428*6777b538SAndroid Build Coastguard Worker   Value::Dict ToDict() const;
429*6777b538SAndroid Build Coastguard Worker 
430*6777b538SAndroid Build Coastguard Worker   uint64_t reads = 0;
431*6777b538SAndroid Build Coastguard Worker   uint64_t reads_merged = 0;
432*6777b538SAndroid Build Coastguard Worker   uint64_t sectors_read = 0;
433*6777b538SAndroid Build Coastguard Worker   uint64_t read_time = 0;
434*6777b538SAndroid Build Coastguard Worker   uint64_t writes = 0;
435*6777b538SAndroid Build Coastguard Worker   uint64_t writes_merged = 0;
436*6777b538SAndroid Build Coastguard Worker   uint64_t sectors_written = 0;
437*6777b538SAndroid Build Coastguard Worker   uint64_t write_time = 0;
438*6777b538SAndroid Build Coastguard Worker   uint64_t io = 0;
439*6777b538SAndroid Build Coastguard Worker   uint64_t io_time = 0;
440*6777b538SAndroid Build Coastguard Worker   uint64_t weighted_io_time = 0;
441*6777b538SAndroid Build Coastguard Worker };
442*6777b538SAndroid Build Coastguard Worker 
443*6777b538SAndroid Build Coastguard Worker // Checks whether the candidate string is a valid disk name, [hsv]d[a-z]+
444*6777b538SAndroid Build Coastguard Worker // for a generic disk or mmcblk[0-9]+ for the MMC case.
445*6777b538SAndroid Build Coastguard Worker // Names of disk partitions (e.g. sda1) are not valid.
446*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool IsValidDiskName(std::string_view candidate);
447*6777b538SAndroid Build Coastguard Worker 
448*6777b538SAndroid Build Coastguard Worker // Retrieves data from /proc/diskstats about system-wide disk I/O.
449*6777b538SAndroid Build Coastguard Worker // Fills in the provided |diskinfo| structure. Returns true on success.
450*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool GetSystemDiskInfo(SystemDiskInfo* diskinfo);
451*6777b538SAndroid Build Coastguard Worker 
452*6777b538SAndroid Build Coastguard Worker // Returns the amount of time spent in user space since boot across all CPUs.
453*6777b538SAndroid Build Coastguard Worker BASE_EXPORT TimeDelta GetUserCpuTimeSinceBoot();
454*6777b538SAndroid Build Coastguard Worker 
455*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) ||
456*6777b538SAndroid Build Coastguard Worker         // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_AIX)
457*6777b538SAndroid Build Coastguard Worker 
458*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_CHROMEOS)
459*6777b538SAndroid Build Coastguard Worker // Data from files in directory /sys/block/zram0 about ZRAM usage.
460*6777b538SAndroid Build Coastguard Worker struct BASE_EXPORT SwapInfo {
SwapInfoSwapInfo461*6777b538SAndroid Build Coastguard Worker   SwapInfo()
462*6777b538SAndroid Build Coastguard Worker       : num_reads(0),
463*6777b538SAndroid Build Coastguard Worker         num_writes(0),
464*6777b538SAndroid Build Coastguard Worker         compr_data_size(0),
465*6777b538SAndroid Build Coastguard Worker         orig_data_size(0),
466*6777b538SAndroid Build Coastguard Worker         mem_used_total(0) {
467*6777b538SAndroid Build Coastguard Worker   }
468*6777b538SAndroid Build Coastguard Worker 
469*6777b538SAndroid Build Coastguard Worker   // Serializes the platform specific fields to value.
470*6777b538SAndroid Build Coastguard Worker   Value::Dict ToDict() const;
471*6777b538SAndroid Build Coastguard Worker 
472*6777b538SAndroid Build Coastguard Worker   uint64_t num_reads = 0;
473*6777b538SAndroid Build Coastguard Worker   uint64_t num_writes = 0;
474*6777b538SAndroid Build Coastguard Worker   uint64_t compr_data_size = 0;
475*6777b538SAndroid Build Coastguard Worker   uint64_t orig_data_size = 0;
476*6777b538SAndroid Build Coastguard Worker   uint64_t mem_used_total = 0;
477*6777b538SAndroid Build Coastguard Worker };
478*6777b538SAndroid Build Coastguard Worker 
479*6777b538SAndroid Build Coastguard Worker // Parses a string containing the contents of /sys/block/zram0/mm_stat.
480*6777b538SAndroid Build Coastguard Worker // This should be used for the new ZRAM sysfs interfaces.
481*6777b538SAndroid Build Coastguard Worker // Returns true on success or false for a parsing error.
482*6777b538SAndroid Build Coastguard Worker // Exposed for testing.
483*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool ParseZramMmStat(std::string_view mm_stat_data,
484*6777b538SAndroid Build Coastguard Worker                                  SwapInfo* swap_info);
485*6777b538SAndroid Build Coastguard Worker 
486*6777b538SAndroid Build Coastguard Worker // Parses a string containing the contents of /sys/block/zram0/stat
487*6777b538SAndroid Build Coastguard Worker // This should be used for the new ZRAM sysfs interfaces.
488*6777b538SAndroid Build Coastguard Worker // Returns true on success or false for a parsing error.
489*6777b538SAndroid Build Coastguard Worker // Exposed for testing.
490*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool ParseZramStat(std::string_view stat_data, SwapInfo* swap_info);
491*6777b538SAndroid Build Coastguard Worker 
492*6777b538SAndroid Build Coastguard Worker // In ChromeOS, reads files from /sys/block/zram0 that contain ZRAM usage data.
493*6777b538SAndroid Build Coastguard Worker // Fills in the provided |swap_data| structure.
494*6777b538SAndroid Build Coastguard Worker // Returns true on success or false for a parsing error.
495*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool GetSwapInfo(SwapInfo* swap_info);
496*6777b538SAndroid Build Coastguard Worker 
497*6777b538SAndroid Build Coastguard Worker // Data about GPU memory usage. These fields will be -1 if not supported.
498*6777b538SAndroid Build Coastguard Worker struct BASE_EXPORT GraphicsMemoryInfoKB {
499*6777b538SAndroid Build Coastguard Worker   // Serializes the platform specific fields to value.
500*6777b538SAndroid Build Coastguard Worker   Value::Dict ToDict() const;
501*6777b538SAndroid Build Coastguard Worker 
502*6777b538SAndroid Build Coastguard Worker   int gpu_objects = -1;
503*6777b538SAndroid Build Coastguard Worker   int64_t gpu_memory_size = -1;
504*6777b538SAndroid Build Coastguard Worker };
505*6777b538SAndroid Build Coastguard Worker 
506*6777b538SAndroid Build Coastguard Worker // Report on Chrome OS graphics memory. Returns true on success.
507*6777b538SAndroid Build Coastguard Worker // /run/debugfs_gpu is a bind mount into /sys/kernel/debug and synchronously
508*6777b538SAndroid Build Coastguard Worker // reading the in-memory files in /sys is fast in most cases. On platform that
509*6777b538SAndroid Build Coastguard Worker // reading the graphics memory info is slow, this function returns false.
510*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool GetGraphicsMemoryInfo(GraphicsMemoryInfoKB* gpu_meminfo);
511*6777b538SAndroid Build Coastguard Worker 
512*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_CHROMEOS)
513*6777b538SAndroid Build Coastguard Worker 
514*6777b538SAndroid Build Coastguard Worker struct BASE_EXPORT SystemPerformanceInfo {
515*6777b538SAndroid Build Coastguard Worker   SystemPerformanceInfo();
516*6777b538SAndroid Build Coastguard Worker   SystemPerformanceInfo(const SystemPerformanceInfo& other);
517*6777b538SAndroid Build Coastguard Worker   SystemPerformanceInfo& operator=(const SystemPerformanceInfo& other);
518*6777b538SAndroid Build Coastguard Worker 
519*6777b538SAndroid Build Coastguard Worker   // Serializes the platform specific fields to value.
520*6777b538SAndroid Build Coastguard Worker   Value::Dict ToDict() const;
521*6777b538SAndroid Build Coastguard Worker 
522*6777b538SAndroid Build Coastguard Worker   // Total idle time of all processes in the system (units of 100 ns).
523*6777b538SAndroid Build Coastguard Worker   uint64_t idle_time = 0;
524*6777b538SAndroid Build Coastguard Worker   // Number of bytes read.
525*6777b538SAndroid Build Coastguard Worker   uint64_t read_transfer_count = 0;
526*6777b538SAndroid Build Coastguard Worker   // Number of bytes written.
527*6777b538SAndroid Build Coastguard Worker   uint64_t write_transfer_count = 0;
528*6777b538SAndroid Build Coastguard Worker   // Number of bytes transferred (e.g. DeviceIoControlFile)
529*6777b538SAndroid Build Coastguard Worker   uint64_t other_transfer_count = 0;
530*6777b538SAndroid Build Coastguard Worker   // The amount of read operations.
531*6777b538SAndroid Build Coastguard Worker   uint64_t read_operation_count = 0;
532*6777b538SAndroid Build Coastguard Worker   // The amount of write operations.
533*6777b538SAndroid Build Coastguard Worker   uint64_t write_operation_count = 0;
534*6777b538SAndroid Build Coastguard Worker   // The amount of other operations.
535*6777b538SAndroid Build Coastguard Worker   uint64_t other_operation_count = 0;
536*6777b538SAndroid Build Coastguard Worker   // The number of pages written to the system's pagefiles.
537*6777b538SAndroid Build Coastguard Worker   uint64_t pagefile_pages_written = 0;
538*6777b538SAndroid Build Coastguard Worker   // The number of write operations performed on the system's pagefiles.
539*6777b538SAndroid Build Coastguard Worker   uint64_t pagefile_pages_write_ios = 0;
540*6777b538SAndroid Build Coastguard Worker   // The number of pages of physical memory available to processes running on
541*6777b538SAndroid Build Coastguard Worker   // the system.
542*6777b538SAndroid Build Coastguard Worker   uint64_t available_pages = 0;
543*6777b538SAndroid Build Coastguard Worker   // The number of pages read from disk to resolve page faults.
544*6777b538SAndroid Build Coastguard Worker   uint64_t pages_read = 0;
545*6777b538SAndroid Build Coastguard Worker   // The number of read operations initiated to resolve page faults.
546*6777b538SAndroid Build Coastguard Worker   uint64_t page_read_ios = 0;
547*6777b538SAndroid Build Coastguard Worker };
548*6777b538SAndroid Build Coastguard Worker 
549*6777b538SAndroid Build Coastguard Worker // Retrieves performance counters from the operating system.
550*6777b538SAndroid Build Coastguard Worker // Fills in the provided |info| structure. Returns true on success.
551*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool GetSystemPerformanceInfo(SystemPerformanceInfo* info);
552*6777b538SAndroid Build Coastguard Worker 
553*6777b538SAndroid Build Coastguard Worker // Collects and holds performance metrics for system memory and disk.
554*6777b538SAndroid Build Coastguard Worker // Provides functionality to retrieve the data on various platforms and
555*6777b538SAndroid Build Coastguard Worker // to serialize the stored data.
556*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT SystemMetrics {
557*6777b538SAndroid Build Coastguard Worker  public:
558*6777b538SAndroid Build Coastguard Worker   SystemMetrics();
559*6777b538SAndroid Build Coastguard Worker 
560*6777b538SAndroid Build Coastguard Worker   static SystemMetrics Sample();
561*6777b538SAndroid Build Coastguard Worker 
562*6777b538SAndroid Build Coastguard Worker   // Serializes the system metrics to value.
563*6777b538SAndroid Build Coastguard Worker   Value::Dict ToDict() const;
564*6777b538SAndroid Build Coastguard Worker 
565*6777b538SAndroid Build Coastguard Worker  private:
566*6777b538SAndroid Build Coastguard Worker   FRIEND_TEST_ALL_PREFIXES(SystemMetricsTest, SystemMetrics);
567*6777b538SAndroid Build Coastguard Worker 
568*6777b538SAndroid Build Coastguard Worker   size_t committed_memory_;
569*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
570*6777b538SAndroid Build Coastguard Worker   SystemMemoryInfoKB memory_info_;
571*6777b538SAndroid Build Coastguard Worker   VmStatInfo vmstat_info_;
572*6777b538SAndroid Build Coastguard Worker   SystemDiskInfo disk_info_;
573*6777b538SAndroid Build Coastguard Worker #endif
574*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_CHROMEOS)
575*6777b538SAndroid Build Coastguard Worker   SwapInfo swap_info_;
576*6777b538SAndroid Build Coastguard Worker   GraphicsMemoryInfoKB gpu_memory_info_;
577*6777b538SAndroid Build Coastguard Worker #endif
578*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
579*6777b538SAndroid Build Coastguard Worker   SystemPerformanceInfo performance_;
580*6777b538SAndroid Build Coastguard Worker #endif
581*6777b538SAndroid Build Coastguard Worker };
582*6777b538SAndroid Build Coastguard Worker 
583*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_APPLE)
584*6777b538SAndroid Build Coastguard Worker enum class MachVMRegionResult {
585*6777b538SAndroid Build Coastguard Worker   // There were no more memory regions between |address| and the end of the
586*6777b538SAndroid Build Coastguard Worker   // virtual address space.
587*6777b538SAndroid Build Coastguard Worker   Finished,
588*6777b538SAndroid Build Coastguard Worker 
589*6777b538SAndroid Build Coastguard Worker   // All output parameters are invalid.
590*6777b538SAndroid Build Coastguard Worker   Error,
591*6777b538SAndroid Build Coastguard Worker 
592*6777b538SAndroid Build Coastguard Worker   // All output parameters are filled in.
593*6777b538SAndroid Build Coastguard Worker   Success
594*6777b538SAndroid Build Coastguard Worker };
595*6777b538SAndroid Build Coastguard Worker 
596*6777b538SAndroid Build Coastguard Worker // Returns info on the first memory region at or after |address|, including
597*6777b538SAndroid Build Coastguard Worker // protection values. On Success, |size| reflects the size of the
598*6777b538SAndroid Build Coastguard Worker // memory region.
599*6777b538SAndroid Build Coastguard Worker // Returns info on the first memory region at or after |address|, including
600*6777b538SAndroid Build Coastguard Worker // resident memory and share mode.
601*6777b538SAndroid Build Coastguard Worker // |size| and |info| are output parameters, only valid on Success.
602*6777b538SAndroid Build Coastguard Worker BASE_EXPORT MachVMRegionResult GetBasicInfo(mach_port_t task,
603*6777b538SAndroid Build Coastguard Worker                                             mach_vm_size_t* size,
604*6777b538SAndroid Build Coastguard Worker                                             mach_vm_address_t* address,
605*6777b538SAndroid Build Coastguard Worker                                             vm_region_basic_info_64* info);
606*6777b538SAndroid Build Coastguard Worker 
607*6777b538SAndroid Build Coastguard Worker // Returns info on the first memory region at or after |address|, including
608*6777b538SAndroid Build Coastguard Worker // resident memory and share mode. On Success, |size| reflects the size of the
609*6777b538SAndroid Build Coastguard Worker // memory region.
610*6777b538SAndroid Build Coastguard Worker // |size| and |info| are output parameters, only valid on Success.
611*6777b538SAndroid Build Coastguard Worker // |address| is an in-out parameter, than represents both the address to start
612*6777b538SAndroid Build Coastguard Worker // looking, and the start address of the memory region.
613*6777b538SAndroid Build Coastguard Worker BASE_EXPORT MachVMRegionResult GetTopInfo(mach_port_t task,
614*6777b538SAndroid Build Coastguard Worker                                           mach_vm_size_t* size,
615*6777b538SAndroid Build Coastguard Worker                                           mach_vm_address_t* address,
616*6777b538SAndroid Build Coastguard Worker                                           vm_region_top_info_data_t* info);
617*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_APPLE)
618*6777b538SAndroid Build Coastguard Worker 
619*6777b538SAndroid Build Coastguard Worker }  // namespace base
620*6777b538SAndroid Build Coastguard Worker 
621*6777b538SAndroid Build Coastguard Worker #endif  // BASE_PROCESS_PROCESS_METRICS_H_
622