My main work machine is a pretty old X41 with a 40GB hard disk and 512MB of RAM. It is more than five years old and is not without problems. (In recent months, I have to try several before switching it on successfully – in most cases, it just beeps twice and displays "Keyboard error, <F1> to configure" and the keyboard doesn't work.)
However, there's a thing which annoys me a lot: bad performance.
I use a resource-friendly window manager with some
running. Apart from the memory-hog Firefox, I very seldom use any
graphical application (ie. any program using the GTK or Qt libraries).
For some weeks now I've been trying this cgroups hack, with mixed results. In some cases, the performance is better, sometimes it's not.
How bad could the overall performance be, then? – Unfortunately, very bad. Which has, in part, to do with my slow hard disk. It does uncached reading with 18MB/s in theory:
$ sudo hdparm -t /dev/sda /dev/sda: Timing buffered disk reads: 56 MB in 3.08 seconds = 18.21 MB/sec
In reality, it's rather some 16.5MB/s:
$ dd if=/dev/zero of=./zero bs=1048576 count=256 256+0 records in 256+0 records out 268435456 bytes (268 MB) copied, 10.0246 s, 26.8 MB/s $ time cat zero > /dev/null cat zero > /dev/null 0.01s user 0.25s system 1% cpu 16.246 total
Now, I have to live with this (SSD's are still very expensive!). The main problem here is that the Kernel swaps out data that wasn't accessed for a while (although, from a naïve perspective, there's no ultimate need to do so since there's still free memory left).
I actually notice that with two programs regularly:
urxvtfor some time, opening a new one might take up to 5 seconds; initializing the shell another two.
Now I always thought this was the Linux Kernel being stupid. However I discovered a switch today. From the sysctl.vm documentation:
swappiness This control is used to define how aggressive the kernel will swap memory pages. Higher values will increase agressiveness, lower values decrease the amount of swap. The default value is 60.
Debian (like all other distros) seem to keep this default value. After
reading up on some articles I set
/etc/sysctl.conf. (You can do this interactively with
vm.swappiness=0 also. Interestingly, Ubuntu recommends a value of
10 for desktop systems.)
For the past day or so, I have been monitoring the output of
1 every now and then (especially the swap in/out parameters
so). But even after the first hour one thing is evident: the
interactive system performance is much, much better. It feels like
a machine upgrade.
Terminals open instantly (because the initialization parts of their binary doesn't get swapped out, for example). Switching to Firefox is instant. Switching tabs is fast. The system feels a lot more responsive.
Where's the drawback, then? If you could magically tune your system's performance, why wouldn't you want do that?
A case where this setup will give you a headache is when you actually do run out of memory. I easily accomplished that by opening Gimp on a huge (blank) file. Now, working with Gimp is easy now; switching to Firefox takes ages (heavy swapping). So there a not-so-agressive swapping policy would be better if you switch between several memory-hogging applications a lot.
(Side note: When there's a lot of free memory left – for example after closing Gimp – the kernel step by step swaps in certain blocks again, a few every second so as to not disturb system performance. I saw this going on for several minutes on a otherwise completely idle system.)
Conclusion: For the usage pattern I'm accustomed to, setting
vm.swappiness=0 actually is a huge performance improvement. But your
mileage may vary.