Code

processes plugin: Collect VM and stack size stats on Linux.
authorSebastian Harl <sh@tokkee.org>
Tue, 13 Jan 2009 11:36:01 +0000 (12:36 +0100)
committerSebastian Harl <sh@tokkee.org>
Tue, 13 Jan 2009 11:43:01 +0000 (12:43 +0100)
On other operating systems those values will currently always be zero since I
do not have appropriate test systems available.

The new types "ps_stacksize" and "ps_vm" have been added to types.db.

src/processes.c
src/types.db

index f4ffef8f67ed49a2ddb459e95cce8ad154aa49f9..0d670f5bb3787e9e473ce7367d3bbe1e392c72e0 100644 (file)
@@ -118,7 +118,9 @@ typedef struct procstat_entry_s
 
        unsigned long num_proc;
        unsigned long num_lwp;
+       unsigned long vmem_size;
        unsigned long vmem_rss;
+       unsigned long stack_size;
 
        unsigned long vmem_minflt;
        unsigned long vmem_majflt;
@@ -143,7 +145,9 @@ typedef struct procstat
 
        unsigned long num_proc;
        unsigned long num_lwp;
+       unsigned long vmem_size;
        unsigned long vmem_rss;
+       unsigned long stack_size;
 
        unsigned long vmem_minflt_counter;
        unsigned long vmem_majflt_counter;
@@ -315,13 +319,17 @@ static void ps_list_add (const char *name, const char *cmdline, procstat_entry_t
                }
 
                pse->age = 0;
-               pse->num_proc = entry->num_proc;
-               pse->num_lwp  = entry->num_lwp;
-               pse->vmem_rss = entry->vmem_rss;
-
-               ps->num_proc += pse->num_proc;
-               ps->num_lwp  += pse->num_lwp;
-               ps->vmem_rss += pse->vmem_rss;
+               pse->num_proc   = entry->num_proc;
+               pse->num_lwp    = entry->num_lwp;
+               pse->vmem_size  = entry->vmem_size;
+               pse->vmem_rss   = entry->vmem_rss;
+               pse->stack_size = entry->stack_size;
+
+               ps->num_proc   += pse->num_proc;
+               ps->num_lwp    += pse->num_lwp;
+               ps->vmem_size  += pse->vmem_size;
+               ps->vmem_rss   += pse->vmem_rss;
+               ps->stack_size += pse->stack_size;
 
                if ((entry->vmem_minflt_counter == 0)
                                && (entry->vmem_majflt_counter == 0))
@@ -410,7 +418,9 @@ static void ps_list_reset (void)
        {
                ps->num_proc    = 0;
                ps->num_lwp     = 0;
+               ps->vmem_size   = 0;
                ps->vmem_rss    = 0;
+               ps->stack_size  = 0;
 
                pse_prev = NULL;
                pse = ps->instances;
@@ -562,11 +572,21 @@ static void ps_submit_proc_list (procstat_t *ps)
        sstrncpy (vl.plugin, "processes", sizeof (vl.plugin));
        sstrncpy (vl.plugin_instance, ps->name, sizeof (vl.plugin_instance));
 
+       sstrncpy (vl.type, "ps_vm", sizeof (vl.type));
+       vl.values[0].gauge = ps->vmem_size;
+       vl.values_len = 1;
+       plugin_dispatch_values (&vl);
+
        sstrncpy (vl.type, "ps_rss", sizeof (vl.type));
        vl.values[0].gauge = ps->vmem_rss;
        vl.values_len = 1;
        plugin_dispatch_values (&vl);
 
+       sstrncpy (vl.type, "ps_stacksize", sizeof (vl.type));
+       vl.values[0].gauge = ps->stack_size;
+       vl.values_len = 1;
+       plugin_dispatch_values (&vl);
+
        sstrncpy (vl.type, "ps_cputime", sizeof (vl.type));
        vl.values[0].counter = ps->cpu_user_counter;
        vl.values[1].counter = ps->cpu_system_counter;
@@ -672,7 +692,9 @@ int ps_read_process (int pid, procstat_t *ps, char *state)
 
        long long unsigned cpu_user_counter;
        long long unsigned cpu_system_counter;
+       long long unsigned vmem_size;
        long long unsigned vmem_rss;
+       long long unsigned stack_size;
 
        memset (ps, 0, sizeof (procstat_t));
 
@@ -739,10 +761,20 @@ int ps_read_process (int pid, procstat_t *ps, char *state)
 
        cpu_user_counter   = atoll (fields[13]);
        cpu_system_counter = atoll (fields[14]);
-       vmem_rss = atoll (fields[23]);
+       vmem_size          = atoll (fields[22]);
+       vmem_rss           = atoll (fields[23]);
        ps->vmem_minflt_counter = atol (fields[9]);
        ps->vmem_majflt_counter = atol (fields[11]);
-       
+
+       {
+               unsigned long long stack_start = atoll (fields[27]);
+               unsigned long long stack_ptr   = atoll (fields[28]);
+
+               stack_size = (stack_start > stack_ptr)
+                       ? stack_start - stack_ptr
+                       : stack_ptr - stack_start;
+       }
+
        /* Convert jiffies to useconds */
        cpu_user_counter   = cpu_user_counter   * 1000000 / CONFIG_HZ;
        cpu_system_counter = cpu_system_counter * 1000000 / CONFIG_HZ;
@@ -750,7 +782,9 @@ int ps_read_process (int pid, procstat_t *ps, char *state)
 
        ps->cpu_user_counter = (unsigned long) cpu_user_counter;
        ps->cpu_system_counter = (unsigned long) cpu_system_counter;
+       ps->vmem_size = (unsigned long) vmem_size;
        ps->vmem_rss = (unsigned long) vmem_rss;
+       ps->stack_size = (unsigned long) stack_size;
 
        /* success */
        return (0);
@@ -1198,9 +1232,11 @@ static int ps_read (void)
                pse.id       = pid;
                pse.age      = 0;
 
-               pse.num_proc = ps.num_proc;
-               pse.num_lwp  = ps.num_lwp;
-               pse.vmem_rss = ps.vmem_rss;
+               pse.num_proc   = ps.num_proc;
+               pse.num_lwp    = ps.num_lwp;
+               pse.vmem_size  = ps.vmem_size;
+               pse.vmem_rss   = ps.vmem_rss;
+               pse.stack_size = ps.stack_size;
 
                pse.vmem_minflt = 0;
                pse.vmem_minflt_counter = ps.vmem_minflt_counter;
index 67d8f0d3979d6f6ea5711c50fa661f2c6b7ddf43..17dc76ccacd7940c0dc0330bcdfb5867d1900ced 100644 (file)
@@ -80,7 +80,9 @@ ps_count              processes:GAUGE:0:1000000, threads:GAUGE:0:1000000
 ps_cputime             user:COUNTER:0:16000000, syst:COUNTER:0:16000000
 ps_pagefaults          minflt:COUNTER:0:9223372036854775807, majflt:COUNTER:0:9223372036854775807
 ps_rss                 value:GAUGE:0:9223372036854775807
+ps_stacksize           value:GAUGE:0:9223372036854775807
 ps_state               value:GAUGE:0:65535
+ps_vm                  value:GAUGE:0:9223372036854775807
 queue_length           value:GAUGE:0:U
 serial_octets          rx:COUNTER:0:4294967295, tx:COUNTER:0:4294967295
 signal_noise           value:GAUGE:U:0