Watching streaming video in Linux can be frustrating. The Flash web browser process (npviewer.bin) consumes a lot of processor time and it significantly raises the cpu temperature.

I could live with Flash’s piggishness if it delivered good video. Unfortunately, Flash seems to stutter when you use CPU “on demand” frequency scaling to cut power consumption. On my desktop PC with an AMD BE-2400 dual core, I couldn’t get Firefox in Ubuntu 9.04 (64-bit) to stream an ESPN3 sports broadcast without missing half the action.

I found a good solution in this blog article. The default ondemand scaling threshold in Ubuntu is 95. This means that if your CPU is running at less than full power, it won’t jump to the next speed until it’s 95% busy. By setting a lower threshold than 95, you can force the CPU to scale up under moderate usage. Changing the threshold to a lower value like 40 completely fixed my problem.

I took the commands documented in the article and made the cputhresh script shown below. It pokes the proper values into the processor settings. I run it selectively when I need to watch a Flash broadcast. For example:

  • cputhresh set sets threshold to 40
  • cputhresh set NN sets threshold to NN, where NN is any number between 20 and 95
  • cputhresh reset resets threshold back to 95
!/bin/sh

# cputhresh utility, adapted from:
# http://allredb.wordpress.com/2009/05/07/speed-up-flash-and-firefox-in-ubuntu-jaunty-904
# Sets ondemand cpu threshold lower than default
# in order to scale up CPU to fater speeds when running Flash under Firefox

case "$1" in
    set)
        if [ "$2" ] && [ "$2" -ge 20 ] && [ "$2" -le 95 ]; then
            INDEX="$2"
        else
            INDEX=40
        fi
        for CPU_THRESHOLD in /sys/devices/system/cpu/cpu*/cpufreq/ondemand/up_threshold
        do
            [ -f $CPU_THRESHOLD ] || continue
            echo -n $INDEX > $CPU_THRESHOLD
            cat $CPU_THRESHOLD
        done
        ;;
    reset)
        for CPU_THRESHOLD in /sys/devices/system/cpu/cpu*/cpufreq/ondemand/up_threshold
        do
            [ -f $CPU_THRESHOLD ] || continue
            echo -n 95 > $CPU_THRESHOLD
            cat $CPU_THRESHOLD
        done
        ;;
    show)
        for CPU_THRESHOLD in /sys/devices/system/cpu/cpu*/cpufreq/ondemand/up_threshold
        do
            [ -f $CPU_THRESHOLD ] || continue
            cat $CPU_THRESHOLD
        done
        ;;
    *)
        echo "Usage: $0 set|reset|show" >&2
        exit 3
        ;;
esac

Instead of this script, you could also just switch to using the “performance” frequency scaling setting. However, the advantage of bumping the threshold is that you’re retaining the power saving advantages of ondemand frequency scaling.