File: statusd_cpustat.lua

package info (click to toggle)
notion 4.0.2%2Bdfsg-5
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 4,676 kB
  • sloc: ansic: 47,508; sh: 2,096; makefile: 603; perl: 270
file content (110 lines) | stat: -rw-r--r-- 3,352 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
-- Authors: Tibor Csögör <tibi@tiborius.net>
-- License: Public domain
-- Last Changed: 2007-03-10
--
-- $Id: statusd_cpustat.lua 80 2007-03-10 00:16:09Z tibi $

-- statusd_cpustat.lua -- CPU monitor for Ion3's statusbar

-- version : 0.3
-- date    : 2007-03-10
-- author  : Tibor Csögör <tibi@tiborius.net>

-- Shows the CPU utilization of the system similiar to top(1).
-- This script depends on the /proc filesystem and thus only works on Linux.
-- Tested with kernel 2.6.16.

-- Configuration:
-- The following placeholders (with a "cpustat_" prefix) can be used in the
-- statusbar template: `user', `nice', `idle', `system', `iowait', `irq',
-- `softirq' and `steal'.  In addition, `system_adj' sums up the last 5 fields.
-- For a compact output simply use the `cpustat' placeholder.

-- This software is in the public domain.

--------------------------------------------------------------------------------


local defaults = {
   update_interval = 1000, -- 1 second
}

local settings = table.join(statusd.get_config("cpustat"), defaults)

local last_stat, current_stat
local last_uptime, current_uptime = 0, 0
local first_run = true

function math.round(number, precision)
   local m = 10^(precision or 0)
   return math.floor((number*m)+(1/2)) / m
end

-- this function reads stats from /proc/stat and /proc/uptime and calculates the
-- CPU time used in the measurement interval
local function get_cpustat()
   local f1, f2, s, s2
   f1 = io.open('/proc/stat', 'r')
   f2 = io.open('/proc/uptime', 'r')
   if ((f1 == nil ) or (f2 == nil)) then return nil end
   s = f1:read("*l")
   s2 = f2:read("*l")
   f1:close()
   f2:close()

   last_uptime = current_uptime
   local tmp, tmp, up1, up2
   tmp, tmp, up1, up2 = string.find(s2, "(%d+)\.(%d+)%s%d")
   current_uptime = tonumber(up1 .. up2)
   local uptime_interv = current_uptime - last_uptime

   local t = {}
   for tmp in string.gmatch(s, "%s+(%d+)") do
      table.insert(t, tonumber(tmp))
   end

   last_stat = current_stat
   current_stat = t
   if (first_run) then
      last_stat = t
      first_run = false
   end

   local c = {}
   for i = 1, #(t) do
      table.insert(c, math.round(((current_stat[i] - last_stat[i])
				  / uptime_interv) * 100))
   end

   -- adjusted system CPU time (= system + iowait + irq + softirq + steal)
   table.insert(c, math.round((((current_stat[3] - last_stat[3]) +
				(current_stat[5] - last_stat[5]) +
				(current_stat[6] - last_stat[6]) +
				(current_stat[7] - last_stat[7]) +
				(current_stat[8] - last_stat[8]))
				  / uptime_interv) * 100))
   return c
end

local cpustat_timer = statusd.create_timer()

local function update_cpustat()
   local t = get_cpustat()
   if (t == nil) then return nil end
   statusd.inform("cpustat_user", t[1] .. "%")
   statusd.inform("cpustat_nice", t[2] .. "%")
   statusd.inform("cpustat_system", t[3] .. "%")
   statusd.inform("cpustat_system_adj", t[9] .. "%")
   statusd.inform("cpustat_idle", t[4] .. "%")
   statusd.inform("cpustat_iowait", t[5] .. "%")
   statusd.inform("cpustat_irq", t[6] .. "%")
   statusd.inform("cpustat_softirq", t[7] .. "%")
   statusd.inform("cpustat_steal", t[8] .. "%")
   statusd.inform("cpustat", string.format("%3d%% us,%3d%% sy,%3d%% ni",
					   t[1], t[9], t[2]))
   cpustat_timer:set(settings.update_interval, update_cpustat)
end

update_cpustat()

-- EOF