process_metrics.h revision 94ffa55491333f3dcc701befd0d2652922916d99
1b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Use of this source code is governed by a BSD-style license that can be 3b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// found in the LICENSE file. 4b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 5b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// This file contains routines for gathering resource statistics for processes 6b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// running on the system. 7b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 8b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#ifndef BASE_PROCESS_PROCESS_METRICS_H_ 9b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define BASE_PROCESS_PROCESS_METRICS_H_ 10b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 110d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include <stddef.h> 120d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include <stdint.h> 130d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 14b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include <string> 15b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 16b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/base_export.h" 17b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/gtest_prod_util.h" 180d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "base/macros.h" 19b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/process/process_handle.h" 20b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/time/time.h" 21b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/values.h" 220d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "build/build_config.h" 23b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 24b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_MACOSX) 25b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include <mach/mach.h> 260d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "base/process/port_provider_mac.h" 27b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 28b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 29b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace base { 30b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 31b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_WIN) 32b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstruct IoCounters : public IO_COUNTERS { 33b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 34b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#elif defined(OS_POSIX) 35b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstruct IoCounters { 36b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat uint64_t ReadOperationCount; 37b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat uint64_t WriteOperationCount; 38b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat uint64_t OtherOperationCount; 39b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat uint64_t ReadTransferCount; 40b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat uint64_t WriteTransferCount; 41b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat uint64_t OtherTransferCount; 42b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 43b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 44b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 45b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Working Set (resident) memory usage broken down by 46b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// 47b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// On Windows: 48b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// priv (private): These pages (kbytes) cannot be shared with any other process. 49b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// shareable: These pages (kbytes) can be shared with other processes under 50b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// the right circumstances. 51b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// shared : These pages (kbytes) are currently shared with at least one 52b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// other process. 53b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// 54b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// On Linux: 55b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// priv: Pages mapped only by this process. 56b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// shared: PSS or 0 if the kernel doesn't support this. 57b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// shareable: 0 58b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 59b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// On ChromeOS: 60b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// priv: Pages mapped only by this process. 61b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// shared: PSS or 0 if the kernel doesn't support this. 62b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// shareable: 0 63b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// swapped Pages swapped out to zram. 64b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// 65b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// On OS X: TODO(thakis): Revise. 66b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// priv: Memory. 67b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// shared: 0 68b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// shareable: 0 69b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// 70b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstruct WorkingSetKBytes { 71b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat WorkingSetKBytes() : priv(0), shareable(0), shared(0) {} 72b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t priv; 73b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t shareable; 74b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t shared; 75b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_CHROMEOS) 76b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t swapped; 77b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 78b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 79b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 80b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Committed (resident + paged) memory usage broken down by 81b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// private: These pages cannot be shared with any other process. 82b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// mapped: These pages are mapped into the view of a section (backed by 83b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// pagefile.sys) 84b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// image: These pages are mapped into the view of an image section (backed by 85b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// file system) 86b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstruct CommittedKBytes { 87b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat CommittedKBytes() : priv(0), mapped(0), image(0) {} 88b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t priv; 89b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t mapped; 90b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t image; 91b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 92b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 93b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Convert a POSIX timeval to microseconds. 940d205d712abd16eeed2f5d5b1052a367d23a223fAlex VakulenkoBASE_EXPORT int64_t TimeValToMicroseconds(const struct timeval& tv); 95b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 96b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Provides performance metrics for a specified process (CPU usage, memory and 970d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// IO counters). Use CreateCurrentProcessMetrics() to get an instance for the 980d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// current process, or CreateProcessMetrics() to get an instance for an 990d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// arbitrary process. Then, access the information with the different get 100b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// methods. 101b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass BASE_EXPORT ProcessMetrics { 102b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 103b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ~ProcessMetrics(); 104b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 105b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Creates a ProcessMetrics for the specified process. 106b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // The caller owns the returned object. 107b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if !defined(OS_MACOSX) || defined(OS_IOS) 108b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static ProcessMetrics* CreateProcessMetrics(ProcessHandle process); 109b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#else 110b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 111b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // The port provider needs to outlive the ProcessMetrics object returned by 112b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // this function. If NULL is passed as provider, the returned object 113b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // only returns valid metrics if |process| is the current process. 114b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static ProcessMetrics* CreateProcessMetrics(ProcessHandle process, 115b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat PortProvider* port_provider); 116b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif // !defined(OS_MACOSX) || defined(OS_IOS) 117b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1180d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // Creates a ProcessMetrics for the current process. This a cross-platform 1190d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // convenience wrapper for CreateProcessMetrics(). 1200d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // The caller owns the returned object. 1210d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko static ProcessMetrics* CreateCurrentProcessMetrics(); 1220d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 123b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Returns the current space allocated for the pagefile, in bytes (these pages 124b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // may or may not be in memory). On Linux, this returns the total virtual 125b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // memory size. 126b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t GetPagefileUsage() const; 127b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Returns the peak space allocated for the pagefile, in bytes. 128b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t GetPeakPagefileUsage() const; 129b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Returns the current working set size, in bytes. On Linux, this returns 130b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // the resident set size. 131b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t GetWorkingSetSize() const; 132b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Returns the peak working set size, in bytes. 133b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t GetPeakWorkingSetSize() const; 134b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Returns private and sharedusage, in bytes. Private bytes is the amount of 135b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // memory currently allocated to a process that cannot be shared. Returns 136b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // false on platform specific error conditions. Note: |private_bytes| 137b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // returns 0 on unsupported OSes: prior to XP SP2. 138b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool GetMemoryBytes(size_t* private_bytes, 139b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t* shared_bytes); 140b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Fills a CommittedKBytes with both resident and paged 141b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // memory usage as per definition of CommittedBytes. 142b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void GetCommittedKBytes(CommittedKBytes* usage) const; 143b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Fills a WorkingSetKBytes containing resident private and shared memory 1440d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // usage in bytes, as per definition of WorkingSetBytes. Note that this 1450d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // function is somewhat expensive on Windows (a few ms per process). 146b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool GetWorkingSetKBytes(WorkingSetKBytes* ws_usage) const; 147b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 148b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_MACOSX) 149b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Fills both CommitedKBytes and WorkingSetKBytes in a single operation. This 150b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // is more efficient on Mac OS X, as the two can be retrieved with a single 151b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // system call. 152b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool GetCommittedAndWorkingSetKBytes(CommittedKBytes* usage, 153b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat WorkingSetKBytes* ws_usage) const; 154b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 155b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 156b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Returns the CPU usage in percent since the last time this method or 157b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // GetPlatformIndependentCPUUsage() was called. The first time this method 158b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // is called it returns 0 and will return the actual CPU info on subsequent 159b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // calls. On Windows, the CPU usage value is for all CPUs. So if you have 160b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // 2 CPUs and your process is using all the cycles of 1 CPU and not the other 161b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // CPU, this method returns 50. 162b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat double GetCPUUsage(); 163b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 164b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Returns the number of average idle cpu wakeups per second since the last 165b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // call. 166b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int GetIdleWakeupsPerSecond(); 167b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 168b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Same as GetCPUUsage(), but will return consistent values on all platforms 169b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // (cancelling the Windows exception mentioned above) by returning a value in 170b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // the range of 0 to (100 * numCPUCores) everywhere. 171b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat double GetPlatformIndependentCPUUsage(); 172b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 173b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Retrieves accounting information for all I/O operations performed by the 174b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // process. 175b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // If IO information is retrieved successfully, the function returns true 176b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // and fills in the IO_COUNTERS passed in. The function returns false 177b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // otherwise. 178b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool GetIOCounters(IoCounters* io_counters) const; 179b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1800d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#if defined(OS_LINUX) 1810d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // Returns the number of file descriptors currently open by the process, or 1820d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // -1 on error. 1830d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko int GetOpenFdCount() const; 1840d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#endif // defined(OS_LINUX) 1850d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 186b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private: 187b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if !defined(OS_MACOSX) || defined(OS_IOS) 188b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat explicit ProcessMetrics(ProcessHandle process); 189b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#else 190b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ProcessMetrics(ProcessHandle process, PortProvider* port_provider); 191b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif // !defined(OS_MACOSX) || defined(OS_IOS) 192b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 193b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_LINUX) || defined(OS_ANDROID) 194b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool GetWorkingSetKBytesStatm(WorkingSetKBytes* ws_usage) const; 195b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 196b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 197b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_CHROMEOS) 198b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool GetWorkingSetKBytesTotmaps(WorkingSetKBytes *ws_usage) const; 199b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 200b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 201b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_MACOSX) || defined(OS_LINUX) 2020d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko int CalculateIdleWakeupsPerSecond(uint64_t absolute_idle_wakeups); 203b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 204b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 205b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ProcessHandle process_; 206b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 207b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int processor_count_; 208b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 209b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Used to store the previous times and CPU usage counts so we can 210b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // compute the CPU usage between calls. 211b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeTicks last_cpu_time_; 2120d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko int64_t last_system_time_; 213b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 214b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_MACOSX) || defined(OS_LINUX) 215b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Same thing for idle wakeups. 216b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TimeTicks last_idle_wakeups_time_; 2170d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko uint64_t last_absolute_idle_wakeups_; 218b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 219b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 220b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if !defined(OS_IOS) 221b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_MACOSX) 222b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Queries the port provider if it's set. 223b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat mach_port_t TaskForPid(ProcessHandle process) const; 224b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 225b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat PortProvider* port_provider_; 226b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#elif defined(OS_POSIX) 227b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Jiffie count at the last_cpu_time_ we updated. 228b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int last_cpu_; 229b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif // defined(OS_POSIX) 230b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif // !defined(OS_IOS) 231b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 232b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DISALLOW_COPY_AND_ASSIGN(ProcessMetrics); 233b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 234b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 235b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Returns the memory committed by the system in KBytes. 236b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Returns 0 if it can't compute the commit charge. 237b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBASE_EXPORT size_t GetSystemCommitCharge(); 238b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 23994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// Returns the number of bytes in a memory page. Do not use this to compute 24094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// the number of pages in a block of memory for calling mincore(). On some 24194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// platforms, e.g. iOS, mincore() uses a different page size from what is 24294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// returned by GetPageSize(). 243b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBASE_EXPORT size_t GetPageSize(); 244b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 245b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_POSIX) 246b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Returns the maximum number of file descriptors that can be open by a process 247b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// at once. If the number is unavailable, a conservative best guess is returned. 248b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBASE_EXPORT size_t GetMaxFds(); 249b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 250b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Sets the file descriptor soft limit to |max_descriptors| or the OS hard 251b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// limit, whichever is lower. 252b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBASE_EXPORT void SetFdLimit(unsigned int max_descriptors); 253b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif // defined(OS_POSIX) 254b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2550d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \ 2560d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko defined(OS_ANDROID) 2570d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Data about system-wide memory consumption. Values are in KB. Available on 2580d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Windows, Mac, Linux, Android and Chrome OS. 2590d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// 2600d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Total/free memory are available on all platforms that implement 2610d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// GetSystemMemoryInfo(). Total/free swap memory are available on all platforms 2620d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// except on Mac. Buffers/cached/active_anon/inactive_anon/active_file/ 2630d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// inactive_file/dirty/pswpin/pswpout/pgmajfault are available on 2640d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Linux/Android/Chrome OS. Shmem/slab/gem_objects/gem_size are Chrome OS only. 265b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstruct BASE_EXPORT SystemMemoryInfoKB { 266b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SystemMemoryInfoKB(); 26745779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko SystemMemoryInfoKB(const SystemMemoryInfoKB& other); 268b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 269b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Serializes the platform specific fields to value. 27094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<Value> ToValue() const; 271b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 272b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int total; 273b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int free; 2740d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 2750d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#if !defined(OS_MACOSX) 2760d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko int swap_total; 2770d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko int swap_free; 2780d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#endif 2790d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 2800d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#if defined(OS_ANDROID) || defined(OS_LINUX) 281b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int buffers; 282b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int cached; 283b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int active_anon; 284b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int inactive_anon; 285b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int active_file; 286b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int inactive_file; 287b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int dirty; 288b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 289b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // vmstats data. 290b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int pswpin; 291b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int pswpout; 292b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int pgmajfault; 2930d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#endif // defined(OS_ANDROID) || defined(OS_LINUX) 294b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2950d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#if defined(OS_CHROMEOS) 296b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int shmem; 297b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int slab; 298b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Gem data will be -1 if not supported. 299b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int gem_objects; 300b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat long long gem_size; 3010d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#endif // defined(OS_CHROMEOS) 302b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 303b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 3040d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// On Linux/Android/Chrome OS, system-wide memory consumption data is parsed 3050d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// from /proc/meminfo and /proc/vmstat. On Windows/Mac, it is obtained using 3060d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// system API calls. 3070d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// 3080d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Fills in the provided |meminfo| structure. Returns true on success. 3090d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Exposed for memory debugging widget. 3100d205d712abd16eeed2f5d5b1052a367d23a223fAlex VakulenkoBASE_EXPORT bool GetSystemMemoryInfo(SystemMemoryInfoKB* meminfo); 3110d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 3120d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#endif // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || 3130d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko // defined(OS_ANDROID) 3140d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 3150d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#if defined(OS_LINUX) || defined(OS_ANDROID) 3160d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Parse the data found in /proc/<pid>/stat and return the sum of the 3170d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// CPU-related ticks. Returns -1 on parse error. 3180d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Exposed for testing. 3190d205d712abd16eeed2f5d5b1052a367d23a223fAlex VakulenkoBASE_EXPORT int ParseProcStatCPU(const std::string& input); 3200d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 3210d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Get the number of threads of |process| as available in /proc/<pid>/stat. 3220d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// This should be used with care as no synchronization with running threads is 3230d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// done. This is mostly useful to guarantee being single-threaded. 3240d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Returns 0 on failure. 3250d205d712abd16eeed2f5d5b1052a367d23a223fAlex VakulenkoBASE_EXPORT int GetNumberOfThreads(ProcessHandle process); 3260d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 3270d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// /proc/self/exe refers to the current executable. 3280d205d712abd16eeed2f5d5b1052a367d23a223fAlex VakulenkoBASE_EXPORT extern const char kProcSelfExe[]; 3290d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 330b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Parses a string containing the contents of /proc/meminfo 331b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// returns true on success or false for a parsing error 332b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBASE_EXPORT bool ParseProcMeminfo(const std::string& input, 333b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SystemMemoryInfoKB* meminfo); 334b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 335b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Parses a string containing the contents of /proc/vmstat 336b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// returns true on success or false for a parsing error 337b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBASE_EXPORT bool ParseProcVmstat(const std::string& input, 338b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SystemMemoryInfoKB* meminfo); 339b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 340b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Data from /proc/diskstats about system-wide disk I/O. 341b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstruct BASE_EXPORT SystemDiskInfo { 342b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SystemDiskInfo(); 34345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko SystemDiskInfo(const SystemDiskInfo& other); 344b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 345b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Serializes the platform specific fields to value. 34694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<Value> ToValue() const; 347b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 3480d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko uint64_t reads; 3490d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko uint64_t reads_merged; 3500d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko uint64_t sectors_read; 3510d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko uint64_t read_time; 3520d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko uint64_t writes; 3530d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko uint64_t writes_merged; 3540d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko uint64_t sectors_written; 3550d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko uint64_t write_time; 3560d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko uint64_t io; 3570d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko uint64_t io_time; 3580d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko uint64_t weighted_io_time; 359b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 360b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 361b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Checks whether the candidate string is a valid disk name, [hsv]d[a-z]+ 362b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// for a generic disk or mmcblk[0-9]+ for the MMC case. 363b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Names of disk partitions (e.g. sda1) are not valid. 364b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBASE_EXPORT bool IsValidDiskName(const std::string& candidate); 365b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 366b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Retrieves data from /proc/diskstats about system-wide disk I/O. 367b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Fills in the provided |diskinfo| structure. Returns true on success. 368b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBASE_EXPORT bool GetSystemDiskInfo(SystemDiskInfo* diskinfo); 369b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif // defined(OS_LINUX) || defined(OS_ANDROID) 370b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 371b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_CHROMEOS) 372b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Data from files in directory /sys/block/zram0 about ZRAM usage. 373b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstruct BASE_EXPORT SwapInfo { 374b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SwapInfo() 375b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat : num_reads(0), 376b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat num_writes(0), 377b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat compr_data_size(0), 378b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat orig_data_size(0), 379b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat mem_used_total(0) { 380b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 381b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 382b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Serializes the platform specific fields to value. 38394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<Value> ToValue() const; 384b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 3850d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko uint64_t num_reads; 3860d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko uint64_t num_writes; 3870d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko uint64_t compr_data_size; 3880d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko uint64_t orig_data_size; 3890d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko uint64_t mem_used_total; 390b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 391b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 392b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// In ChromeOS, reads files from /sys/block/zram0 that contain ZRAM usage data. 393b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Fills in the provided |swap_data| structure. 394b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratBASE_EXPORT void GetSwapInfo(SwapInfo* swap_info); 395b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif // defined(OS_CHROMEOS) 396b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 397b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Collects and holds performance metrics for system memory and disk. 398b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Provides functionality to retrieve the data on various platforms and 399b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// to serialize the stored data. 400b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass SystemMetrics { 401b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 402b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SystemMetrics(); 403b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 404b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static SystemMetrics Sample(); 405b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 406b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Serializes the system metrics to value. 40794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<Value> ToValue() const; 408b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 409b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private: 410b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat FRIEND_TEST_ALL_PREFIXES(SystemMetricsTest, SystemMetrics); 411b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 412b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat size_t committed_memory_; 413b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_LINUX) || defined(OS_ANDROID) 414b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SystemMemoryInfoKB memory_info_; 415b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SystemDiskInfo disk_info_; 416b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 417b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#if defined(OS_CHROMEOS) 418b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SwapInfo swap_info_; 419b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif 420b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 421b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 422b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace base 423b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 424b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif // BASE_PROCESS_PROCESS_METRICS_H_ 425