Hehe, funny how things wander around the net
srcdsfpsboost is something I hacked up quickly and posted on the steampowered forums about a month ago (along with the source code, reproduced at the bottom for the curious).
Anyhow, I think 20mb per player is way over the top, at least for Linux servers. I run a 16-slot Linux dedicated server and have never seen hlds get into triple-figures memory usage wise (and yes it does fill to the brim on a regular basis). Possibly the Windows one is less efficient, but at least for Linux, 8mb/slot should be enough.
Also, hlds tends to fall apart CPU-usage wise around the 12-16 player mark. Up to 12 players, the CPU (a Duron 1600 in my case) is pretty much just idling (less than 5% usage in even the most intense firefights). However, once the number of players hits 16, CPU usage can get up to the 50% mark during heavy firefights. I haven't managed to get enough players organised to test scalability beyond this point, but it doesn't look promising.
Finally, if you run a Linux dedicated server (or a Windows console one) and also have the CS GCF files, you can save having to update both independently. Using GCFScape, extract the relevant GCF files to a temporary folder then copy across (as GCFScape won't overwrite files, apparently).
For CS:
Counter-Strike Base Content.gcf
Half-Life Base Content.gcf
For CS:S
Counter-Strike Source Shared Content.gcf
Base Source Shared Models.gcf
Base Source Shared Sounds.gcf
Base Source Shared Materials.gcf
HL2DM:
Half-Life 2 Deathmatch.gcf
Base Source Shared Materials.gcf
Base Source Shared Models.gcf
Base Source Shared Sounds.gcf
You need to extract the Windows/Linux dedicated server GCF as well (though you can't get the Linux server GCF through Steam). This extracts some stuff you don't need (such as textures) but saves having to download the same stuff twice. Good if you're on bandwidth-metered internet, for example.
#include <stdio.h>
#include <windows.h>
int main(void)
{
timeBeginPeriod(1);
printf("Press any key to restore normal timer frequency.\n");
getchar();
timeEndPeriod(1);
return 0;
}