Commit e301d424 authored by erikchen's avatar erikchen Committed by Commit Bot

Update MemoryDetails to use memory_instrumentation.

memory_instrumentation is the source of truth for memory metrics. It provides
private_memory_footprint, a cross-platform consistent memory metric.

The previous implementation exposed working_set and committed - Windows specific
measurements, and phys_footprint - a macOS specific measurement.

This CL replaces those metrics with private_memory_footprint. The only place
these numbers are used is to generate a log string, used by the feedback system
and the OOM reporting system.

Change-Id: If39c626605f70e18e6044c7f1d2f0f1a8ce5562a
Bug: 819289
Reviewed-on: https://chromium-review.googlesource.com/951754Reviewed-by: default avatarNico Weber <thakis@chromium.org>
Commit-Queue: Erik Chen <erikchen@chromium.org>
Cr-Commit-Position: refs/heads/master@{#542196}
parent aadafe65
...@@ -32,6 +32,8 @@ ...@@ -32,6 +32,8 @@
#include "content/public/common/bindings_policy.h" #include "content/public/common/bindings_policy.h"
#include "content/public/common/content_constants.h" #include "content/public/common/content_constants.h"
#include "extensions/buildflags/buildflags.h" #include "extensions/buildflags/buildflags.h"
#include "services/resource_coordinator/public/cpp/memory_instrumentation/global_memory_dump.h"
#include "services/resource_coordinator/public/cpp/memory_instrumentation/memory_instrumentation.h"
#include "ui/base/l10n/l10n_util.h" #include "ui/base/l10n/l10n_util.h"
#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
...@@ -96,7 +98,7 @@ ProcessMemoryInformation::ProcessMemoryInformation() ...@@ -96,7 +98,7 @@ ProcessMemoryInformation::ProcessMemoryInformation()
num_open_fds(-1), num_open_fds(-1),
open_fds_soft_limit(-1), open_fds_soft_limit(-1),
renderer_type(RENDERER_UNKNOWN), renderer_type(RENDERER_UNKNOWN),
phys_footprint(0) {} private_memory_footprint_kb(0) {}
ProcessMemoryInformation::ProcessMemoryInformation( ProcessMemoryInformation::ProcessMemoryInformation(
const ProcessMemoryInformation& other) = default; const ProcessMemoryInformation& other) = default;
...@@ -105,7 +107,7 @@ ProcessMemoryInformation::~ProcessMemoryInformation() {} ...@@ -105,7 +107,7 @@ ProcessMemoryInformation::~ProcessMemoryInformation() {}
bool ProcessMemoryInformation::operator<( bool ProcessMemoryInformation::operator<(
const ProcessMemoryInformation& rhs) const { const ProcessMemoryInformation& rhs) const {
return working_set.priv < rhs.working_set.priv; return private_memory_footprint_kb < rhs.private_memory_footprint_kb;
} }
ProcessData::ProcessData() {} ProcessData::ProcessData() {}
...@@ -175,13 +177,8 @@ std::string MemoryDetails::ToLogString() { ...@@ -175,13 +177,8 @@ std::string MemoryDetails::ToLogString() {
} }
log += "]"; log += "]";
} }
log += StringPrintf(" %d MB private, %d MB shared", log += StringPrintf(
static_cast<int>(iter1->working_set.priv) / 1024, " %d MB", static_cast<int>(iter1->private_memory_footprint_kb) / 1024);
static_cast<int>(iter1->working_set.shared) / 1024);
#if defined(OS_CHROMEOS)
log += StringPrintf(", %d MB swapped",
static_cast<int>(iter1->working_set.swapped) / 1024);
#endif
if (iter1->num_open_fds != -1 || iter1->open_fds_soft_limit != -1) { if (iter1->num_open_fds != -1 || iter1->open_fds_soft_limit != -1) {
log += StringPrintf(", %d FDs open of %d", iter1->num_open_fds, log += StringPrintf(", %d FDs open of %d", iter1->num_open_fds,
iter1->open_fds_soft_limit); iter1->open_fds_soft_limit);
...@@ -359,5 +356,31 @@ void MemoryDetails::CollectChildInfoOnUIThread() { ...@@ -359,5 +356,31 @@ void MemoryDetails::CollectChildInfoOnUIThread() {
vector.erase(std::remove_if(vector.begin(), vector.end(), is_unknown), vector.erase(std::remove_if(vector.begin(), vector.end(), is_unknown),
vector.end()); vector.end());
// Grab a memory dump for all processes.
// Using AdaptCallbackForRepeating allows for an easier transition to
// OnceCallbacks for https://crbug.com/714018.
memory_instrumentation::MemoryInstrumentation::GetInstance()
->RequestGlobalDump(std::vector<std::string>(),
base::AdaptCallbackForRepeating(base::BindOnce(
&MemoryDetails::DidReceiveMemoryDump, this)));
}
void MemoryDetails::DidReceiveMemoryDump(
bool success,
std::unique_ptr<memory_instrumentation::GlobalMemoryDump> global_dump) {
ProcessData* const chrome_browser = ChromeBrowser();
if (success) {
for (const memory_instrumentation::GlobalMemoryDump::ProcessDump& dump :
global_dump->process_dumps()) {
base::ProcessId dump_pid = dump.pid();
for (ProcessMemoryInformation& pmi : chrome_browser->processes) {
if (pmi.pid == dump_pid) {
pmi.private_memory_footprint_kb = dump.os_dump().private_footprint_kb;
break;
}
}
}
}
OnDetailsAvailable(); OnDetailsAvailable();
} }
...@@ -19,6 +19,10 @@ ...@@ -19,6 +19,10 @@
#include "chrome/browser/site_details.h" #include "chrome/browser/site_details.h"
#include "content/public/common/process_type.h" #include "content/public/common/process_type.h"
namespace memory_instrumentation {
class GlobalMemoryDump;
} // namespace memory_instrumentation
// We collect data about each browser process. A browser may // We collect data about each browser process. A browser may
// have multiple processes (of course!). Even IE has multiple // have multiple processes (of course!). Even IE has multiple
// processes these days. // processes these days.
...@@ -49,10 +53,6 @@ struct ProcessMemoryInformation { ...@@ -49,10 +53,6 @@ struct ProcessMemoryInformation {
// The process id. // The process id.
base::ProcessId pid; base::ProcessId pid;
// The working set information.
base::WorkingSetKBytes working_set;
// The committed bytes.
base::CommittedKBytes committed;
// The process version // The process version
base::string16 version; base::string16 version;
// The process product name. // The process product name.
...@@ -69,9 +69,8 @@ struct ProcessMemoryInformation { ...@@ -69,9 +69,8 @@ struct ProcessMemoryInformation {
RendererProcessType renderer_type; RendererProcessType renderer_type;
// A collection of titles used, i.e. for a tab it'll show all the page titles. // A collection of titles used, i.e. for a tab it'll show all the page titles.
std::vector<base::string16> titles; std::vector<base::string16> titles;
// The physical footprint is a macOS concept that tracks anonymous, // Consistent memory metric for all platforms.
// non-discardable memory. size_t private_memory_footprint_kb;
size_t phys_footprint;
}; };
typedef std::vector<ProcessMemoryInformation> ProcessMemoryInformationList; typedef std::vector<ProcessMemoryInformation> ProcessMemoryInformationList;
...@@ -170,6 +169,10 @@ class MemoryDetails : public base::RefCountedThreadSafe<MemoryDetails> { ...@@ -170,6 +169,10 @@ class MemoryDetails : public base::RefCountedThreadSafe<MemoryDetails> {
// renderer processes is only available there. // renderer processes is only available there.
void CollectChildInfoOnUIThread(); void CollectChildInfoOnUIThread();
void DidReceiveMemoryDump(
bool success,
std::unique_ptr<memory_instrumentation::GlobalMemoryDump> dump);
std::vector<ProcessData> process_data_; std::vector<ProcessData> process_data_;
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
......
...@@ -63,7 +63,6 @@ void GetProcessDataMemoryInformation( ...@@ -63,7 +63,6 @@ void GetProcessDataMemoryInformation(
std::unique_ptr<base::ProcessMetrics> metrics( std::unique_ptr<base::ProcessMetrics> metrics(
base::ProcessMetrics::CreateProcessMetrics(*i)); base::ProcessMetrics::CreateProcessMetrics(*i));
metrics->GetWorkingSetKBytes(&pmi.working_set);
// TODO(ssid): Reading "/proc/fd" only works for current process. For child // TODO(ssid): Reading "/proc/fd" only works for current process. For child
// processes, the values need to be computed by the process itself. // processes, the values need to be computed by the process itself.
......
...@@ -70,7 +70,6 @@ ProcessData GetProcessDataMemoryInformation( ...@@ -70,7 +70,6 @@ ProcessData GetProcessDataMemoryInformation(
std::unique_ptr<base::ProcessMetrics> metrics( std::unique_ptr<base::ProcessMetrics> metrics(
base::ProcessMetrics::CreateProcessMetrics(pid)); base::ProcessMetrics::CreateProcessMetrics(pid));
metrics->GetWorkingSetKBytes(&pmi.working_set);
pmi.num_open_fds = metrics->GetOpenFdCount(); pmi.num_open_fds = metrics->GetOpenFdCount();
pmi.open_fds_soft_limit = metrics->GetOpenFdSoftLimit(); pmi.open_fds_soft_limit = metrics->GetOpenFdSoftLimit();
......
...@@ -58,13 +58,6 @@ void CollectProcessDataForChromeProcess( ...@@ -58,13 +58,6 @@ void CollectProcessDataForChromeProcess(
} }
} }
std::unique_ptr<base::ProcessMetrics> metrics =
base::ProcessMetrics::CreateProcessMetrics(
pid, content::BrowserChildProcessHost::GetPortProvider());
metrics->GetCommittedAndWorkingSetKBytes(&info.committed, &info.working_set);
base::ProcessMetrics::TaskVMInfo vm_info = metrics->GetTaskVMInfo();
info.phys_footprint = vm_info.phys_footprint;
processes->push_back(info); processes->push_back(info);
} }
......
...@@ -78,11 +78,6 @@ void MemoryDetails::CollectProcessData( ...@@ -78,11 +78,6 @@ void MemoryDetails::CollectProcessData(
? content::PROCESS_TYPE_BROWSER ? content::PROCESS_TYPE_BROWSER
: content::PROCESS_TYPE_UNKNOWN; : content::PROCESS_TYPE_UNKNOWN;
std::unique_ptr<base::ProcessMetrics> metrics =
base::ProcessMetrics::CreateProcessMetrics(process_handle.Get());
metrics->GetCommittedKBytes(&info.committed);
metrics->GetWorkingSetKBytes(&info.working_set);
// Get Version Information. // Get Version Information.
info.version = base::ASCIIToUTF16(version_info::GetVersionNumber()); info.version = base::ASCIIToUTF16(version_info::GetVersionNumber());
// Check if this is one of the child processes whose data we collected // Check if this is one of the child processes whose data we collected
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment