A quad processor server with 16GB of memory is able to run 200-300 Evolution sessions very easily. No tuning or changes are required to Linux or Evolution, it just works. However, one has to modify libgnomecups to scale over about 20 concurrent users. We are prepping a SLED server for deployment, and I had to make this change once again. I've made it twice before on various older versions of libgnomecups.
If you have over 20 concurrent Evolution users and people print their email (which they do!), cupsd gets hammered and consumes a lot of resources. It appears that if you print once from Evolution, you continue to always request status information from cupsd repeatedly until you close the current session. Cupsd is unable to keep up with the requests fast enough and what happens is that the Evolution composer window gets horribly unresponsive. The letters appear in the text widget at about 1/5 the speed of what you can type.
Before the patch, here is what cupds looks like with around 40 concurrent users. Notice cupds consuming CPU time. At the time of the shot, no print jobs were in the queue.
I make the following change to the code and recompile:
diff gnome-cups-printer.c.orig gnome-cups-printer.c
< #define UPDATE_TIMEOUT 5000 --- > #define UPDATE_TIMEOUT 500000
diff gnome-cups-queue.c.orig gnome-cups-queue.c
< #define UPDATE_TIMEOUT 3000 --- > #define UPDATE_TIMEOUT 300000
I then replace the stock libraries and reboot and today with identical user load, cupsd barely shows and the slow typing issue is fixed.
The server is now ready for 200-300 concurrent users. I'm not sure why Evolution keeps polling cupsd after a print job has been submitted. This change makes no apparent changes to the print process. libgnomecups should be altered in a manner that scales better, or at a minimum allow an environmental variable to be read. That would eliminate the requirement for a patch and recompile.