Updated CPU frequency scaling script

This is an update to my earlier command line frequency scaling script. This version uses the dialog utility to provide a rudimentary GUI.

  1. #!/bin/bash
  2. # Wrapper to easily set the CPU Frequency Governor
  3. # dialog is a utility installed by default on all major Linux distributions.
  4. # But it is good to check availability of dialog utility on your Linux box.
  6. which dialog &> /dev/null
  8. [ $? -ne 0 ]  && echo "Dialog utility is not available, please install it" && exit 1
  10. # Check that a valid governor is set
  12. # Creating an array with each of the CPUs numeric ID
  13. declare -a  CPUs=( `cat /proc/cpuinfo |grep processor |cut -f 2 -d \:` )
  15. # Setting up the dialogue interface:
  16.  dialog --clear --backtitle "Console Based CPU Governor Selection" --title "MAIN MENU" \
  17.     --menu "Use [UP/DOWN] key to move" 18 100 6 \
  18.     "performance" "Set for maximum performance, watch the temp!" \
  19.     "ondemand"  "Usually the default, scale speed up as required." \
  20.     "conservative"    "Conservatively scale up as required." \
  21.     "powersave"     "Maximum power savings or lowest temp." \
  22.     "userspace"      "Send control to a userspace application." \
  23.     "EXIT"      "TO EXIT" 2> menuchoices.$$
  25. # This computes the number of elements in the array, we use this to control our loop in the SetSpeed function
  26. elements="${#CPUs[*]}"
  28. SetSpeed ()
  29. {  

Setting the CPU Frequency Govenor from the Command Line

Most modern processors support some level of frequency scaling, that is they change the speed or frequency that they are running at in order to reduce energy consumption. You can usually change the frequency with a GUI app but what happens if there is no GUI running (on say a server). The command is called cpufreq-set. You can get details (like processor statistics and current governor in use. Both of these are provided by the cpufrequtils package which you can just apt-get or aptitude install

The problem is that cpufreq-set only sets one core or CPU at a time. On a dual or quad socket this could get quite tedious. Fortunately there is an easy solution.

  1. for each in `cat /proc/cpuinfo |grep processor |cut -f 2 -d \:` ;do sudo cpufreq-set -c $each -g performance ; done

What I do is run a small little bash script that iterates over all the CPUs and sets the governor to one set as a parameter to the script.

  1. #!/bin/bash
  2. # Wrapper to easily set the CPU Frequency Governor
  4. # Check that a valid governor is set
  6. GOVERNOR=$1
  8. USAGE="This script requires a CPU governor as an argument, which should be one of: conservative, ondemand, userspace, powersave, performance
  9. For example: cpuscale.sh ondemand"
  11. if [ "$#" = "0" ]; then
  12.         echo "$USAGE"
  13.         exit 1
  14. fi
  16. # Creating an array with each of the CPUs numeric ID

Syndicate content