From 49e5b2a93339869703d581a06f8d903f8371ab60 Mon Sep 17 00:00:00 2001 From: WaLyong Cho Date: Fri, 25 Apr 2014 00:50:51 +0900 Subject: bootchart: add control group option --- src/bootchart/bootchart.c | 11 ++++++++++- src/bootchart/bootchart.conf | 1 + src/bootchart/bootchart.h | 2 ++ src/bootchart/store.c | 6 ++++++ src/bootchart/svg.c | 5 +++-- 5 files changed, 22 insertions(+), 3 deletions(-) (limited to 'src/bootchart') diff --git a/src/bootchart/bootchart.c b/src/bootchart/bootchart.c index 9f72d98126..a73418af7e 100644 --- a/src/bootchart/bootchart.c +++ b/src/bootchart/bootchart.c @@ -78,6 +78,7 @@ bool initcall = true; bool arg_relative = false; bool arg_filter = true; bool arg_show_cmdline = false; +bool arg_show_cgroup = false; bool arg_pss = false; int samples; int arg_samples_len = 500; /* we record len+1 (1 start sample) */ @@ -113,6 +114,7 @@ static void parse_conf(void) { { "Bootchart", "PlotEntropyGraph", config_parse_bool, 0, &arg_entropy }, { "Bootchart", "ScaleX", config_parse_double, 0, &arg_scale_x }, { "Bootchart", "ScaleY", config_parse_double, 0, &arg_scale_y }, + { "Bootchart", "ControlGroup", config_parse_bool, 0, &arg_show_cgroup }, { NULL, NULL, NULL, 0, NULL } }; _cleanup_fclose_ FILE *f; @@ -143,6 +145,7 @@ static int parse_args(int argc, char *argv[]) { {"init", required_argument, NULL, 'i'}, {"no-filter", no_argument, NULL, 'F'}, {"cmdline", no_argument, NULL, 'C'}, + {"control-group", no_argument, NULL, 'c'}, {"help", no_argument, NULL, 'h'}, {"scale-x", required_argument, NULL, 'x'}, {"scale-y", required_argument, NULL, 'y'}, @@ -151,7 +154,7 @@ static int parse_args(int argc, char *argv[]) { }; int c; - while ((c = getopt_long(argc, argv, "erpf:n:o:i:FChx:y:", options, NULL)) >= 0) { + while ((c = getopt_long(argc, argv, "erpf:n:o:i:FCchx:y:", options, NULL)) >= 0) { int r; switch (c) { @@ -170,6 +173,9 @@ static int parse_args(int argc, char *argv[]) { case 'C': arg_show_cmdline = true; break; + case 'c': + arg_show_cgroup = true; + break; case 'n': r = safe_atoi(optarg, &arg_samples_len); if (r < 0) @@ -217,6 +223,7 @@ static int parse_args(int argc, char *argv[]) { fprintf(stderr, " that are of less importance or short-lived\n"); fprintf(stderr, " --cmdline, -C Display the full command line with arguments\n"); fprintf(stderr, " of processes, instead of only the process name\n"); + fprintf(stderr, " --control-group, -c Display process control group\n"); fprintf(stderr, " --help, -h Display this message\n"); fprintf(stderr, "See bootchart.conf for more information.\n"); exit (EXIT_SUCCESS); @@ -458,9 +465,11 @@ int main(int argc, char *argv[]) { old->sample = old->sample->next; free(oldsample); } + free(old->cgroup); free(old->sample); free(old); } + free(ps->cgroup); free(ps->sample); free(ps); diff --git a/src/bootchart/bootchart.conf b/src/bootchart/bootchart.conf index 48fad02726..d7e0dabe09 100644 --- a/src/bootchart/bootchart.conf +++ b/src/bootchart/bootchart.conf @@ -18,3 +18,4 @@ #PlotEntropyGraph=no #ScaleX=100 #ScaleY=20 +#ControlGroup=no diff --git a/src/bootchart/bootchart.h b/src/bootchart/bootchart.h index 968c38da26..2c3783580d 100644 --- a/src/bootchart/bootchart.h +++ b/src/bootchart/bootchart.h @@ -77,6 +77,7 @@ struct ps_struct { char name[256]; int pid; int ppid; + char *cgroup; /* cache fd's */ int sched; @@ -114,6 +115,7 @@ extern int pscount; extern bool arg_relative; extern bool arg_filter; extern bool arg_show_cmdline; +extern bool arg_show_cgroup; extern bool arg_pss; extern bool arg_entropy; extern bool initcall; diff --git a/src/bootchart/store.c b/src/bootchart/store.c index 78c5cf85ec..e0719838d5 100644 --- a/src/bootchart/store.c +++ b/src/bootchart/store.c @@ -37,6 +37,7 @@ #include "strxcpyx.h" #include "store.h" #include "bootchart.h" +#include "cgroup-util.h" /* * Alloc a static 4k buffer for stdio - primarily used to increase @@ -315,6 +316,11 @@ schedstat_next: ps->starttime = strtod(t, NULL) / 1000.0; + if (arg_show_cgroup) + /* if this fails, that's OK */ + cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, + ps->pid, &ps->cgroup); + /* ppid */ sprintf(filename, "%d/stat", pid); fd = openat(procfd, filename, O_RDONLY); diff --git a/src/bootchart/svg.c b/src/bootchart/svg.c index 7438e472fb..a53f98a941 100644 --- a/src/bootchart/svg.c +++ b/src/bootchart/svg.c @@ -1093,12 +1093,13 @@ static void svg_ps_bars(void) { w = starttime; /* text label of process name */ - svg(" [%i]%.03fs\n", + svg(" [%i]%.03fs %s\n", time_to_graph(w - graph_start) + 5.0, ps_to_graph(j) + 14.0, ps->name, ps->pid, - (ps->last->runtime - ps->first->runtime) / 1000000000.0); + (ps->last->runtime - ps->first->runtime) / 1000000000.0, + arg_show_cgroup ? ps->cgroup : ""); /* paint lines to the parent process */ if (ps->parent) { /* horizontal part */ -- cgit v1.2.3-54-g00ecf