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