Prime Numbers for the Win!

June 21, 2009

I minored in Mathematics in college. But as much as I have always loved math, I use it surprisingly little during my day-to-day computer programming. Perhaps this is why I’m excited about the latest Byobu releases.

Byobu-2.12 and 2.13 have introduced some tremendous performance enhancements, mostly surrounding the status gathering scripts.

I have gone over each of these with a fine-toothed comb, trying to make them as efficient as possible. I wrote a testing framework that ran these scripts millions of times to identify the most expensive operations. The improvements mostly involved reducing the number of shells and forks necessary to gather and print the information, and using files resident in memory, such as /var/run and /proc. In the long run, these scripts would probably perform better as compiled C programs. But I’m not yet willing to give up the simplicity and portability of the current shell scripts.

Aside from the scripts’ contents, I also modified the intervals in which they run.

In Ubuntu 9.04, screen-profiles-1.44 ran the status scripts at the following intervals:

2 cpu-freq
2 load-average
2 mem-used
2 network-down
2 network-up
2 processes
2 reboot-required
2 wifi-quality
10 updates-available
10 users
30 battery
60 uptime
600 ec2-cost
3600 hostname
3600 release
86400 arch
86400 cpu-count
86400 logo
86400 mem-available
86400 menu
86400 whoami

This means that:

  • Every 2 seconds, Byobu will run each of (cpu-freq, load-average, mem-used, network-down, network-up, processes, reboot-required, wifi-quality).
  • Every 10 seconds, Byobu will run (updates-available, users), plus all of the 2-second scripts.
  • Every 30 seconds, Byobu runs (battery), plus the 10-second scripts, plus the 2-second scripts.
  • Every 60 seconds, Byobu runs (uptime), plus the 30-second, 10-second, and 2-second scripts.
  • etc.

These particular intervals result in some unfortunate harmonics, which are not a good thing in terms of Byobu’s responsiveness. The battery script, for instance, only runs twice a minute because it’s relatively expensive. However, at that 30-second interval, the battery script must also share time with the 10- and 2-second scripts. As you can see, we’re going to have a couple of standing waves, that periodically cause some rather expensive refreshes of Byobu’s status bar.

This was reported as several bugs, noting that Byobu causes screen to “stutter” every 2 seconds or so, with an even longer “delay” at 10 seconds. In older versions of Byobu, if you toggle all status notifications “on”, and then scroll through a rather long file, you’ll see it pause or stutter every few seconds. Try, `find /lib | less`, and hold the down-arrow key.

How do we solve this problem? Prime numbers!

If we set the Byobu status updates to happen at prime intervals, rather than (2, 10, 30, 60, …), we can greatly reduce the expensive, compounded updates. We can spread the updates out more evenly over time, without stacking them up as much and creating particularly expensive intervals.

Based on the automated testing and statistical analysis of each script, Byobu is now configured to run the status scripts at the following prime numbered intervals:

2 cpu_freq
2 load_average
3 network
5 mail
5 reboot_required
7 processes
11 users
13 disk
13 mem_used
17 wifi_quality
19 temp_c
19 temp_f
29 uptime
61 battery
181 updates_available
599 release
601 ec2_cost
607 hostname
613 ip_address
86011 logo
86017 cpu_count
86027 mem_available
86029 whoami
86077 arch

Now, at any given time interval, we’ll only run the status updates corresponding to the prime factors of that interval. So instead of a relatively expensive set of updates running at the 60-second mark, we only run 5 scripts (cpu_freq, load_average, network, mail, reboot_required), rather than 12 scripts in the old model!

The following chart shows time (in seconds) on the x-axis, and the number of scripts that need to run on the y-axis. In red, you have data from screen-profiles-1.44 (in Ubuntu 9.04), and in blue, you have current byobu-2.13 (in Karmic). We have reduced the average number of scripts that need to run per second. More importantly, we have tremendously reduced the harmonic spikes where previously we peaked running a dozen or more scripts at any one time.

In the latest Byobu release (2.13), responsiveness should be much better. The network status item is still the most expensive notification, but even it has improved. With the network item turned off, though, there should be no noticeable stutter in your Byobu sessions.

Prime numbers for the win!



2 Responses to “Prime Numbers for the Win!”

  1. Dima Says:

    My first extensive ssh experience started with screen-profiles and I thought it was my server very old and that's why it takes a 10-second nap every 2-minutes. Now I know =) gonna test that version now.

  2. Mackenzie Says:

    Any happy primes?

    </Dr Who reference>

Leave a Reply

Please log in using one of these methods to post your comment: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: