summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Hsu <robinhsu@google.com>2022-07-06 17:08:30 +0800
committerRobin Hsu <robinhsu@google.com>2022-08-26 02:59:22 +0000
commit6085ae99713c1ae766892e18497b3e1c218492aa (patch)
tree1e62857be6f9cf925371e03079cfb1c568b8bb17
parentfebb9696c61d14bc65c727b6fad3ef751c297386 (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.cpp60
-rw-r--r--pixelstats/include/pixelstats/MmMetricsReporter.h6
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];