[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

process wakeups



-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

One of the worst problems wrt energy savings we have today are all the
wakeups processes request.  This is not just an issue for laptops, it
relevant everywhere.

To see the size of the problem run the attached systemtap script.  On my
laptop I see the following output (47 secs runtime):

  uid | poll select  epoll itimer  futex nanosle signal| process
29799 |15941   7971      0      0      0       0      0| npviewer.bin
29841 |  253      0      0      0   1531       0      0| thunderbird-bin
 3017 |  447      0      0      0      0       0      0| pulseaudio
 2467 |   76      0      0      0      0       0      0| hald
 2471 |    8      0      0      0      0       0      0| hald-runner
 2620 |   58      0      0      0      0       0      0| NetworkManager
13174 |  214      0      0      0      0       0      0| stapio
 3044 |   48      0      0      0      0       0      0| gnome-panel
 9115 |   16      0      0      0      0       0      0| nm-vpnc-service
 3112 |   32      0      0      0      0       0      0| gpk-update-icon
 3108 |   24      0      0      0      0       0      0| nm-applet
 3052 |  274      0      0      1      0       0      0| gnome-terminal
 3115 |   29      0      0      0      0       0      0| gnome-power-man
 3055 |   16      0      0      0      0       0      0| bluetooth-apple
 3093 |   16      0      0      0      0       0      0| krb5-auth-dialo
 2633 |   16      0      0      0      0       0      0| gdm-binary
 2724 |   16      0      0      0      0       0      0| gdm-simple-slav
 2630 |   16      0      0      0      0       0      0| nm-system-setti
 2470 |   16      0      0      0      0       0      0| console-kit-dae
 2385 |   16      0      0      0      0       0      0| avahi-daemon
 2397 |   16      0      0      0      0       0      0| libvirtd
 2725 |   63    214      0      4      0       0      0| Xorg
 2150 |   42      0      0      0      0       0      0| setroubleshootd
 3010 |   47      0      0      0      0       0      0| gnome-settings-
 3040 |  111      0      0      0      0       0      0| metacity
 3526 |   37      0      0      0      0       0      0| notification-da
 3085 |   49      0      0      0      0       0      0| wnck-applet
 3043 |   50      0      0      0      0       0      0| gnome-screensav
 3042 |   26      0      0      0      0       0      0| nautilus
 3050 |    8      0      0      0      0       0      0| evince
 9120 |    0      5      0      0      0       0      0| vpnc
 3342 |   11      0      0      0      0       0      0| clock-applet
 3329 |    0      6      0      0      0       0      0| pam_timestamp_c
 2337 |    0      7      0      0      0       0      0| sendmail
 2132 |    0      0      0      0     33       0      0| automount
 2958 |    0      3      0      0      0       0      0| ssh-agent
 2118 |    1      0      0      0      0       0      0| dbus-daemon
 5732 |    1      0      0      0      0       0      0| gnome-vfs-daemo
29394 |   68    131      0      0     65       0      0| firefox
 2105 |    1      0      0      0      0       0      0| audispd
 1979 |    0      1      0      0      0       0      0| rsyslogd


As you can see, not all programs are equally bad and proprietary ones
(here: flash) are the worst.

Still, since the script records wakeups due to timeouts almost all
mentions on this list are bad.  Programs should be woken based on
events.  They shouldn't poll data (which is what usually happens after a
timeout).

I would hope the package maintainers can find some time and look at the
issues.  Maybe at least document them in a BZ.  I might try to do the
latter myself but given the large number of packages involved I'll most
likely be able to cover just a few packages.  IMO it should be a release
criteria that a program does use polling.

- --
➧ Ulrich Drepper ➧ Red Hat, Inc. ➧ 444 Castro St ➧ Mountain View, CA ❖
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org

iEYEARECAAYFAkh7y9oACgkQ2ijCOnn/RHTW6wCfWzYOn3AvjLvJ5mwWjSZwr8tX
Z84An2YYvqd9f2fkPGenE5uhDDdsan3y
=VWLu
-----END PGP SIGNATURE-----
# Copyright (C) 2008 Red Hat, Inc.
# Written by Ulrich Drepper <drepper redhat com>
global process
global poll_timeouts
global epoll_timeouts
global select_timeouts
global itimer_timeouts
global nanosleep_timeouts
global futex_timeouts
global signal_timeouts

probe kernel.function("do_sys_poll").return {
      if ($return == 0) {
         p = pid()
	 if (!(p in process))
            process[p] = execname()
      	 poll_timeouts[p]++
      }
}

probe kernel.function("do_select").return {
      if ($return == 0) {
         p = pid()
         if (!(p in process))
            process[p] = execname()
      	 select_timeouts[p]++
      }
}

probe kernel.function("sys_epoll_wait").return {
      if ($return == 0) {
         p = pid()
         if (!(p in process))
            process[p] = execname()
      	 epoll_timeouts[p]++
      }
}

probe kernel.function("do_futex").return {
      if ($return == -110) {
         p = pid()
         if (!(p in process))
            process[p] = execname()
      	 futex_timeouts[p]++
      }
}

probe kernel.function("hrtimer_nanosleep").return,
      kernel.function("sys_clock_nanosleep").return {
      if ($return == 0) {
         p = pid()
         if (!(p in process))
            process[p] = execname()
      	 nanosleep_timeouts[p]++
      }
}

probe kernel.function("it_real_fn") {
        p = pid()
        itimer_timeouts[p]++
        if (!(p in process))
            process[p] = execname()
}

probe kernel.function("sys_rt_sigtimedwait").return {
      if ($return == -11) {
         p = pid()
         if (!(p in process))
            process[p] = execname()
      	 signal_timeouts[p]++
      }
}

probe kernel.function("do_exit") {
        p = pid()
        if (process[p] == execname()) {
                delete process[p]
		poll_timeouts[p] = 0
  		epoll_timeouts[p] = 0
  		select_timeouts[p] = 0
  		itimer_timeouts[p] = 0
  		futex_timeouts[p] = 0
  		nanosleep_timeouts[p] = 0
		signal_timeouts[p] = 0
        }
}

probe timer.ms(1000) {
        printf("\033[2J\033[1;1H") /* clear screen */
        printf ("  uid |   poll  select   epoll  itimer   futex nanosle  signal| process\n");
        foreach (p in process) {
		if (poll_timeouts[p] != 0 || select_timeouts[p] != 0
                    || epoll_timeouts[p] != 0 || itimer_timeouts[p] != 0
 		    || futex_timeouts[p] != 0 || nanosleep_timeouts[p] != 0
		    || signal_timeouts[p] != 0)
                	printf ("%5d |%7d %7d %7d %7d %7d %7d %7d| %-.38s\n", p,
                        	poll_timeouts[p], select_timeouts[p],
                        	epoll_timeouts[p], itimer_timeouts[p],
				futex_timeouts[p], nanosleep_timeouts[p],
                        	signal_timeouts[p], process[p])
        }
}

Attachment: timeout.stap.sig
Description: Binary data


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]