bootchart: add control group option
This commit is contained in:
parent
e6c474723d
commit
49e5b2a933
|
@ -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>
|
||||
|
||||
|
|
|
@ -197,6 +197,13 @@
|
|||
</para></listitem>
|
||||
</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>
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -18,3 +18,4 @@
|
|||
#PlotEntropyGraph=no
|
||||
#ScaleX=100
|
||||
#ScaleY=20
|
||||
#ControlGroup=no
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue