[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