2 #include <sys/vmmeter.h>
4 // FreeBSD calculates this once every 5 seconds
5 #define MIN_LOADAVG_UPDATE_EVERY 5
7 int do_proc_loadavg(int update_every, unsigned long long dt) {
10 static int do_loadavg = -1, do_all_processes = -1;
11 static unsigned long long last_loadavg_usec = 0;
12 static RRDSET *load_chart = NULL, *processes_chart = NULL;
14 if(unlikely(do_loadavg == -1)) {
15 do_loadavg = config_get_boolean("plugin:proc:/proc/loadavg", "enable load average", 1);
16 do_all_processes = config_get_boolean("plugin:proc:/proc/loadavg", "enable total processes", 1);
19 struct loadavg sysload;
21 if (unlikely(GETSYSCTL("vm.loadavg", sysload)))
24 double load1 = (double)sysload.ldavg[0] / sysload.fscale;
25 double load5 = (double)sysload.ldavg[1] / sysload.fscale;
26 double load15 = (double)sysload.ldavg[2] / sysload.fscale;
30 if (unlikely(GETSYSCTL("vm.vmtotal", total)))
33 unsigned long long active_processes = total.t_rq + total.t_dw + total.t_pw + total.t_sl + total.t_sw;
35 // --------------------------------------------------------------------
37 if(last_loadavg_usec <= dt) {
38 if(likely(do_loadavg)) {
39 if(unlikely(!load_chart)) {
40 load_chart = rrdset_find_byname("system.load");
41 if(unlikely(!load_chart)) {
42 load_chart = rrdset_create("system", "load", NULL, "load", NULL, "System Load Average", "load", 100, (update_every < MIN_LOADAVG_UPDATE_EVERY) ? MIN_LOADAVG_UPDATE_EVERY : update_every, RRDSET_TYPE_LINE);
43 rrddim_add(load_chart, "load1", NULL, 1, 1000, RRDDIM_ABSOLUTE);
44 rrddim_add(load_chart, "load5", NULL, 1, 1000, RRDDIM_ABSOLUTE);
45 rrddim_add(load_chart, "load15", NULL, 1, 1000, RRDDIM_ABSOLUTE);
49 rrdset_next(load_chart);
51 rrddim_set(load_chart, "load1", (collected_number) (load1 * 1000));
52 rrddim_set(load_chart, "load5", (collected_number) (load5 * 1000));
53 rrddim_set(load_chart, "load15", (collected_number) (load15 * 1000));
54 rrdset_done(load_chart);
57 last_loadavg_usec = load_chart->update_every * 1000000ULL;
59 else last_loadavg_usec -= dt;
61 // --------------------------------------------------------------------
63 if(likely(do_all_processes)) {
64 if(unlikely(!processes_chart)) {
65 processes_chart = rrdset_find_byname("system.active_processes");
66 if(unlikely(!processes_chart)) {
67 processes_chart = rrdset_create("system", "active_processes", NULL, "processes", NULL, "System Active Processes", "processes", 750, update_every, RRDSET_TYPE_LINE);
68 rrddim_add(processes_chart, "active", NULL, 1, 1, RRDDIM_ABSOLUTE);
71 else rrdset_next(processes_chart);
73 rrddim_set(processes_chart, "active", active_processes);
74 rrdset_done(processes_chart);