Показать сообщение отдельно
Старый 11.10.2011, 23:43   #46
iopiop
Кандидат наук
 
Регистрация: 24.12.2010
Сообщений: 254
Репутация: 31232

По умолчанию Re: Nginx - парадокс

Цитата:
Сообщение от Raistlin Посмотреть сообщение
Максимальному количеству потоков оно никогда равно небыло. Я не знаю, что такое нитка в данном контексте. Нитками я шью. Так вот два процесса апача могут обслуживать к примеру, 40 потоков данных.
повторяем в четвертый раз (уже как мантра):

The maximum number of clients that may be served simultaneously (i.e., the maximum total number of threads in all processes) is determined by the MaxClients directive.

threads - это, по-вашему, потоки. в вашем примере MaxClient = 40. и все, остальные соединения будут ждать пока эти отработают.
домашнее задание - выставьте MaxClient=2 попробуйте открыть страничку какую-нибудь с кучей картинок, посмотрите как долго она будет открываться. для большего счастья выставьте Keep-Alive = 60.

Цитата:
Сообщение от Raistlin Посмотреть сообщение
Ну и найдите 10 отличий...
суть, как отметил товарищ выше, в том, что в апаче применяются блокирующие сокеты, т.е. одно соединение требует одну нитку (поток). В ngnix используются неблокирующие сокеты, поэтому количество соединений на одну нитку (поток) определяется на самом деле только количеством памяти, которое ОС может выделить под буферы + накладные расходны одной нитки (потока).
Поэтому рекомендуемое количество ниток (потоков) в nginx равно количеству ядер процессора + 1 - больше не имеет смысла. А в апаче количество ниток (потоков) приходится выставлять сотнями, чтобы обслужить все соединения.

iopiop добавил 11.10.2011 в 23:51
Цитата:
Сообщение от Raistlin Посмотреть сообщение
т.е. нить = поток? Угу. Мало отличаются только переключением контекста. На переключение контекста тратится много ресурсов? =).
на архитектуре WinNT только переход из user land в kernel требует порядка 800 тактов процессора. а это только малая часть. На линуксе к сожалению точными цифрами не владею.
Но в любом случае, когда у вас 10К ниток (потоков) - накладные расходы очень велики, для каждой нитки (потока) сохранить содержимое регистров процессора, сохранить стек - а он у каждой нитки (потока) свой, в кеш проца это все не влазит, значит все падает в память, да еще и планировщик должен перекидывать нитки (потоки) из одной очереди в другую по хитрому алгоритму, пытаясь угодить всем 10К ниткам (потокам).
это как с комарами, один комар - не страшно, а вот когда 10К комаров....

Последний раз редактировалось iopiop; 11.10.2011 в 23:54.. Причина: Добавлено сообщение
iopiop вне форума   Ответить с цитированием