From 6d11c8b4db353f58b518194e76a5a042f63a5903 Mon Sep 17 00:00:00 2001 From: aristocratos Date: Tue, 21 Sep 2021 21:24:58 +0200 Subject: [PATCH] Fixed: Use /proc/pid/statm if RSS memory from /proc/pid/stat is faulty --- src/btop_shared.hpp | 1 + src/linux/btop_collect.cpp | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/btop_shared.hpp b/src/btop_shared.hpp index e54465f..4d0f323 100644 --- a/src/btop_shared.hpp +++ b/src/btop_shared.hpp @@ -70,6 +70,7 @@ namespace Shared { void init(); extern long coreCount, page_size, clk_tck; + extern int totalMem_len; extern uint64_t totalMem; } diff --git a/src/linux/btop_collect.cpp b/src/linux/btop_collect.cpp index bb0c944..f5ffdff 100644 --- a/src/linux/btop_collect.cpp +++ b/src/linux/btop_collect.cpp @@ -80,6 +80,7 @@ namespace Shared { fs::path procPath, passwd_path; uint64_t totalMem; long pageSize, clkTck, coreCount; + int totalMem_len; void init() { @@ -114,6 +115,7 @@ namespace Shared { if (meminfo.good()) { meminfo.ignore(SSmax, ':'); meminfo >> totalMem; + totalMem_len = to_string(totalMem).size(); totalMem <<= 10; } if (not meminfo.good() or totalMem == 0) @@ -1451,7 +1453,10 @@ namespace Proc { next_x = 24; continue; case 24: //? RSS memory (can be inaccurate, but parsing smaps increases total cpu usage by ~20x) - new_proc.mem = stoull(short_str) * Shared::pageSize; + if (cmp_greater(short_str.size(), Shared::totalMem_len)) + new_proc.mem = Shared::totalMem; + else + new_proc.mem = stoull(short_str) * Shared::pageSize; } break; } @@ -1464,6 +1469,16 @@ namespace Proc { if (x-offset < 24) continue; + //? Get RSS memory from /proc/[pid]/statm if value from /proc/[pid]/stat looks wrong + if (new_proc.mem >= Shared::totalMem) { + pread.open(d.path() / "statm"); + if (not pread.good()) continue; + pread.ignore(SSmax, ' '); + pread >> new_proc.mem; + new_proc.mem *= Shared::pageSize; + pread.close(); + } + //? Process cpu usage since last update new_proc.cpu_p = clamp(round(cmult * 1000 * (cpu_t - new_proc.cpu_t) / max((uint64_t)1, cputimes - old_cputimes)) / 10.0, 0.0, 100.0 * Shared::coreCount);