Index: chrome/browser/memory_details.cc |
diff --git a/chrome/browser/memory_details.cc b/chrome/browser/memory_details.cc |
index b2d22fbb67c4f0c17a20b5cabb9d7f39bd899dc9..9d77541804fe59ddcf08230bf2f33632973bad3b 100644 |
--- a/chrome/browser/memory_details.cc |
+++ b/chrome/browser/memory_details.cc |
@@ -4,6 +4,9 @@ |
#include "chrome/browser/memory_details.h" |
+#include <algorithm> |
+#include <set> |
Ilya Sherman
2015/01/16 04:57:36
nit: Are these just fixing pre-existing IWYU viola
Alexei Svitkine (slow)
2015/01/16 16:07:49
Yep, as suggested by git cl lint.
|
+ |
#include "base/bind.h" |
#include "base/file_version_info.h" |
#include "base/metrics/histogram.h" |
@@ -114,41 +117,6 @@ ProcessData& ProcessData::operator=(const ProcessData& rhs) { |
return *this; |
} |
-MemoryGrowthTracker::MemoryGrowthTracker() {} |
- |
-MemoryGrowthTracker::~MemoryGrowthTracker() {} |
- |
-bool MemoryGrowthTracker::UpdateSample( |
- base::ProcessId pid, |
- int sample, |
- int* diff) { |
- // |sample| is memory usage in kB. |
- const base::TimeTicks current_time = base::TimeTicks::Now(); |
- std::map<base::ProcessId, int>::iterator found_size = memory_sizes_.find(pid); |
- if (found_size != memory_sizes_.end()) { |
- const int last_size = found_size->second; |
- std::map<base::ProcessId, base::TimeTicks>::iterator found_time = |
- times_.find(pid); |
- const base::TimeTicks last_time = found_time->second; |
- if (last_time < (current_time - base::TimeDelta::FromMinutes(30))) { |
- // Note that it is undefined how division of a negative integer gets |
- // rounded. |*diff| may have a difference of 1 from the correct number |
- // if |sample| < |last_size|. We ignore it as 1 is small enough. |
- *diff = ((sample - last_size) * 30 / |
- (current_time - last_time).InMinutes()); |
- found_size->second = sample; |
- found_time->second = current_time; |
- return true; |
- } |
- // Skip if a last record is found less than 30 minutes ago. |
- } else { |
- // Not reporting if it's the first record for |pid|. |
- times_[pid] = current_time; |
- memory_sizes_[pid] = sample; |
- } |
- return false; |
-} |
- |
// About threading: |
// |
// This operation will hit no fewer than 3 threads. |
@@ -161,11 +129,10 @@ bool MemoryGrowthTracker::UpdateSample( |
// one task run for that long on the UI or IO threads. So, we run the |
// expensive parts of this operation over on the file thread. |
// |
-void MemoryDetails::StartFetch(UserMetricsMode user_metrics_mode) { |
+void MemoryDetails::StartFetch() { |
// This might get called from the UI or FILE threads, but should not be |
// getting called from the IO thread. |
DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- user_metrics_mode_ = user_metrics_mode; |
// In order to process this request, we need to use the plugin information. |
// However, plugin process information is only available from the IO thread. |
@@ -212,11 +179,6 @@ std::string MemoryDetails::ToLogString() { |
return log; |
} |
-void MemoryDetails::SetMemoryGrowthTracker( |
- MemoryGrowthTracker* memory_growth_tracker) { |
- memory_growth_tracker_ = memory_growth_tracker; |
-} |
- |
void MemoryDetails::CollectChildInfoOnIOThread() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
@@ -407,243 +369,5 @@ void MemoryDetails::CollectChildInfoOnUIThread() { |
} |
} |
- if (user_metrics_mode_ == UPDATE_USER_METRICS) |
- UpdateHistograms(); |
- |
OnDetailsAvailable(); |
} |
- |
-void MemoryDetails::UpdateHistograms() { |
- // Reports a set of memory metrics to UMA. |
- // Memory is measured in KB. |
- |
- const ProcessData& browser = *ChromeBrowser(); |
- size_t aggregate_memory = 0; |
- int chrome_count = 0; |
- int extension_count = 0; |
- int plugin_count = 0; |
- int pepper_plugin_count = 0; |
- int pepper_plugin_broker_count = 0; |
- int renderer_count = 0; |
- int other_count = 0; |
- int worker_count = 0; |
- int process_limit = content::RenderProcessHost::GetMaxRendererProcessCount(); |
- for (size_t index = 0; index < browser.processes.size(); index++) { |
- int sample = static_cast<int>(browser.processes[index].working_set.priv); |
- aggregate_memory += sample; |
- switch (browser.processes[index].process_type) { |
- case content::PROCESS_TYPE_BROWSER: |
- UMA_HISTOGRAM_MEMORY_KB("Memory.Browser", sample); |
- continue; |
- case content::PROCESS_TYPE_RENDERER: { |
- ProcessMemoryInformation::RendererProcessType renderer_type = |
- browser.processes[index].renderer_type; |
- switch (renderer_type) { |
- case ProcessMemoryInformation::RENDERER_EXTENSION: |
- UMA_HISTOGRAM_MEMORY_KB("Memory.Extension", sample); |
- extension_count++; |
- continue; |
- case ProcessMemoryInformation::RENDERER_CHROME: |
- UMA_HISTOGRAM_MEMORY_KB("Memory.Chrome", sample); |
- chrome_count++; |
- continue; |
- case ProcessMemoryInformation::RENDERER_UNKNOWN: |
- NOTREACHED() << "Unknown renderer process type."; |
- continue; |
- case ProcessMemoryInformation::RENDERER_NORMAL: |
- default: |
- // TODO(erikkay): Should we bother splitting out the other subtypes? |
- UMA_HISTOGRAM_MEMORY_KB("Memory.Renderer", sample); |
- int diff; |
- if (memory_growth_tracker_ && |
- memory_growth_tracker_->UpdateSample( |
- browser.processes[index].pid, sample, &diff)) { |
- if (diff < 0) |
- UMA_HISTOGRAM_MEMORY_KB("Memory.RendererShrinkIn30Min", -diff); |
- else |
- UMA_HISTOGRAM_MEMORY_KB("Memory.RendererGrowthIn30Min", diff); |
- } |
- renderer_count++; |
- continue; |
- } |
- } |
- case content::PROCESS_TYPE_PLUGIN: |
- UMA_HISTOGRAM_MEMORY_KB("Memory.Plugin", sample); |
- plugin_count++; |
- continue; |
- case content::PROCESS_TYPE_UTILITY: |
- UMA_HISTOGRAM_MEMORY_KB("Memory.Utility", sample); |
- other_count++; |
- continue; |
- case content::PROCESS_TYPE_ZYGOTE: |
- UMA_HISTOGRAM_MEMORY_KB("Memory.Zygote", sample); |
- other_count++; |
- continue; |
- case content::PROCESS_TYPE_SANDBOX_HELPER: |
- UMA_HISTOGRAM_MEMORY_KB("Memory.SandboxHelper", sample); |
- other_count++; |
- continue; |
- case content::PROCESS_TYPE_GPU: |
- UMA_HISTOGRAM_MEMORY_KB("Memory.Gpu", sample); |
- other_count++; |
- continue; |
-#if defined(ENABLE_PLUGINS) |
- case content::PROCESS_TYPE_PPAPI_PLUGIN: |
- { |
- const std::vector<base::string16>& titles = |
- browser.processes[index].titles; |
- if (titles.size() == 1 && |
- titles[0] == base::ASCIIToUTF16(content::kFlashPluginName)) { |
- UMA_HISTOGRAM_MEMORY_KB("Memory.PepperFlashPlugin", sample); |
- } |
- } |
- UMA_HISTOGRAM_MEMORY_KB("Memory.PepperPlugin", sample); |
- pepper_plugin_count++; |
- continue; |
- case content::PROCESS_TYPE_PPAPI_BROKER: |
- UMA_HISTOGRAM_MEMORY_KB("Memory.PepperPluginBroker", sample); |
- pepper_plugin_broker_count++; |
- continue; |
-#endif |
- case PROCESS_TYPE_NACL_LOADER: |
- UMA_HISTOGRAM_MEMORY_KB("Memory.NativeClient", sample); |
- other_count++; |
- continue; |
- case PROCESS_TYPE_NACL_BROKER: |
- UMA_HISTOGRAM_MEMORY_KB("Memory.NativeClientBroker", sample); |
- other_count++; |
- continue; |
- default: |
- NOTREACHED(); |
- continue; |
- } |
- } |
-#if defined(OS_CHROMEOS) |
- // Chrome OS exposes system-wide graphics driver memory which has historically |
- // been a source of leak/bloat. |
- base::SystemMemoryInfoKB meminfo; |
- if (base::GetSystemMemoryInfo(&meminfo) && meminfo.gem_size != -1) |
- UMA_HISTOGRAM_MEMORY_MB("Memory.Graphics", meminfo.gem_size / 1024 / 1024); |
-#endif |
- |
- UMA_HISTOGRAM_COUNTS_100("Memory.ProcessLimit", process_limit); |
- UMA_HISTOGRAM_COUNTS_100("Memory.ProcessCount", |
- static_cast<int>(browser.processes.size())); |
- UMA_HISTOGRAM_COUNTS_100("Memory.ChromeProcessCount", chrome_count); |
- UMA_HISTOGRAM_COUNTS_100("Memory.ExtensionProcessCount", extension_count); |
- UMA_HISTOGRAM_COUNTS_100("Memory.OtherProcessCount", other_count); |
- UMA_HISTOGRAM_COUNTS_100("Memory.PluginProcessCount", plugin_count); |
- UMA_HISTOGRAM_COUNTS_100("Memory.PepperPluginProcessCount", |
- pepper_plugin_count); |
- UMA_HISTOGRAM_COUNTS_100("Memory.PepperPluginBrokerProcessCount", |
- pepper_plugin_broker_count); |
- UMA_HISTOGRAM_COUNTS_100("Memory.RendererProcessCount", renderer_count); |
- UMA_HISTOGRAM_COUNTS_100("Memory.WorkerProcessCount", worker_count); |
- // TODO(viettrungluu): Do we want separate counts for the other |
- // (platform-specific) process types? |
- |
- int total_sample = static_cast<int>(aggregate_memory / 1000); |
- UMA_HISTOGRAM_MEMORY_MB("Memory.Total", total_sample); |
- |
-#if defined(OS_CHROMEOS) |
- UpdateSwapHistograms(); |
-#endif |
-} |
- |
-#if defined(OS_CHROMEOS) |
-void MemoryDetails::UpdateSwapHistograms() { |
- UMA_HISTOGRAM_BOOLEAN("Memory.Swap.HaveSwapped", swap_info_.num_writes > 0); |
- if (swap_info_.num_writes == 0) |
- return; |
- |
- // Only record swap info when any swaps have happened, to give us more |
- // detail in the histograms. |
- const ProcessData& browser = *ChromeBrowser(); |
- size_t aggregate_memory = 0; |
- for (size_t index = 0; index < browser.processes.size(); index++) { |
- int sample = static_cast<int>(browser.processes[index].working_set.swapped); |
- aggregate_memory += sample; |
- switch (browser.processes[index].process_type) { |
- case content::PROCESS_TYPE_BROWSER: |
- UMA_HISTOGRAM_MEMORY_KB("Memory.Swap.Browser", sample); |
- continue; |
- case content::PROCESS_TYPE_RENDERER: { |
- ProcessMemoryInformation::RendererProcessType renderer_type = |
- browser.processes[index].renderer_type; |
- switch (renderer_type) { |
- case ProcessMemoryInformation::RENDERER_EXTENSION: |
- UMA_HISTOGRAM_MEMORY_KB("Memory.Swap.Extension", sample); |
- continue; |
- case ProcessMemoryInformation::RENDERER_CHROME: |
- UMA_HISTOGRAM_MEMORY_KB("Memory.Swap.Chrome", sample); |
- continue; |
- case ProcessMemoryInformation::RENDERER_UNKNOWN: |
- NOTREACHED() << "Unknown renderer process type."; |
- continue; |
- case ProcessMemoryInformation::RENDERER_NORMAL: |
- default: |
- UMA_HISTOGRAM_MEMORY_KB("Memory.Swap.Renderer", sample); |
- continue; |
- } |
- } |
- case content::PROCESS_TYPE_PLUGIN: |
- UMA_HISTOGRAM_MEMORY_KB("Memory.Swap.Plugin", sample); |
- continue; |
- case content::PROCESS_TYPE_UTILITY: |
- UMA_HISTOGRAM_MEMORY_KB("Memory.Swap.Utility", sample); |
- continue; |
- case content::PROCESS_TYPE_ZYGOTE: |
- UMA_HISTOGRAM_MEMORY_KB("Memory.Swap.Zygote", sample); |
- continue; |
- case content::PROCESS_TYPE_SANDBOX_HELPER: |
- UMA_HISTOGRAM_MEMORY_KB("Memory.Swap.SandboxHelper", sample); |
- continue; |
- case content::PROCESS_TYPE_GPU: |
- UMA_HISTOGRAM_MEMORY_KB("Memory.Swap.Gpu", sample); |
- continue; |
- case content::PROCESS_TYPE_PPAPI_PLUGIN: |
- UMA_HISTOGRAM_MEMORY_KB("Memory.Swap.PepperPlugin", sample); |
- continue; |
- case content::PROCESS_TYPE_PPAPI_BROKER: |
- UMA_HISTOGRAM_MEMORY_KB("Memory.Swap.PepperPluginBroker", sample); |
- continue; |
- case PROCESS_TYPE_NACL_LOADER: |
- UMA_HISTOGRAM_MEMORY_KB("Memory.Swap.NativeClient", sample); |
- continue; |
- case PROCESS_TYPE_NACL_BROKER: |
- UMA_HISTOGRAM_MEMORY_KB("Memory.Swap.NativeClientBroker", sample); |
- continue; |
- default: |
- NOTREACHED(); |
- continue; |
- } |
- } |
- |
- int total_sample = static_cast<int>(aggregate_memory / 1000); |
- UMA_HISTOGRAM_MEMORY_MB("Memory.Swap.Total", total_sample); |
- |
- UMA_HISTOGRAM_CUSTOM_COUNTS("Memory.Swap.CompressedDataSize", |
- swap_info_.compr_data_size / (1024 * 1024), |
- 1, 4096, 50); |
- UMA_HISTOGRAM_CUSTOM_COUNTS("Memory.Swap.OriginalDataSize", |
- swap_info_.orig_data_size / (1024 * 1024), |
- 1, 4096, 50); |
- UMA_HISTOGRAM_CUSTOM_COUNTS("Memory.Swap.MemUsedTotal", |
- swap_info_.mem_used_total / (1024 * 1024), |
- 1, 4096, 50); |
- UMA_HISTOGRAM_CUSTOM_COUNTS("Memory.Swap.NumReads", |
- swap_info_.num_reads, |
- 1, 100000000, 100); |
- UMA_HISTOGRAM_CUSTOM_COUNTS("Memory.Swap.NumWrites", |
- swap_info_.num_writes, |
- 1, 100000000, 100); |
- |
- if (swap_info_.orig_data_size > 0 && swap_info_.compr_data_size > 0) { |
- UMA_HISTOGRAM_CUSTOM_COUNTS( |
- "Memory.Swap.CompressionRatio", |
- swap_info_.orig_data_size / swap_info_.compr_data_size, |
- 1, 20, 20); |
- } |
-} |
- |
-#endif // defined(OS_CHROMEOS) |