Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(109)

Side by Side Diff: chrome/browser/metrics/leak_detector/leak_detector_controller.cc

Issue 2396743002: Leak reports collect information about the memory usage (Closed)
Patch Set: Added setter for |generate_histograms_| Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/metrics/leak_detector/leak_detector_controller.h" 5 #include "chrome/browser/metrics/leak_detector/leak_detector_controller.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/weak_ptr.h"
10 #include "base/rand_util.h" 11 #include "base/rand_util.h"
11 #include "base/strings/string_number_conversions.h" 12 #include "base/strings/string_number_conversions.h"
13 #include "base/sys_info.h"
12 #include "components/metrics/leak_detector/gnu_build_id_reader.h" 14 #include "components/metrics/leak_detector/gnu_build_id_reader.h"
13 #include "components/variations/variations_associated_data.h" 15 #include "components/variations/variations_associated_data.h"
14 #include "content/public/browser/browser_thread.h" 16 #include "content/public/browser/browser_thread.h"
15 17
16 namespace metrics { 18 namespace metrics {
17 19
18 namespace { 20 namespace {
19 21
20 using ParamsMap = std::map<std::string, std::string>; 22 using ParamsMap = std::map<std::string, std::string>;
21 23
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 } 145 }
144 } 146 }
145 147
146 } // namespace 148 } // namespace
147 149
148 LeakDetectorController::LeakDetectorController() 150 LeakDetectorController::LeakDetectorController()
149 : params_(GetLeakDetectorParams()), 151 : params_(GetLeakDetectorParams()),
150 browser_process_enable_probability_(0), 152 browser_process_enable_probability_(0),
151 renderer_process_enable_probability_(0), 153 renderer_process_enable_probability_(0),
152 max_renderer_processes_with_leak_detector_enabled_(0), 154 max_renderer_processes_with_leak_detector_enabled_(0),
153 num_renderer_processes_with_leak_detector_enabled_(0) { 155 num_renderer_processes_with_leak_detector_enabled_(0),
156 enable_collect_memory_usage_step_(true),
157 waiting_for_collect_memory_usage_step_(false),
158 weak_ptr_factory_(this) {
154 // Read the build ID once and store it. 159 // Read the build ID once and store it.
155 leak_detector::gnu_build_id_reader::ReadBuildID(&build_id_); 160 leak_detector::gnu_build_id_reader::ReadBuildID(&build_id_);
156 161
157 GetLeakDetectorEnableParams( 162 GetLeakDetectorEnableParams(
158 &browser_process_enable_probability_, 163 &browser_process_enable_probability_,
159 &renderer_process_enable_probability_, 164 &renderer_process_enable_probability_,
160 &max_renderer_processes_with_leak_detector_enabled_); 165 &max_renderer_processes_with_leak_detector_enabled_);
161 166
162 // Register the LeakDetectorController with the remote controller, so this 167 // Register the LeakDetectorController with the remote controller, so this
163 // class can send/receive data to/from remote processes. 168 // class can send/receive data to/from remote processes.
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 void LeakDetectorController::SendLeakReports( 212 void LeakDetectorController::SendLeakReports(
208 const std::vector<MemoryLeakReportProto>& reports) { 213 const std::vector<MemoryLeakReportProto>& reports) {
209 StoreLeakReports(reports, MemoryLeakReportProto::RENDERER_PROCESS); 214 StoreLeakReports(reports, MemoryLeakReportProto::RENDERER_PROCESS);
210 } 215 }
211 216
212 void LeakDetectorController::OnRemoteProcessShutdown() { 217 void LeakDetectorController::OnRemoteProcessShutdown() {
213 DCHECK_GT(num_renderer_processes_with_leak_detector_enabled_, 0); 218 DCHECK_GT(num_renderer_processes_with_leak_detector_enabled_, 0);
214 --num_renderer_processes_with_leak_detector_enabled_; 219 --num_renderer_processes_with_leak_detector_enabled_;
215 } 220 }
216 221
222 LeakDetectorController::TotalMemoryGrowthTracker::TotalMemoryGrowthTracker()
223 : total_usage_kb_(0) {}
224
225 LeakDetectorController::TotalMemoryGrowthTracker::~TotalMemoryGrowthTracker() {}
226
227 bool LeakDetectorController::TotalMemoryGrowthTracker::UpdateSample(
228 base::ProcessId pid,
229 int sample,
230 int* diff) {
231 total_usage_kb_ += sample;
232 return false;
233 }
234
217 bool LeakDetectorController::ShouldRandomlyEnableLeakDetectorOnRendererProcess() 235 bool LeakDetectorController::ShouldRandomlyEnableLeakDetectorOnRendererProcess()
218 const { 236 const {
219 return base::RandDouble() < renderer_process_enable_probability_ && 237 return base::RandDouble() < renderer_process_enable_probability_ &&
220 num_renderer_processes_with_leak_detector_enabled_ < 238 num_renderer_processes_with_leak_detector_enabled_ <
221 max_renderer_processes_with_leak_detector_enabled_; 239 max_renderer_processes_with_leak_detector_enabled_;
222 } 240 }
223 241
242 void LeakDetectorController::OnMemoryDetailCollectionDone(size_t index) {
243 DCHECK(thread_checker_.CalledOnValidThread());
244 DCHECK(waiting_for_collect_memory_usage_step_);
245 waiting_for_collect_memory_usage_step_ = false;
246
247 // The available physical memory must be translated from bytes
248 // and the total memory usage must be translated from kb.
249 MemoryLeakReportProto::MemoryUsageInfo mem_info;
250 mem_info.set_available_ram_mb(
251 base::SysInfo::AmountOfAvailablePhysicalMemory() / 1024 / 1024);
252 mem_info.set_chrome_ram_usage_mb(
253 total_memory_growth_tracker_.total_usage_kb() / 1024);
254
255 // Update all reports that arrived in the meantime.
256 for (; index < stored_reports_.size(); index++) {
257 stored_reports_[index].mutable_memory_usage_info()->CopyFrom(mem_info);
258 }
259 }
260
224 void LeakDetectorController::StoreLeakReports( 261 void LeakDetectorController::StoreLeakReports(
225 const std::vector<MemoryLeakReportProto>& reports, 262 const std::vector<MemoryLeakReportProto>& reports,
226 MemoryLeakReportProto::ProcessType process_type) { 263 MemoryLeakReportProto::ProcessType process_type) {
227 DCHECK(thread_checker_.CalledOnValidThread()); 264 DCHECK(thread_checker_.CalledOnValidThread());
228 265
266 // Postpone a task of collecting info about the memory usage.
267 // When the task is done, all reports collected after this point
268 // will be updated, unless GetLeakReports() gets called first.
269 if (enable_collect_memory_usage_step_ &&
270 !waiting_for_collect_memory_usage_step_) {
271 waiting_for_collect_memory_usage_step_ = true;
272
273 total_memory_growth_tracker_.reset();
274
275 // Idea of using MetricsMemoryDetails is similar as in
276 // ChromeMetricsServiceClient. However, here generation of histogram data
277 // is suppressed.
278 base::Closure callback =
279 base::Bind(&LeakDetectorController::OnMemoryDetailCollectionDone,
280 weak_ptr_factory_.GetWeakPtr(), stored_reports_.size());
281
282 scoped_refptr<MetricsMemoryDetails> details(
283 new MetricsMemoryDetails(callback, &total_memory_growth_tracker_));
284 details->set_generate_histograms(false);
285 details->StartFetch();
286 }
287
229 for (const auto& report : reports) { 288 for (const auto& report : reports) {
230 // Store the report and insert stored parameters. 289 // Store the report and insert stored parameters.
231 stored_reports_.push_back(report); 290 stored_reports_.push_back(report);
232 stored_reports_.back().mutable_params()->CopyFrom(params_); 291 stored_reports_.back().mutable_params()->CopyFrom(params_);
233 stored_reports_.back().set_source_process(process_type); 292 stored_reports_.back().set_source_process(process_type);
234 stored_reports_.back().mutable_build_id()->assign(build_id_.begin(), 293 stored_reports_.back().mutable_build_id()->assign(build_id_.begin(),
235 build_id_.end()); 294 build_id_.end());
236 } 295 }
237 } 296 }
238 297
239 } // namespace metrics 298 } // namespace metrics
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698