1 // Copyright 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.
7 #include "base/logging.h"
8 #include "base/metrics/histogram.h"
9 #include "base/process/process_metrics.h"
11 #include "chrome/browser/performance_monitor/constants.h"
12 #include "chrome/browser/performance_monitor/process_metrics_history.h"
13 #if defined(OS_MACOSX)
14 #include "content/public/browser/browser_child_process_host.h"
16 #include "content/public/common/process_type.h"
18 namespace performance_monitor
{
20 ProcessMetricsHistory::ProcessMetricsHistory()
22 process_type_(content::PROCESS_TYPE_UNKNOWN
),
23 last_update_sequence_(0) {
27 ProcessMetricsHistory::~ProcessMetricsHistory() {}
29 void ProcessMetricsHistory::ResetCounters() {
30 min_cpu_usage_
= std::numeric_limits
<double>::max();
31 accumulated_cpu_usage_
= 0.0;
32 accumulated_private_bytes_
= 0;
33 accumulated_shared_bytes_
= 0;
37 void ProcessMetricsHistory::Initialize(base::ProcessHandle process_handle
,
39 int initial_update_sequence
) {
40 DCHECK(process_handle_
== 0);
41 process_handle_
= process_handle
;
42 process_type_
= process_type
;
43 last_update_sequence_
= initial_update_sequence
;
45 #if defined(OS_MACOSX)
46 process_metrics_
.reset(base::ProcessMetrics::CreateProcessMetrics(
47 process_handle_
, content::BrowserChildProcessHost::GetPortProvider()));
49 process_metrics_
.reset(
50 base::ProcessMetrics::CreateProcessMetrics(process_handle_
));
54 void ProcessMetricsHistory::SampleMetrics() {
55 double cpu_usage
= process_metrics_
->GetPlatformIndependentCPUUsage();
56 min_cpu_usage_
= std::min(min_cpu_usage_
, cpu_usage
);
57 accumulated_cpu_usage_
+= cpu_usage
;
59 size_t private_bytes
= 0;
60 size_t shared_bytes
= 0;
61 if (!process_metrics_
->GetMemoryBytes(&private_bytes
, &shared_bytes
))
62 LOG(WARNING
) << "GetMemoryBytes returned NULL (platform-specific error)";
64 accumulated_private_bytes_
+= private_bytes
;
65 accumulated_shared_bytes_
+= shared_bytes
;
70 void ProcessMetricsHistory::EndOfCycle() {
71 RunPerformanceTriggers();
75 void ProcessMetricsHistory::RunPerformanceTriggers() {
76 // As an initial step, we only care about browser processes.
77 if (process_type_
!= content::PROCESS_TYPE_BROWSER
|| sample_count_
== 0)
80 // We scale up to the equivalent of 64 CPU cores fully loaded. More than this
81 // doesn't really matter, as we're already in a terrible place.
82 UMA_HISTOGRAM_CUSTOM_COUNTS("PerformanceMonitor.AverageCPU.BrowserProcess",
83 accumulated_cpu_usage_
/ sample_count_
,
86 // If CPU usage has consistently been above our threshold,
87 // we *may* have an issue.
88 if (min_cpu_usage_
> kHighCPUUtilizationThreshold
)
89 UMA_HISTOGRAM_BOOLEAN("PerformanceMonitor.HighCPU.BrowserProcess", true);
92 } // namespace performance_monitor