comparison mod_statistics/stats.lib.lua @ 1077:b73d44afdafa

mod_statistics/stats.lib.lua: Improve memory stats (use pposix.meminfo() if available)
author Kim Alvefur <zash@zash.se>
date Sat, 15 Jun 2013 20:57:18 +0100
parents 5616cab8b6d6
children 3af947e2e6d4
comparison
equal deleted inserted replaced
1076:5616cab8b6d6 1077:b73d44afdafa
1 local it = require "util.iterators"; 1 local it = require "util.iterators";
2 local log = require "util.logger".init("stats"); 2 local log = require "util.logger".init("stats");
3 local has_pposix, pposix = pcall(require, "util.pposix");
4 local human;
5 do
6 local tostring = tostring;
7 local s_format = string.format;
8 local m_floor = math.floor;
9 local m_max = math.max;
10 local prefixes = "kMGTPEZY";
11 local multiplier = 1024;
12
13 function human(num)
14 num = tonumber(num) or 0;
15 local m = 0;
16 while num >= multiplier and m < #prefixes do
17 num = num / multiplier;
18 m = m + 1;
19 end
20
21 return s_format("%0."..m_max(0,3-#tostring(m_floor(num))).."f%sB",
22 num, m > 0 and (prefixes:sub(m,m) .. "i") or "");
23 end
24 end
3 25
4 local last_cpu_wall, last_cpu_clock; 26 local last_cpu_wall, last_cpu_clock;
5 local get_time = require "socket".gettime; 27 local get_time = require "socket".gettime;
6 28
7 local active_sessions, active_jids = {}, {}; 29 local active_sessions, active_jids = {}, {};
42 get = function () return prosody.start_time; end; 64 get = function () return prosody.start_time; end;
43 tostring = function (up_since) 65 tostring = function (up_since)
44 return tostring(os.time()-up_since).."s"; 66 return tostring(os.time()-up_since).."s";
45 end; 67 end;
46 }; 68 };
47 memory_used = { 69 memory_lua = {
48 get = function () return collectgarbage("count")/1024; end; 70 get = function () return math.ceil(collectgarbage("count")*1024); end;
49 tostring = "%0.2fMB"; 71 tostring = human;
50 };
51 memory_process = {
52 get = function () return pposix.meminfo().allocated/1048576; end;
53 tostring = "%0.2fMB";
54 }; 72 };
55 time = { 73 time = {
56 tostring = function () return os.date("%T"); end; 74 tostring = function () return os.date("%T"); end;
57 }; 75 };
58 cpu = { 76 cpu = {
65 last_cpu_wall, last_cpu_clock = new_wall, new_clock; 83 last_cpu_wall, last_cpu_clock = new_wall, new_clock;
66 return math.ceil(pc); 84 return math.ceil(pc);
67 end; 85 end;
68 tostring = "%s%%"; 86 tostring = "%s%%";
69 }; 87 };
88 };
89
90 if has_pposix and pposix.meminfo then
91 stats.memory_allocated = {
92 get = function () return math.ceil(pposix.meminfo().allocated); end;
93 tostring = human;
94 }
95 stats.memory_used = {
96 get = function () return math.ceil(pposix.meminfo().used); end;
97 tostring = human;
98 }
99 stats.memory_unused = {
100 get = function () return math.ceil(pposix.meminfo().unused); end;
101 tostring = human;
102 }
103 stats.memory_returnable = {
104 get = function () return math.ceil(pposix.meminfo().returnable); end;
105 tostring = human;
106 }
107 end
108
109 local pagesize = 4096;
110 stats.memory_total = {
111 get = function ()
112 local statm, err = io.open"/proc/self/statm";
113 if statm then
114 local total = statm:read"*n";
115 statm:close();
116 return total * pagesize;
117 else
118 module:log("debug", err);
119 end
120 end;
121 tostring = human;
122 };
123 stats.memory_rss = {
124 get = function ()
125 local statm, err = io.open"/proc/self/statm";
126 if statm then
127 statm:read"*n"; -- Total size, ignore
128 local rss = statm:read"*n";
129 statm:close();
130 return rss * pagesize;
131 else
132 module:log("debug", err);
133 end
134 end;
135 tostring = human;
70 }; 136 };
71 137
72 local add_statistics_filter; -- forward decl 138 local add_statistics_filter; -- forward decl
73 if prosody and prosody.arg then -- ensures we aren't in prosodyctl 139 if prosody and prosody.arg then -- ensures we aren't in prosodyctl
74 setmetatable(active_sessions, { 140 setmetatable(active_sessions, {