TipsAndTricks/InvestigatingBuildTime: Difference between revisions

From Yocto Project
Jump to navigationJump to search
(Placeholder for a Tips&Tricks on buildstats & pybootchartgui)
 
No edit summary
Line 1: Line 1:
== Investigating Build Time ==
== Investigating Build Time ==


Placeholder.  Demonstrate use of buildstats and pybootchartgui
(Placeholder.  Demonstrate use of buildstats and pybootchartgui)
 
The <tt>buildstats</tt> data produce by the class with the same name if included in <tt>USER_CLASSES</tt> variable
provides '''process statistics''' for every task. This data  can offer insight of the time spent by the builder (<tt>bitbake</tt>) when
constructing a particular target at process level. This article focus more on profiling than optimization, the former being
the base for the latter.
 
=== Setup ===
 
  $ cd poky
  $ git checkout -b morty origin/morty
  $ . oe-init-build-env
  $ bitbake world
 
=== Build Machine ===
 
Build time depends on the build machine HW and for this particular article we use a Linux box with the following characteristics:
 
 
=== Buildstats ===
 
There are two set of process' stat data: time and IO stats. For the moment, the time stats to be used are the following:
 
 
* /proc/[pid]/stat: utime, stime
* /proc/[pid]/stat: cutime, cstime
* python resource module: rusage ru_utime, rusage ru_stime
* python resource module: Child rusage ru_utime, Child rusage ru_stime
 
and the following IO stats:
 
* /proc/[pid]/io: IO rchar, IO wchar
* /proc/[pid]/io: IO read_bytes, IO write_bytes
 
With this separation of buildstats, proceed running the following script (once the <code>bitbake world</code> command has finished)
to plot the top N stat consumers
 
$ ../scripts/contrib/bb-perf/buildstats-plot.sh -s <BUILDSTATS> -N $N | gnuplot -p
 
In case we want a more general picture, getting data per task type instead of recipe's task, the script needs <code>-S</code> (for Sum)
argument
 
$ ../scripts/contrib/bb-perf/buildstats-plot.sh -s <BUILDSTATS> -S | gnuplot -p
 
 
=== Results ===
 
$ IMAGE='set terminal png fontscale 1 size 1280,720; set output "IO-write_bytes:IO-read_bytes.png"'
 
==== utime and stime ====
 
Time spent by a certain process can be obtain looking at the <tt>stime<</tt> and <tt>time</tt> corresponding to the amount of time the process
has been scheduled in kernel and user mode.
 
$ IMAGE='set terminal png fontscale 1 size 1280,720; set output "IO-write_bytes:IO-read_bytes.png"'
$ ../scripts/contrib/bb-perf/buildstats-plot.sh -s 'stime:utime' -N 20 > input.gpl; gnuplot -e "\'$IMAGE\'" input.gpl
$ ../scripts/contrib/bb-perf/buildstats-plot.sh -s 'stime:utime' -S | gnuplot -p

Revision as of 22:14, 14 November 2016

Investigating Build Time

(Placeholder. Demonstrate use of buildstats and pybootchartgui)

The buildstats data produce by the class with the same name if included in USER_CLASSES variable provides process statistics for every task. This data can offer insight of the time spent by the builder (bitbake) when constructing a particular target at process level. This article focus more on profiling than optimization, the former being the base for the latter.

Setup

 $ cd poky
 $ git checkout -b morty origin/morty
 $ . oe-init-build-env
 $ bitbake world

Build Machine

Build time depends on the build machine HW and for this particular article we use a Linux box with the following characteristics:


Buildstats

There are two set of process' stat data: time and IO stats. For the moment, the time stats to be used are the following:


  • /proc/[pid]/stat: utime, stime
  • /proc/[pid]/stat: cutime, cstime
  • python resource module: rusage ru_utime, rusage ru_stime
  • python resource module: Child rusage ru_utime, Child rusage ru_stime

and the following IO stats:

  • /proc/[pid]/io: IO rchar, IO wchar
  • /proc/[pid]/io: IO read_bytes, IO write_bytes

With this separation of buildstats, proceed running the following script (once the bitbake world command has finished) to plot the top N stat consumers

$ ../scripts/contrib/bb-perf/buildstats-plot.sh -s <BUILDSTATS> -N $N | gnuplot -p

In case we want a more general picture, getting data per task type instead of recipe's task, the script needs -S (for Sum) argument

$ ../scripts/contrib/bb-perf/buildstats-plot.sh -s <BUILDSTATS> -S | gnuplot -p


Results

$ IMAGE='set terminal png fontscale 1 size 1280,720; set output "IO-write_bytes:IO-read_bytes.png"'

utime and stime

Time spent by a certain process can be obtain looking at the stime< and time corresponding to the amount of time the process has been scheduled in kernel and user mode.

$ IMAGE='set terminal png fontscale 1 size 1280,720; set output "IO-write_bytes:IO-read_bytes.png"'
$ ../scripts/contrib/bb-perf/buildstats-plot.sh -s 'stime:utime' -N 20 > input.gpl; gnuplot -e "\'$IMAGE\'" input.gpl
$ ../scripts/contrib/bb-perf/buildstats-plot.sh -s 'stime:utime' -S | gnuplot -p