]> arthur.barton.de Git - netdata.git/commitdiff
CPU times are reported with 100% at full machine utilization, all cores
authorCosta Tsaousis (ktsaou) <costa@tsaousis.gr>
Wed, 7 May 2014 23:28:47 +0000 (02:28 +0300)
committerCosta Tsaousis (ktsaou) <costa@tsaousis.gr>
Wed, 7 May 2014 23:28:47 +0000 (02:28 +0300)
apps_plugin.c

index 512b766289634842c45cf780664f368a80ca8f7e..c830225c1da17bdcd11075590608e7b0b57a20b6 100755 (executable)
@@ -27,6 +27,7 @@
 \r
 unsigned long long Hertz = 1;\r
 \r
+long processors = 1;\r
 long pid_max = 32768;\r
 int debug = 0;\r
 \r
@@ -94,15 +95,17 @@ void parse_args(int argc, char **argv)
        int i = 1;\r
 \r
        debug = 0;\r
-       if(strcmp(argv[i], "debug") == 0) {\r
+       if(i < argc && strcmp(argv[i], "debug") == 0) {\r
                debug = 1;\r
                i++;\r
        }\r
 \r
-       update_every = atoi(argv[i++]);\r
-       if(update_every == 0) {\r
-               i = 1;\r
-               update_every = 1;\r
+       if(i < argc) {\r
+               update_every = atoi(argv[i++]);\r
+               if(update_every == 0) {\r
+                       i = 1;\r
+                       update_every = 1;\r
+               }\r
        }\r
 \r
        for(; i < argc ; i++) {\r
@@ -707,56 +710,56 @@ void show_charts(void)
 \r
        // we have something new to show\r
        // update the charts\r
-       fprintf(stdout, "CHART apps.cpu '' 'Applications CPU Time' 'cpu time %%' apps apps stacked 20001 %d\n", update_every);\r
+       fprintf(stdout, "CHART apps.cpu '' 'Apps CPU Time (100%% = %ld core%s)' 'cpu time %%' apps apps stacked 20001 %d\n", processors, (processors>1)?"s":"", update_every);\r
        for (w = wanted_root; w ; w = w->next) {\r
                if(w->target || (!w->processes && !w->exposed)) continue;\r
 \r
-               fprintf(stdout, "DIMENSION %s '' incremental 100 %llu\n", w->name, Hertz);\r
+               fprintf(stdout, "DIMENSION %s '' incremental 100 %llu\n", w->name, Hertz * processors);\r
        }\r
 \r
-       fprintf(stdout, "CHART apps.rss '' 'Applications Memory' 'MB' apps apps stacked 20002 %d\n", update_every);\r
+       fprintf(stdout, "CHART apps.rss '' 'Apps Memory' 'MB' apps apps stacked 20002 %d\n", update_every);\r
        for (w = wanted_root; w ; w = w->next) {\r
                if(w->target || (!w->processes && !w->exposed)) continue;\r
 \r
                fprintf(stdout, "DIMENSION %s '' absolute %ld %ld\n", w->name, sysconf(_SC_PAGESIZE), 1024L*1024L);\r
        }\r
 \r
-       fprintf(stdout, "CHART apps.threads '' 'Applications Threads' 'threads' apps apps stacked 20005 %d\n", update_every);\r
+       fprintf(stdout, "CHART apps.threads '' 'Apps Threads' 'threads' apps apps stacked 20005 %d\n", update_every);\r
        for (w = wanted_root; w ; w = w->next) {\r
                if(w->target || (!w->processes && !w->exposed)) continue;\r
 \r
                fprintf(stdout, "DIMENSION %s '' absolute 1 1\n", w->name);\r
        }\r
 \r
-       fprintf(stdout, "CHART apps.processes '' 'Applications Processes' 'processes' apps apps stacked 20004 %d\n", update_every);\r
+       fprintf(stdout, "CHART apps.processes '' 'Apps Processes' 'processes' apps apps stacked 20004 %d\n", update_every);\r
        for (w = wanted_root; w ; w = w->next) {\r
                if(w->target || (!w->processes && !w->exposed)) continue;\r
 \r
                fprintf(stdout, "DIMENSION %s '' absolute 1 1\n", w->name);\r
        }\r
 \r
-       fprintf(stdout, "CHART apps.cpu_user '' 'Applications CPU User Time' 'cpu time %%' apps none stacked 20020 %d\n", update_every);\r
+       fprintf(stdout, "CHART apps.cpu_user '' 'Apps CPU User Time (100%% = %ld core%s)' 'cpu time %%' apps none stacked 20020 %d\n", processors, (processors>1)?"s":"", update_every);\r
        for (w = wanted_root; w ; w = w->next) {\r
                if(w->target || (!w->processes && !w->exposed)) continue;\r
 \r
-               fprintf(stdout, "DIMENSION %s '' incremental 100 %llu\n", w->name, Hertz);\r
+               fprintf(stdout, "DIMENSION %s '' incremental 100 %llu\n", w->name, Hertz * processors);\r
        }\r
 \r
-       fprintf(stdout, "CHART apps.cpu_system '' 'Applications CPU System Time' 'cpu time %%' apps none stacked 20021 %d\n", update_every);\r
+       fprintf(stdout, "CHART apps.cpu_system '' 'Apps CPU System Time (100%% = %ld core%s)' 'cpu time %%' apps none stacked 20021 %d\n", processors, (processors>1)?"s":"", update_every);\r
        for (w = wanted_root; w ; w = w->next) {\r
                if(w->target || (!w->processes && !w->exposed)) continue;\r
 \r
-               fprintf(stdout, "DIMENSION %s '' incremental 100 %llu\n", w->name, Hertz);\r
+               fprintf(stdout, "DIMENSION %s '' incremental 100 %llu\n", w->name, Hertz * processors);\r
        }\r
 \r
-       fprintf(stdout, "CHART apps.major_faults '' 'Applications Major Page Faults' 'page faults/s' apps apps stacked 20010 %d\n", update_every);\r
+       fprintf(stdout, "CHART apps.major_faults '' 'Apps Major Page Faults (swaps in)' 'page faults/s' apps apps stacked 20010 %d\n", update_every);\r
        for (w = wanted_root; w ; w = w->next) {\r
                if(w->target || (!w->processes && !w->exposed)) continue;\r
 \r
                fprintf(stdout, "DIMENSION %s '' incremental 1 1\n", w->name);\r
        }\r
 \r
-       fprintf(stdout, "CHART apps.minor_faults '' 'Applications Minor Page Faults' 'page faults/s' apps apps stacked 20011 %d\n", update_every);\r
+       fprintf(stdout, "CHART apps.minor_faults '' 'Apps Minor Page Faults' 'page faults/s' apps apps stacked 20011 %d\n", update_every);\r
        for (w = wanted_root; w ; w = w->next) {\r
                if(w->target || (!w->processes && !w->exposed)) continue;\r
 \r
@@ -787,6 +790,22 @@ unsigned long long get_hertz(void)
        return hz;\r
 }\r
 \r
+long get_processors(void)\r
+{\r
+       char buffer[1025], *s;\r
+       int processors = 0;\r
+\r
+       FILE *fp = fopen("/proc/stat", "r");\r
+       if(!fp) return 1;\r
+\r
+       while((s = fgets(buffer, 1024, fp))) {\r
+               if(strncmp(buffer, "cpu", 3) == 0) processors++;\r
+       }\r
+       fclose(fp);\r
+       processors--;\r
+       if(processors < 1) processors = 1;\r
+       return processors;\r
+}\r
 \r
 long get_pid_max(void)\r
 {\r
@@ -797,29 +816,11 @@ unsigned long long usecdiff(struct timeval *now, struct timeval *last) {
                return ((((now->tv_sec * 1000000ULL) + now->tv_usec) - ((last->tv_sec * 1000000ULL) + last->tv_usec)));\r
 }\r
 \r
-void mysleep(unsigned long long susec)\r
-{\r
-       while(susec) {\r
-               struct timeval t1, t2;\r
-\r
-               gettimeofday(&t1, NULL);\r
-\r
-               if(debug) fprintf(stderr, "Sleeping for %llu microseconds\n", susec);\r
-               usleep(susec);\r
-\r
-               gettimeofday(&t2, NULL);\r
-\r
-               unsigned long long diff = usecdiff(&t2, &t1);\r
-               \r
-               if(diff < susec) susec -= diff;\r
-               else susec = 0;\r
-       }\r
-}\r
-\r
 int main(int argc, char **argv)\r
 {\r
        Hertz = get_hertz();\r
        pid_max = get_pid_max();\r
+       processors = get_processors();\r
 \r
        parse_args(argc, argv);\r
 \r
@@ -857,7 +858,7 @@ int main(int argc, char **argv)
                if(usec < (update_every * 1000000ULL)) susec = (update_every * 1000000ULL) - usec;\r
                else susec = 0;\r
 \r
-               mysleep(susec);\r
+               usleep(susec);\r
 \r
                bcopy(&now, &last, sizeof(struct timeval));\r
        }\r