[systemd-devel] [PATCH 1/2] bootchart: add control group option

WaLyong Cho walyong.cho at samsung.com
Thu Apr 24 08:59:04 PDT 2014


On 04/25/2014 12:50 AM, WaLyong Cho wrote:
> ---
>  man/bootchart.conf.xml       |  5 +++++
>  man/systemd-bootchart.xml    |  7 +++++++
>  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 +++--
>  7 files changed, 34 insertions(+), 3 deletions(-)
> 
> diff --git a/man/bootchart.conf.xml b/man/bootchart.conf.xml
> index 68d10d4..68834c7 100644
> --- a/man/bootchart.conf.xml
> +++ b/man/bootchart.conf.xml
> @@ -145,6 +145,11 @@
>                                  graph components.</para></listitem>
>                          </varlistentry>
>  
> +                        <varlistentry>
> +                                <term><varname>ControlGroup=no</varname></term>
> +                                <listitem><para>Display process control group.</para></listitem>
> +                        </varlistentry>
> +
>                  </variablelist>
>          </refsect1>
>  
> diff --git a/man/systemd-bootchart.xml b/man/systemd-bootchart.xml
> index 1715d5d..d83d032 100644
> --- a/man/systemd-bootchart.xml
> +++ b/man/systemd-bootchart.xml
> @@ -198,6 +198,13 @@
>                          </varlistentry>
>  
>                          <varlistentry>
> +                                <term><option>-g</option></term>
> +                                <term><option>--control-group</option></term>
> +                                <listitem><para>Display process control group
> +                                </para></listitem>
> +                        </varlistentry>
> +
> +                        <varlistentry>
>                                  <term><option>-o</option></term>
>                                  <term><option>--output <replaceable>path</replaceable></option></term>
>                                  <listitem><para>Specify the output directory for the
> diff --git a/src/bootchart/bootchart.c b/src/bootchart/bootchart.c
> index 9f72d98..a73418a 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 48fad02..d7e0dab 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 968c38d..2c37835 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 78c5cf8..e071983 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 7438e47..a53f98a 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("  <text x=\"%.03f\" y=\"%.03f\"><![CDATA[%s]]> [%i]<tspan class=\"run\">%.03fs</tspan></text>\n",
> +                svg("  <text x=\"%.03f\" y=\"%.03f\"><![CDATA[%s]]> [%i]<tspan class=\"run\">%.03fs</tspan> %s</text>\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 */
> 

I got a sample bootchart with this.
https://plus.google.com/photos/106343169532951407028/albums/6005883428628194225/6005883432295588402


More information about the systemd-devel mailing list