Overview:
This is a very simple program that will adjust the speed of your CPU
depending on system load.  It works as a client of the CPUFreq driver.
It is designed for use with CPU's supporting AMD's PowerNow power management
scheme, as it's algorithm works better if there are more then two CPU
speeds available.  (aka, ARM, AMD K6/K7, Via C3, and Crusoe as opposed to
traditional Intel and Ultrasparc).

This program is essentially a simple client to the CPUFreq sysfs interface.
This means that you -need- to be running Linux v2.5 or later that includes
the sysfs interface.  This daemon will -not- work with the CPUFreq driver
interface included in Linux v2.4.  Feel free to write your own daemon
to support that if you like; you can even use this as a starting point.
If there's enough clamoring for it, then maybe I'll whip up something.
You also need a CPU that supports frequency scaling and supports the CPUFreq
interface.  This code has been tested on various AMD and PPC processors

I have been running this daemon on my AMD laptop for over 2 years with no
problems to report, and it's nice that my laptop remains cool unless I'm
really doing something intensive, like watching DivX movies, without me
having to manually intervene and set the speed. I just recently bought an
Apple iBook G3, and powernowd-0.80 worked flawlessly on it right out of
the box.


Features:

This daemon's goal is simplicity and speed.  It doesn't try and make
too many decisions for you.  That's its beauty, but it may not be what
everyone's looking for. Some of the features this daemon has:

One, simple heuristic to determine CPU load: "user + sys" time.
Ignore "niced" programs (setiathome, itself, etc). In my mind this is
consistent with what is meant when someone 'nice's a program to begin
with. (configurable in v0.85+) Designed for CPU's that support more
then two speed states, but works well with anything.  Very fast, low
overhead /proc/stat gathering (method stolen from procps).  Supports SMP
Will automatically switch to 'userspace' governor.  Care taken to make
the code non-root exploitable (but please audit for yourself first!)
Frequency step size is configurable (default to 100MHz/step) 4 different
behavioral modes to choose from (SINE, AGGRESSIVE, PASSIVE, LEAPS),
which determine the behavior when the load changes. Configurable from the
command line.  Written in C for speed and simplicity.  Logging to stdout
or syslog Configurable Polling frequency in milliseconds (defaults to 1s)
Configurable highwater/lowwater marks for CPU usage. (defaults 80/20%)

Many similar daemons use other methods to determine what speed to use,
such as battery status, AC status, temperature, fan status, etc. They all
have their place.  I however feel that in the grand scheme of things none
of the above matters. When I'm not using my CPU, I don't care if it's
running at a slower speed. When I -am- using my CPU, I only need it to
be fast enough to handle the task at hand without hiccuping. And when I'm
taxing my CPU, I want it running full speed. That's all this daemon does,
monitor CPU load and adjust the speed accordingly.  Since in all reality
my CPU is idle 99% of the time (or playing mp3's which it can easily do
at it's lowest speed rating), this by definition leads to low power usage,
low temperatures, low speed fans, and better battery life.
