Changeset

1379:403d5cd924eb

mod_statistics_mem: Module that collects memory usage stats from /proc
author Kim Alvefur <zash@zash.se>
date Thu, 03 Apr 2014 20:57:22 +0200
parents 1378:aa371405db34
children 1380:703041357f89
files mod_statistics_mem/mod_statistics_mem.lua
diffstat 1 files changed, 59 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_statistics_mem/mod_statistics_mem.lua	Thu Apr 03 20:57:22 2014 +0200
@@ -0,0 +1,59 @@
+-- Probably Linux-specific memory statistics
+
+module:set_global();
+
+local human;
+do
+	local tostring = tostring;
+	local s_format = string.format;
+	local m_floor = math.floor;
+	local m_max = math.max;
+	local prefixes = "kMGTPEZY";
+	local multiplier = 1024;
+
+	function human(num)
+		num = tonumber(num) or 0;
+		local m = 0;
+		while num >= multiplier and m < #prefixes do
+			num = num / multiplier;
+			m = m + 1;
+		end
+
+		return s_format("%0."..m_max(0,3-#tostring(m_floor(num))).."f%sB",
+		num, m > 0 and (prefixes:sub(m,m) .. "i") or "");
+	end
+end
+
+
+local pagesize = 4096; -- according to getpagesize()
+module:provides("statistics", {
+	statistics = {
+		memory_total = { -- virtual memory
+			get = function ()
+				local statm, err = io.open"/proc/self/statm";
+				if statm then
+					local total = statm:read"*n";
+					statm:close();
+					return total * pagesize;
+				else
+					module:log("debug", err);
+				end
+			end;
+			tostring = human;
+		};
+		memory_rss = { -- actual in-memory data size
+			get = function ()
+				local statm, err = io.open"/proc/self/statm";
+				if statm then
+					statm:read"*n"; -- Total size, ignore
+					local rss = statm:read"*n";
+					statm:close();
+					return rss * pagesize;
+				else
+					module:log("debug", err);
+				end
+			end;
+			tostring = human;
+		};
+	}
+});