summaryrefslogtreecommitdiffstats
path: root/src/common/MemoryModel.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/MemoryModel.cc')
-rw-r--r--src/common/MemoryModel.cc94
1 files changed, 94 insertions, 0 deletions
diff --git a/src/common/MemoryModel.cc b/src/common/MemoryModel.cc
new file mode 100644
index 000000000..14d31cc9a
--- /dev/null
+++ b/src/common/MemoryModel.cc
@@ -0,0 +1,94 @@
+#include "MemoryModel.h"
+#include "include/compat.h"
+#include "debug.h"
+#if defined(__linux__)
+#include <malloc.h>
+#endif
+
+#include <fstream>
+
+#define dout_subsys ceph_subsys_
+
+MemoryModel::MemoryModel(CephContext *cct_)
+ : cct(cct_)
+{
+}
+
+void MemoryModel::_sample(snap *psnap)
+{
+ ifstream f;
+
+ f.open(PROCPREFIX "/proc/self/status");
+ if (!f.is_open()) {
+ ldout(cct, 0) << "check_memory_usage unable to open " PROCPREFIX "/proc/self/status" << dendl;
+ return;
+ }
+ while (!f.eof()) {
+ string line;
+ getline(f, line);
+
+ if (strncmp(line.c_str(), "VmSize:", 7) == 0)
+ psnap->size = atol(line.c_str() + 7);
+ else if (strncmp(line.c_str(), "VmRSS:", 6) == 0)
+ psnap->rss = atol(line.c_str() + 7);
+ else if (strncmp(line.c_str(), "VmHWM:", 6) == 0)
+ psnap->hwm = atol(line.c_str() + 7);
+ else if (strncmp(line.c_str(), "VmLib:", 6) == 0)
+ psnap->lib = atol(line.c_str() + 7);
+ else if (strncmp(line.c_str(), "VmPeak:", 7) == 0)
+ psnap->peak = atol(line.c_str() + 7);
+ else if (strncmp(line.c_str(), "VmData:", 7) == 0)
+ psnap->data = atol(line.c_str() + 7);
+ }
+ f.close();
+
+ f.open(PROCPREFIX "/proc/self/maps");
+ if (!f.is_open()) {
+ ldout(cct, 0) << "check_memory_usage unable to open " PROCPREFIX "/proc/self/maps" << dendl;
+ return;
+ }
+
+ long heap = 0;
+ while (f.is_open() && !f.eof()) {
+ string line;
+ getline(f, line);
+ //ldout(cct, 0) << "line is " << line << dendl;
+
+ const char *start = line.c_str();
+ const char *dash = start;
+ while (*dash && *dash != '-') dash++;
+ if (!*dash)
+ continue;
+ const char *end = dash + 1;
+ while (*end && *end != ' ') end++;
+ if (!*end)
+ continue;
+ unsigned long long as = strtoll(start, 0, 16);
+ unsigned long long ae = strtoll(dash+1, 0, 16);
+
+ //ldout(cct, 0) << std::hex << as << " to " << ae << std::dec << dendl;
+
+ end++;
+ const char *mode = end;
+
+ int skip = 4;
+ while (skip--) {
+ end++;
+ while (*end && *end != ' ') end++;
+ }
+ if (*end)
+ end++;
+
+ long size = ae - as;
+ //ldout(cct, 0) << "size " << size << " mode is '" << mode << "' end is '" << end << "'" << dendl;
+
+ /*
+ * anything 'rw' and anon is assumed to be heap.
+ */
+ if (mode[0] == 'r' && mode[1] == 'w' && !*end)
+ heap += size;
+ }
+
+ psnap->heap = heap >> 10;
+
+}