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

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: Changing members' names 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 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 } 140 }
139 iter = params.find(kMaxRendererProcessesEnabledParam); 141 iter = params.find(kMaxRendererProcessesEnabledParam);
140 if (iter == params.end() || 142 if (iter == params.end() ||
141 !base::StringToInt(iter->second, max_renderer_processes_enabled)) { 143 !base::StringToInt(iter->second, max_renderer_processes_enabled)) {
142 *max_renderer_processes_enabled = kDefaultNumProcessesEnabled; 144 *max_renderer_processes_enabled = kDefaultNumProcessesEnabled;
143 } 145 }
144 } 146 }
145 147
146 } // namespace 148 } // namespace
147 149
150 LeakDetectorController::TotalMemoryGrowthTracker::TotalMemoryGrowthTracker()
Alexei Svitkine (slow) 2016/10/11 16:47:47 Nit: Order these same as in the .h file in relatio
mwlodar 2016/10/12 21:50:51 Done.
151 : total_usage_kb_(0) {
152 }
153
154 LeakDetectorController::TotalMemoryGrowthTracker::~TotalMemoryGrowthTracker() {
155 }
156
157 bool LeakDetectorController::TotalMemoryGrowthTracker::UpdateSample(
158 base::ProcessId pid, int sample, int* diff) {
159 total_usage_kb_ += sample;
160 return false;
161 }
162
148 LeakDetectorController::LeakDetectorController() 163 LeakDetectorController::LeakDetectorController()
149 : params_(GetLeakDetectorParams()), 164 : params_(GetLeakDetectorParams()),
150 browser_process_enable_probability_(0), 165 browser_process_enable_probability_(0),
151 renderer_process_enable_probability_(0), 166 renderer_process_enable_probability_(0),
152 max_renderer_processes_with_leak_detector_enabled_(0), 167 max_renderer_processes_with_leak_detector_enabled_(0),
153 num_renderer_processes_with_leak_detector_enabled_(0) { 168 num_renderer_processes_with_leak_detector_enabled_(0),
169 enable_collect_memory_usage_step_(true),
170 waiting_for_collect_memory_usage_step_(false),
171 weak_ptr_factory_(this) {
154 // Read the build ID once and store it. 172 // Read the build ID once and store it.
155 leak_detector::gnu_build_id_reader::ReadBuildID(&build_id_); 173 leak_detector::gnu_build_id_reader::ReadBuildID(&build_id_);
156 174
157 GetLeakDetectorEnableParams( 175 GetLeakDetectorEnableParams(
158 &browser_process_enable_probability_, 176 &browser_process_enable_probability_,
159 &renderer_process_enable_probability_, 177 &renderer_process_enable_probability_,
160 &max_renderer_processes_with_leak_detector_enabled_); 178 &max_renderer_processes_with_leak_detector_enabled_);
161 179
162 // Register the LeakDetectorController with the remote controller, so this 180 // Register the LeakDetectorController with the remote controller, so this
163 // class can send/receive data to/from remote processes. 181 // class can send/receive data to/from remote processes.
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 --num_renderer_processes_with_leak_detector_enabled_; 232 --num_renderer_processes_with_leak_detector_enabled_;
215 } 233 }
216 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 the same as in
276 // ChromeMetricsServiceClient. As a side effect, the histogram
277 // data is generated.
Alexei Svitkine (slow) 2016/10/11 16:47:48 I don't think we want this to be the case. The met
mwlodar 2016/10/11 20:08:09 I can, however I would have to modify the interfac
mwlodar 2016/10/12 21:50:51 Done.
278 base::Closure callback = base::Bind(
279 &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->StartFetch();
285 }
286
229 for (const auto& report : reports) { 287 for (const auto& report : reports) {
230 // Store the report and insert stored parameters. 288 // Store the report and insert stored parameters.
231 stored_reports_.push_back(report); 289 stored_reports_.push_back(report);
232 stored_reports_.back().mutable_params()->CopyFrom(params_); 290 stored_reports_.back().mutable_params()->CopyFrom(params_);
233 stored_reports_.back().set_source_process(process_type); 291 stored_reports_.back().set_source_process(process_type);
234 stored_reports_.back().mutable_build_id()->assign(build_id_.begin(), 292 stored_reports_.back().mutable_build_id()->assign(build_id_.begin(),
235 build_id_.end()); 293 build_id_.end());
236 } 294 }
237 } 295 }
238 296
239 } // namespace metrics 297 } // namespace metrics
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698