aboutsummaryrefslogtreecommitdiff
path: root/src/traced/probes/ps/process_stats_data_source.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/traced/probes/ps/process_stats_data_source.cc')
-rw-r--r--src/traced/probes/ps/process_stats_data_source.cc38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/traced/probes/ps/process_stats_data_source.cc b/src/traced/probes/ps/process_stats_data_source.cc
index 8100e4264..9ce614cfc 100644
--- a/src/traced/probes/ps/process_stats_data_source.cc
+++ b/src/traced/probes/ps/process_stats_data_source.cc
@@ -96,6 +96,7 @@ ProcessStatsDataSource::ProcessStatsDataSource(
record_thread_names_ = cfg.record_thread_names();
dump_all_procs_on_start_ = cfg.scan_all_processes_on_start();
resolve_process_fds_ = cfg.resolve_process_fds();
+ scan_smaps_rollup_ = cfg.scan_smaps_rollup();
enable_on_demand_dumps_ = true;
for (auto quirk = cfg.quirks(); quirk; ++quirk) {
@@ -495,6 +496,11 @@ void ProcessStatsDataSource::WriteAllProcessStats() {
if (proc_status.empty())
continue;
+ if (scan_smaps_rollup_) {
+ std::string proc_smaps_rollup = ReadProcPidFile(pid, "smaps_rollup");
+ proc_status.append(proc_smaps_rollup);
+ }
+
if (!WriteMemCounters(pid, proc_status)) {
// If WriteMemCounters() fails the pid is very likely a kernel thread
// that has a valid /proc/[pid]/status but no memory values. In this
@@ -606,6 +612,38 @@ bool ProcessStatsDataSource::WriteMemCounters(int32_t pid,
GetOrCreateStatsProcess(pid)->set_vm_swap_kb(counter);
cached.vm_swap_kb = counter;
}
+ // The entries below come from smaps_rollup, WriteAllProcessStats merges
+ // everything into the same buffer for convenience.
+ } else if (strcmp(key.data(), "Rss") == 0) {
+ auto counter = ToU32(value.data());
+ if (counter != cached.smr_rss_kb) {
+ GetOrCreateStatsProcess(pid)->set_smr_rss_kb(counter);
+ cached.smr_rss_kb = counter;
+ }
+ } else if (strcmp(key.data(), "Pss") == 0) {
+ auto counter = ToU32(value.data());
+ if (counter != cached.smr_pss_kb) {
+ GetOrCreateStatsProcess(pid)->set_smr_pss_kb(counter);
+ cached.smr_pss_kb = counter;
+ }
+ } else if (strcmp(key.data(), "Pss_Anon") == 0) {
+ auto counter = ToU32(value.data());
+ if (counter != cached.smr_pss_anon_kb) {
+ GetOrCreateStatsProcess(pid)->set_smr_pss_anon_kb(counter);
+ cached.smr_pss_anon_kb = counter;
+ }
+ } else if (strcmp(key.data(), "Pss_File") == 0) {
+ auto counter = ToU32(value.data());
+ if (counter != cached.smr_pss_file_kb) {
+ GetOrCreateStatsProcess(pid)->set_smr_pss_file_kb(counter);
+ cached.smr_pss_file_kb = counter;
+ }
+ } else if (strcmp(key.data(), "Pss_Shmem") == 0) {
+ auto counter = ToU32(value.data());
+ if (counter != cached.smr_pss_shmem_kb) {
+ GetOrCreateStatsProcess(pid)->set_smr_pss_shmem_kb(counter);
+ cached.smr_pss_shmem_kb = counter;
+ }
}
key.clear();