Преди като използвах apache2-mpm-prefork за MaxClients го определях по следния начин. Пускам ps -ylC apache2 --sort:rss и гледам в колоната RSS колко RAM средно ми заема 1 процес. Щом съм пуснал php-но числото беше в рамките на 10-12МВ. След това си разделям наличната RAM на средното което съм видял и получавам колко да ми е MaxClients. Ако го превишиш почва да заслуапва. Ако си го на целил никога не ти пипа swap-а а просто винаги ти заема всичката налична RAM. Все пак имай предвид, че ако не си си конфигурирал и други процеси адекватно може те да са причина за използване на swap при максимален товар на Apache-то. Сега след като минах на apache2-mpm-worker за обслужването на 200 клиента имам 7 апач процеса които ми заемат около 3 МВ всеки. Имам налична даже над 130МВ.
Сметката с VmRSS не е много надеждна, особено що се отнася до динамични сайтове. Причината е че..мммм...извадката не е много представителна. Може просто да си уцелил момент, в който apache процесите са изяли по-малко памет. Утре примерно някой може да промени PHP кода, това по някакъв начин да промени memory usage pattern-a и да излезе че ти е трябвала всъщност 2 пъти повече памет, отколкото сметките базирани на моментното състояние. Един малко по-добър вариант е да вземеш high watermark-a на apache процесите:
for a in `pidof apache2`; do grep VmHWM /proc/$a/status; done|sort|uniq
Въпросната стойност е нещо от сорта на "откакто съществува този процес, коя е най-високата стойност на изядената от него RAM".
Това пак не е надеждно, но е по-добре от някаква моментна стойност и съответно е малко по-близка до най-лошия възможен вариант.
Друго, което забелязах: бих те посъветвал да не ползваш KeepAlive когато имаш нисък лимит за MaxClients, защото така става по-възможно да останеш без свободни worker-и, които да ти обслужват клиентите. Или ако ще ползваш, намали KeepAliveTimeout-а (то 2 секунди си е нисък де, но все пак да си кажа).
Логиката е следната: представи си че имаш нисък Maxclients лимит (20 да речем). Имаш относително висок, да речем 20-секунден KeepAliveTimeout. За улеснение да речем че едновременно ти се връзват 20 клиента и правят някаква малка заявка. В продължение на 20 секунди, няма да може да се закачи нов клиент, защото всичките 20 worker-a са ти заети да чакат следващата заявка от клиентската конекция.
Да, от keepalive понякога се намазва, обаче има и един друг момент че браузърите и прокситата имат навика да кешират разни обекти и след това да не бълват по 50 GET заявки, за да ти визуализират една страница. Така че не е много сигурно дали ще спечелиш толкова много, това си зависи от usage pattern-а.