Какво ще рече 10 хиляди потребителя едновременно? 10.000 установени сесии (=логнати потребители там), 10 хиляди HTTP заявки за определено време или 10 хиляди паралелни HTTP заявки?
Забравете apache да сервира 20 хиляди паралелни заявки. Знам че това е hard лимита, но на практика, трудно постижимо е дори 500 едновременни заявки да се обслужат - това би изисквало доста мощен хардуер. С mpm_prefork особено дори и това би било ужасно добро постижение.
При това, говоря за статично съдържание и малки файлчета. Някакви PHP скриптове, които правят заявки до backend база ще понесат значително по-нисък паралелизъм. За който не вярва - да се пробва с httperf - уникално прост начин да DoS-неш кофти size-нати уеб сървъри. Ако направиш грешката да сервираш динамично съдържание и да издъниш MaxClients, някой хубав ден ще завариш машинката тръшната с OOM грешки заради някой шегаджия

Принципно е много трудно да се напише сървър, който да понася такъв висок паралелизъм (хиляди паралелни заявки). При Apache има два варианта - mpm_prefork, който изпълнява отделните заявки в рамките на отделни процеси и mpm_worker, който ги изпълнява в отделни нишки. Процесите са по-"скъпи" от нишките, защото работят в отделни контексти, с отделни адресни пространства и превключването между тях е по-бавно. Отделно комуникацията между тях (IPC-то) е бавна, защото изисква намесата на ядрото и копиране на памет. Друг кофти момент с процесите е че въпреки, че в адресното им пространство може да има мапната обща памет, някои неща си остават private. Колкото повече процеси имаш, толкова повече private данни, ерго толкова по-висока утилизация на паметта...и в един хубав момент физическата памет свършва, почва се page-ване и производителността загива...а може и по-лошо да стане, да свърши и swap-а и тогава става наистина грозно.
С нишките, нещата са малко по-добре, но всяка нишка се конкурира с останалите за процесорно време. Синхронизацията между нишките (понякога) изисква намеса на ядрото, демек не е казано че става светкавично. Гръмването на една нишка води до умирането на целия процес и следователно всички останали нишки в рамките на процеса. Освен което, ако ползваш PHP скриптове - не всички PHP extension-и са thread-safe, в един прекрасен момент, работещ код може да гръмне и затова няма как да си виновен ти.
Големите глави са измислили и друг вариант - мултиплексиране на I/O - създават се множества от сокети и има функции, които ги poll-ват и ако се появи събитие на някой сокет, може да се обслужи. Така, голям брой сокети могат да се обслужват само от един процес или нишка и това става доста бързо. Лошото в цялата работа обаче е че Apache не работи по този начин (за разлика промерно от postfix). Този метод си има недостатъци така или иначе, примерно една блокираща операция където и да е, ще блокира целия сървърен процес. Сега представи си, че имаш PHP скрипт, който викне да речем sleep() - целия сървър ще "заспи" и други заявки няма да се обслужват през това време

Та очевидно Apache трудно ще работи по този начин, освен ако не сервира само статично съдържание. Но при все това, разработчиците му не са го направили да работи по този начин.