process_metrics_openbsd.cc 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. // Copyright (c) 2013 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "butil/process/process_metrics.h"
  5. #include <sys/param.h>
  6. #include <sys/sysctl.h>
  7. namespace butil {
  8. // static
  9. ProcessMetrics* ProcessMetrics::CreateProcessMetrics(ProcessHandle process) {
  10. return new ProcessMetrics(process);
  11. }
  12. size_t ProcessMetrics::GetPagefileUsage() const {
  13. struct kinfo_proc info;
  14. size_t length;
  15. int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, process_,
  16. sizeof(struct kinfo_proc), 0 };
  17. if (sysctl(mib, arraysize(mib), NULL, &length, NULL, 0) < 0)
  18. return -1;
  19. mib[5] = (length / sizeof(struct kinfo_proc));
  20. if (sysctl(mib, arraysize(mib), &info, &length, NULL, 0) < 0)
  21. return -1;
  22. return (info.p_vm_tsize + info.p_vm_dsize + info.p_vm_ssize);
  23. }
  24. size_t ProcessMetrics::GetPeakPagefileUsage() const {
  25. return 0;
  26. }
  27. size_t ProcessMetrics::GetWorkingSetSize() const {
  28. struct kinfo_proc info;
  29. size_t length;
  30. int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, process_,
  31. sizeof(struct kinfo_proc), 0 };
  32. if (sysctl(mib, arraysize(mib), NULL, &length, NULL, 0) < 0)
  33. return -1;
  34. mib[5] = (length / sizeof(struct kinfo_proc));
  35. if (sysctl(mib, arraysize(mib), &info, &length, NULL, 0) < 0)
  36. return -1;
  37. return info.p_vm_rssize * getpagesize();
  38. }
  39. size_t ProcessMetrics::GetPeakWorkingSetSize() const {
  40. return 0;
  41. }
  42. bool ProcessMetrics::GetMemoryBytes(size_t* private_bytes,
  43. size_t* shared_bytes) {
  44. WorkingSetKBytes ws_usage;
  45. if (!GetWorkingSetKBytes(&ws_usage))
  46. return false;
  47. if (private_bytes)
  48. *private_bytes = ws_usage.priv << 10;
  49. if (shared_bytes)
  50. *shared_bytes = ws_usage.shared * 1024;
  51. return true;
  52. }
  53. bool ProcessMetrics::GetWorkingSetKBytes(WorkingSetKBytes* ws_usage) const {
  54. // TODO(bapt): be sure we can't be precise
  55. size_t priv = GetWorkingSetSize();
  56. if (!priv)
  57. return false;
  58. ws_usage->priv = priv / 1024;
  59. ws_usage->shareable = 0;
  60. ws_usage->shared = 0;
  61. return true;
  62. }
  63. bool ProcessMetrics::GetIOCounters(IoCounters* io_counters) const {
  64. return false;
  65. }
  66. static int GetProcessCPU(pid_t pid) {
  67. struct kinfo_proc info;
  68. size_t length;
  69. int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, pid,
  70. sizeof(struct kinfo_proc), 0 };
  71. if (sysctl(mib, arraysize(mib), NULL, &length, NULL, 0) < 0)
  72. return -1;
  73. mib[5] = (length / sizeof(struct kinfo_proc));
  74. if (sysctl(mib, arraysize(mib), &info, &length, NULL, 0) < 0)
  75. return 0;
  76. return info.p_pctcpu;
  77. }
  78. double ProcessMetrics::GetCPUUsage() {
  79. TimeTicks time = TimeTicks::Now();
  80. if (last_cpu_ == 0) {
  81. // First call, just set the last values.
  82. last_cpu_time_ = time;
  83. last_cpu_ = GetProcessCPU(process_);
  84. return 0;
  85. }
  86. int64_t time_delta = (time - last_cpu_time_).InMicroseconds();
  87. DCHECK_NE(time_delta, 0);
  88. if (time_delta == 0)
  89. return 0;
  90. int cpu = GetProcessCPU(process_);
  91. last_cpu_time_ = time;
  92. last_cpu_ = cpu;
  93. double percentage = static_cast<double>((cpu * 100.0) / FSCALE);
  94. return percentage;
  95. }
  96. ProcessMetrics::ProcessMetrics(ProcessHandle process)
  97. : process_(process),
  98. last_system_time_(0),
  99. last_cpu_(0) {
  100. processor_count_ = butil::SysInfo::NumberOfProcessors();
  101. }
  102. size_t GetSystemCommitCharge() {
  103. int mib[] = { CTL_VM, VM_METER };
  104. int pagesize;
  105. struct vmtotal vmtotal;
  106. unsigned long mem_total, mem_free, mem_inactive;
  107. size_t len = sizeof(vmtotal);
  108. if (sysctl(mib, arraysize(mib), &vmtotal, &len, NULL, 0) < 0)
  109. return 0;
  110. mem_total = vmtotal.t_vm;
  111. mem_free = vmtotal.t_free;
  112. mem_inactive = vmtotal.t_vm - vmtotal.t_avm;
  113. pagesize = getpagesize();
  114. return mem_total - (mem_free*pagesize) - (mem_inactive*pagesize);
  115. }
  116. } // namespace butil