sugar start-up profiling

riccardo riccardo.lucchese at gmail.com
Fri Aug 1 02:55:50 EDT 2008


On Thu, 2008-07-31 at 17:27 +0100, Tomeu Vizoso wrote:
> On Tue, Jul 29, 2008 at 3:15 PM, riccardo <riccardo.lucchese at gmail.com> wrote:
> > Problem: sugar starts up slowly on the xo
> >
> > Tests were ran on an xo after a clean joyride-2181 install plus
> > sucrose's activities.
> >
> > A graph of the ending part of the boot process can be found at:
> > http://dev.laptop.org/~rlucchese/boot/boot.stats.svg
> > (http://dev.laptop.org/~rlucchese/boot/boot.stats)
> >
> > It was obtained by running:
> > $ picker -t 75 -o /tmp/boot.stats &
> > $ grapher -i boot.stats -c10
> >
> > The sampling period begins in `start()' in haldaemon's init script and
> > lasts 75 seconds.
> >
> > The following tab shows cpu usage of the 10 processes that took more cpu
> > time during the sampling time:
> > $ grapher -i boot.stats -c13 -r cpu
> >
> >  tot%   ps%     cmdline
> >  -----------------------
> >        27.7    /bin/sh /usr/bin/sugar
> >  44.6   16.8    jffs2_gcd_mtd0
> >  51.7   7.1     /usr/bin/env python /usr/bin/sugar-activity journal...
> >  56.2   4.5     python /usr/bin/datastore-service
> >  60.6   4.4     picker -t75 -o /tmp/boot.stats
> >  64.3   3.8     python /usr/sbin/rainbow-daemon --daemon
> >  68.0   3.6     xinit /usr/bin/olpc-session -- /usr/bin/X -fp built-ins...
> >  71.3   3.3     /bin/sh /usr/bin/olpc-session
> >  74.1   2.8     python /usr/bin/sugar-shell-service
> >  76.9   2.8     python /usr/bin/sugar-presence-service
> >  79.7   2.8     python /usr/sbin/rainbow-daemon --daemon
> >  81.2   1.5     hald
> >  82.6   1.4     ohmd
> >
> > Renicing jffs2_gcd_mtd0 to 19 in haldaemon's init script slightly
> > speeds-up the last
> > part of the boot:
> > $ cat /home/olpc/.boot_time.prev  (clean joyride)
> > 56.27
> >
> > $ cat /home/olpc/.boot_time
> > 54.14
> >
> > Note however that when renicing jffs2_gcd_mtd0, boot timings `became
> > less deterministic, sometimes being slower than the `clean install'
> > case. Stopwatch timings (from boot loader to fully redrawn shell):
> > clean install : 1m34.0s
> > renice trick  : 1m30.2s +[0. to 4.5 sec]
> >
> > Would it be possible to make DS, sugar-presence-service and
> > sugar-shell-service system services and thus decoupling them from the
> > shell's start-up?
> 
> Don't think so, as they look to me as quite tied to the user session.
> What we should do (for 9.1.0) with the sugar-shell-service and the
> journal is to run them inside the shell process, saving memory and
> startup time. And we certainly shouldn't block when activating any
> services, they should be started asynchronously.

The DS seems to me a good candidate for being decoupled from the shell's
startup.

> 
> > A script was run that cat'ed all files (5700+) that sugar tries to open
> > on boot. (http://dev.laptop.org/~rlucchese/boot/cat_sugar_startup_files)
> >
> > $ time sh cat_sugar_startup_files
> > real 0m16.9s
> > user 0m1.0s
> > sys  0m12.2s
> >
> > Timings vary a lot when repeating the test (+-~30%).
> > `top' shows that the remaining time goes to io-wait.
> >
> > Why don't those files get cached when repeating the test ?
> 
> Interesting, anybody with kernel knowledge could comment on this?
> 
> > cProfile statistics (KCG format) for sugar-shell (start-up only):
> > http://dev.laptop.org/~rlucchese/boot/cProfile-shell
> >
> > Functions ordered by self-time (%):
> >  32.2   gtk.main()
> >  19.6   send_message_with_reply_and_block of dbus
> >  12.8   block of dbus.lowlevel.PendingCall
> >  7.3   grab of sugar._sugarext.KeyGrabber
> >  3.    _add_weight of sugar/shell/view/home/grid.py
> >  2.7  render_cairo of rsvg.Handle
> >  1.12 __getitem__ of sugar/shell/view/home/grid.py
> > ---------------------------------------------------
> >  78.7 %
> >
> > Perhaps some dbus calls can be made asynchronous; this is taking 30+% of
> > start-up time.
> 
> Yup. Mostly service activation, see above.
> 
> > It's curious that `grab` takes so much time: I don't see anything
> > obvious looking at the code.
> 
> Yeah, we should look at it, could be quite tasty low hanging fruit (7%).
> 
> > Note that the layout for the favorite's view was set to the ring type;
> > why is the shell computing weights in this case?
> 
> I guess that's for the mesh and friends view?
Oh, right!
+1 for changing the algorithm.

> 
> > High level tasks/functions ordered by total-time:
> >  67.3   gtk.main()
> >  33.6   __init__ of sugar/view/Shell.py
> >  16.8   _start_journal_idle of sugar/view/Shell.py
> >  11.6   __init__ shell/view/keyhandler.py
> >  7.5   add sugar/shell/view/home/spreadlayout.py
> >
> > Note that 45% of Shell.__init__ and the 89% of _start_journal_idle
> > went to blocking dbus calls.
> 
> Just service activation, right?

> > The datastore service and the journal will be profiled in separate
> > sessions.
> 
> Cool, that will be interesting as well.
> 
> Nice job, in case startup time becomes a priority, we know now where to look at.
> 
> Thanks,
> 
> Tomeu

riccardo




More information about the Devel mailing list