(I would've loved to call this article "Silence of the LAMP" but the
machine in question is not primarily a webserver - and I have some
issues with the M and P part, but that's yet another article).

As noted below I updated my dialup
gateway a couple of days ago and I wanted to follow up with some
additional information on how to tweak a machine like that. First some
technical details: It's based on the VIA Epia platform with a 1 GHz
Nemiah CPU (C3) in a small barebone case with a 200W power unit (ITX,
i think). It has 512MB of RAM, 2x160GB HDD as a RAID 1 (mirror). The
only PCI slot is filled with an active ISDN card (AVM B1). The board
itself is pretty cool for dialup servers, because it has two ethernet
NICs (via-rhine) and not much other gimmicks you wouldnt need anyway
(audio, several USB ports, even some GPIO stuff which isnt documented,
afaik).
Design goals
The machine is to serve my general needs in my home network: give me
internet access and protect me from it. It is hooked up to my
DSL-modem and ISDN-terminator and works as a masquerading gateway (aka
nat) and firewall. It serves my workstation and various other hardware
from my museum and whatever friends bring. Mainly DHCP, DNS, Samba
shares and a printer, NFS, lpr-printing, internal web server and some
special purpose applications as well as shell access when I'm not
home.
It is up 24/7 and it is located in my flat. So it has to be as quiet
as possible, consume as little power as possible and still be there
when I need it.
Hardware choice and preparations
Most consumer hardware is not meant to be running 24/7. Also most
people dont want to have a 19" rack in the kichen (I wouldnt mind
actually, but i dont have the space). So I went for Epia for its small
form factor and because it is meant to be used for appliances like
mine. CPU power is not what you would expect from 1Ghz (feels more
like 600Mhz on a PIII), but this box is not meant for number-crunching
anyway.
For reasons mentioned below the hard disk is a RAID of two mirrored
drives. If possible, use drives that are meant to be used in
servers. Consumer disks _will_ crash sooner than later (i learned this
the hard way). The little extra fee is definitly worth it. Still, a
single drive is too dangerous, even monitoring it might not give an
advance warning before failure. I have the linux software raid setup
on virtually all of my machines now (should I write about it?) and I
did play the disk-failure game more than once.

Dust is a serious problem for
long-running hardware, especially in my flat. The fans dont like it
and it makes the interior ugly. The case I use has a grill in the
front panel which I vacuum once a year and the little holes on the
side are covered with nylon stockings from the inside. Pretty
effective as shown here. To reduce case vibration I applied some
fragments of sealing strip (about 6, 1cm each) between the frame and
the cover. Makes closing the case a little tricky.
Reduce power consumption
Not only for economical reasons is a reduced power consumption a good
idea. Energy produces heat which has to be transported out, which
requires noise fans (I will leave the philosophical and ethical
aspects of energy consumption as an exercise for the reader).

IMHO, there are three main factors
that determine energy consumption of a setup like this. First, there
is the total amount of energy needed for all related devices. Second
is the CPU and third is the hard disk.

When optimizing a setup like this
people tend to forget all the little devices we have in our flats that
all have a small power converter and constantly need something simple
like 5 or 12V DC. Both of which are readily available from the power
supply unit of a normal PC. Reducing the number of power units
involved reduces the wasted energy because each unit works much less
than 100% effective. Also, most PC power units work most effective
when they are used with about 80% of their designed output. So adding
a device or two is no problem or even a good idea. I hooked up my DSL
modem to the machine serving the internet (I dont need the one without
the other, when one device fails there is no further reduction of
quality-of-life). Another candidate would be the base of the cordless
phone that is in the vicinity anyway. The images here show a little
adapter that provides 12V DC via a standard plug. The device could
convert it to other voltages, too, but I wouldnt trust that cheap
little thing too much. I cant even find it in the online shop I bought
it anymore (perhaps it turned out to be too dangerous :). But you can
tap into the power cables directly or even use some mA from the USB
ports (as all those silly gadgets at ThinkGeek do).
Reducing CPU power (consumption)
Most modern CPUs have ways to reduce their power consumption by
reducing their speed and by lowering their core voltage. My C3
processor does that with the 'longhaul' kernel module. I use the
powernowd to
measure CPU utilization and react accordingly. There are more
sophisticated approaches but this one is easy to set up and effective
without being too intrusive.
Results and current speed are visible in
/proc/cpuinfo
directly. The idle machine runs at 665Mhz but as soon as something CPU
intensive (like compiling a kernel) is done, it goes back to
1Ghz. Keep in mind that such a machine is idle about 99% of the day,
it only does some simple tasks when I'm actually at home, awake and
using my workstation - and even then it's usually bored.
Reducing hard disc noise
Now, this is probably the most interesting and challenging part of
this operation. As stated above the machine is idle most of the day so
it is only logical that it should turn off the hard disk motors during
that time. This sounds simple because modern drives have built-in
logic for that. The problem lies in making sure that nothing happens
on the drive when the machine is basically idle. This turns out to be
pretty difficult.
First you have to have
enough RAM so that everything the
running services need end up cached. This is no problem nowadays, the
512MB are plenty (the old box had 96MB and about the same
services). The most important thing to do is to
mount all
filesystems with noatime. It's a little known fact that the
filesystem not only records the creation and last-modified timestamps
of each file but also when it was last accessed. This way even
read-only (and eventually cached) file operations result in traffic on
the drive (observing users might notice a short blink of the HDD LED
about every 5s). The noatime mount option turns this off.
The next logical thing is to make all running applications stop
writing when they are idle. This is mostly
syslogd -m 0 to
disable the useless "MARK" lines in /var/log/messages. This trick was
enough for my old box to send the HDD to sleep most of the
day. Unfortunately the new services make it virtually impossible to
have silence in /var/log and /var/run - most notably samba which
maintains endless databases and logfiles of what is happening on the
wire (interesting how much traffic a single redmond-OS host can
require to not-use a share and a printer on a samba host). This felt
like a dead end.
The solution comes in form of silent, solid state, non-volatile
memory: cheap USB 2.0 flash rom sticks. I use one with 1GB - a joke
compared with the 1GB my old box had as a HDD. For a simple appliance
you could pack the entire OS installation with room for a decade of
logfiles on a 2 or 4GB model. This would work even internally with
an
adapter like this and a compact flash device.
As indicated above, /var/log is not enough to put on that flash
memory. The entire /var filesystem on the other hand would be too much
because it may contain stuff that grows large: /var/cache/apt for all
the downloaded Debian packages and /var/lib/mysql for some local
databases. So I put those in /varhdd and bind-mount them to their old
place (so that I do not have to reconfigure the services or remember
the fact). The fstab contains this:
/dev/sda1 /var ext3 noatime,errors=remount-ro 0 0
/varhdd/cache/apt /var/cache/apt none bind 0 1
/varhdd/lib/mysql /var/lib/mysql none bind 0 1
Of course: USB core and mass storage have to be built into the kernel
and the mount points have to exist on the out-sourced /var
filesystem.
(Oddly enough this even works with /var/cache/apt being exported via
NFS to the other Debian hosts. Seems bind-mounting is different from
re-exporting mounted filesystems which works not that easy.)
It may be necessary to find other locations that are written by your
applications. I used a crude approach like this (because the lsof
manpage would have taken longer to read):
lsof | sed 's/^\([^ ]*\).* \([^ ]*\)$/\2 - \1/' | sort | uniq | less
To configure the disks to spin down,
hdparm has to be set up
(/etc/hdparm.conf) for each drive:
/dev/hdc {
mult_sect_io = 16
write_cache = on
dma = on
spindown_time = 240
}
Read the manpage for the parameter format, it's silly. Those 240 means
20 minutes which works for me. Making it too short results in too many
spindown/spinup cycles, making it too long wastes noise and energy.
Conclusion
So far it works. I am yet to measure the actual power consumption of
the idle and busy setup which would allow me to calculate how much it
actually costs per year. But perhaps I dont wanna know :)
Also, when the disks have to spin up, the i/o-operation can take up to
12s to complete (or even start). So a little patience is required to
log into the idle machine.
Finally, the box is not completely silent, yet. There are still three
fans: A large one in the power supply unit and two small ones in the
case and on top of the CPU. I cannot tell if they are all temperature
controlled or if I have to do anything about it. I'll have to
experiment with lm-sensors (and the vt1211 module) some more.