diff options
author | Robin Hsu <robinhsu@google.com> | 2022-07-06 17:08:30 +0800 |
---|---|---|
committer | Robin Hsu <robinhsu@google.com> | 2022-08-26 02:59:22 +0000 |
commit | 6085ae99713c1ae766892e18497b3e1c218492aa (patch) | |
tree | 1e62857be6f9cf925371e03079cfb1c568b8bb17 | |
parent | febb9696c61d14bc65c727b6fad3ef751c297386 (diff) |
pixelstat: MM metrics: compaction duration metrics
Compaction duration metrics:
(/sys/kernel/pixel_stat/mm/compaction/mm_compaction_duration)
Sample output:
(root) # cat /sys/kernel/pixel_stat/mm/compaction/mm_compaction_duration
2 480 0 0 0 2 0
Test: local test
Bug: 234564667
Signed-off-by: Robin Hsu <robinhsu@google.com>
Change-Id: Ie5329acf0b312f9245c882738b210a8a231b5899
-rw-r--r-- | pixelstats/MmMetricsReporter.cpp | 60 | ||||
-rw-r--r-- | pixelstats/include/pixelstats/MmMetricsReporter.h | 6 |
2 files changed, 66 insertions, 0 deletions
diff --git a/pixelstats/MmMetricsReporter.cpp b/pixelstats/MmMetricsReporter.cpp index ecf9598..874cc5b 100644 --- a/pixelstats/MmMetricsReporter.cpp +++ b/pixelstats/MmMetricsReporter.cpp @@ -159,8 +159,10 @@ MmMetricsReporter::MmMetricsReporter() kIonTotalPoolsPath("/sys/kernel/dma_heap/total_pools_kb"), kIonTotalPoolsPathForLegacy("/sys/kernel/ion/total_pools_kb"), kGpuTotalPages("/sys/kernel/pixel_stat/gpu/mem/total_page_count"), + kCompactDuration("/sys/kernel/pixel_stat/mm/compaction/mm_compaction_duration"), kDirectReclaimBasePath("/sys/kernel/pixel_stat/mm/vmscan/direct_reclaim"), kPixelStatMm("/sys/kernel/pixel_stat/mm"), + prev_compaction_duration_(kNumCompactionDurationPrevMetrics, 0), prev_direct_reclaim_(kNumDirectReclaimPrevMetrics, 0) { is_user_build_ = checkUserBuild(); ker_mm_metrics_support_ = checkKernelMMMetricSupport(); @@ -445,6 +447,9 @@ void MmMetricsReporter::logPixelMmMetricsPerDay(const std::shared_ptr<IStats> &s std::vector<long> direct_reclaim; readDirectReclaimStat(&direct_reclaim); + std::vector<long> compaction_duration; + readCompactionDurationStat(&compaction_duration); + bool is_first_atom = (prev_day_vmstat_.size() == 0) ? true : false; // allocate enough values[] entries for the metrics. @@ -464,6 +469,7 @@ void MmMetricsReporter::logPixelMmMetricsPerDay(const std::shared_ptr<IStats> &s fillProcessStime(PixelMmMetricsPerDay::kKcompactdStimeClksFieldNumber, "kcompactd0", &kcompactd_pid_, &prev_kcompactd_stime_, &values); fillDirectReclaimStatAtom(direct_reclaim, &values); + fillCompactionDurationStatAtom(direct_reclaim, &values); // Don't report the first atom to avoid big spike in accumulated values. if (!is_first_atom) { @@ -607,6 +613,60 @@ std::map<std::string, uint64_t> MmMetricsReporter::readCmaStat( } /** + * This function reads compaction duration sysfs node + * (/sys/kernel/pixel_stat/mm/compaction/mm_compaction_duration) + * + * store: vector to save compaction duration info + */ +void MmMetricsReporter::readCompactionDurationStat(std::vector<long> *store) { + static const std::string path(kCompactDuration); + constexpr int num_metrics = 6; + + store->resize(num_metrics); + + int start_idx = 0; + int expected_num = num_metrics; + + if (!ReadFileToLongsCheck(path, store, start_idx, " ", 1, expected_num, true)) { + ALOGI("Unable to read %s for the direct reclaim info.", path.c_str()); + } +} + +/** + * This function fills atom values (values) from acquired compaction duration + * information from vector store + * + * store: the already collected (by readCompactionDurationStat()) compaction + * duration information + * values: the atom value vector to be filled. + */ +void MmMetricsReporter::fillCompactionDurationStatAtom(const std::vector<long> &store, + std::vector<VendorAtomValue> *values) { + // first metric index + constexpr int start_idx = PixelMmMetricsPerDay::kCompactionTotalTimeFieldNumber; + constexpr int num_metrics = 6; + + if (!MmMetricsSupported()) + return; + + int size = start_idx + num_metrics - kVendorAtomOffset; + if (values->size() < size) + values->resize(size); + + for (int i = 0; i < num_metrics; i++) { + VendorAtomValue tmp; + if (store[i] == -1) { + tmp.set<VendorAtomValue::longValue>(0); + } else { + tmp.set<VendorAtomValue::longValue>(store[i] - prev_compaction_duration_[i]); + prev_compaction_duration_[i] = store[i]; + } + (*values)[start_idx + i] = tmp; + } + prev_compaction_duration_ = store; +} + +/** * This function reads direct reclaim sysfs node (4 files: * /sys/kernel/pixel_stat/mm/vmscan/direct_reclaim/<level>/latency_stat, * where <level> = native, top, visible, other.), and save total time and diff --git a/pixelstats/include/pixelstats/MmMetricsReporter.h b/pixelstats/include/pixelstats/MmMetricsReporter.h index 2443d84..cfcfac3 100644 --- a/pixelstats/include/pixelstats/MmMetricsReporter.h +++ b/pixelstats/include/pixelstats/MmMetricsReporter.h @@ -118,6 +118,9 @@ class MmMetricsReporter { bool ReadFileToUint(const char *const path, uint64_t *val); bool reportVendorAtom(const std::shared_ptr<IStats> &stats_client, int atom_id, const std::vector<VendorAtomValue> &values, const std::string &atom_name); + void readCompactionDurationStat(std::vector<long> *store); + void fillCompactionDurationStatAtom(const std::vector<long> &store, + std::vector<VendorAtomValue> *values); void readDirectReclaimStat(std::vector<long> *store); void fillDirectReclaimStatAtom(const std::vector<long> &store, std::vector<VendorAtomValue> *values); @@ -153,14 +156,17 @@ class MmMetricsReporter { const char *const kIonTotalPoolsPath; const char *const kIonTotalPoolsPathForLegacy; const char *const kGpuTotalPages; + const char *const kCompactDuration; const char *const kDirectReclaimBasePath; const char *const kPixelStatMm; // Proto messages are 1-indexed and VendorAtom field numbers start at 2, so // store everything in the values array at the index of the field number // -2. static constexpr int kVendorAtomOffset = 2; + static constexpr int kNumCompactionDurationPrevMetrics = 6; static constexpr int kNumDirectReclaimPrevMetrics = 20; + std::vector<long> prev_compaction_duration_; std::vector<long> prev_direct_reclaim_; long prev_psi_total_[kPsiNumAllTotals]; long psi_total_[kPsiNumAllTotals]; |