ALT Linux sysadmins discussion
 help / color / mirror / Atom feed
* [Sysadmins] apache tuning in nginx presence
@ 2007-08-20 17:38 Michael Shigorin
  2007-08-21  5:55 ` Slava Dubrovskiy
  2007-08-22 11:16 ` Denis Smirnov
  0 siblings, 2 replies; 8+ messages in thread
From: Michael Shigorin @ 2007-08-20 17:38 UTC (permalink / raw)
  To: sysadmins

	Здравствуйте.
Тут нарисовались довольно любопытные тенденции по настройке 
apache-1.3 в качестве бэкенда за nginx.

Если традиционно предлагается[1] поднимать в заметной мере
параметры, отвечающие за количество свободных серверов,
то в случае приёма соединений nginx этот подход, похоже,
менее полезен и может быть вредным (увеличивается scheduling
overhead).

Например, если до внедрения nginx были задействованы такие
параметры:

MinSpareServers 5
MaxSpareServers 20
StartServers 12
MaxClients 12

и это было близко к оптимуму, то в случае, когда неспешные
коннекшны отрабатывает мультиплексирующий nginx, нам гораздо
интересней снизить scheduling overhead путём понижения количества
процессов, между которыми будет распределяться процессорное время:

MinSpareServers 1
MaxSpareServers 2
StartServers 3
MaxClients 4

На двухъядерной однопроцессорной системе (HP ML150 G3,
один Xeon 5140, 2G FBDIMM) под Linux 2.6.18 (Server 4.0)
и скедулере имени OpenVZ (который "двухэтажный" -- сперва
контейнеры, потом задачи в них) исключительно такое изменение
конфигурации только apache привело к изменению результатов
/usr/sbin/ab -n 100 -c 20 (сто запросов в двадцать потоков)
по страничке с форумом:

Time per request:       5505.80 -> 4478.60 [ms] (mean)
Requests per second:    3.63 -> 4.47 [#/sec] (mean)
Time per request:       275.29 -> 223.93 [ms] (mean, across all concurrent requests)

Percentage of the requests served within a certain time (ms)
  50%   4785 -> 4285
  66%   5825 -> 4472
  75%   6879 -> 4610
  80%   7076 -> 4681
  90%   8408 -> 4826
  95%   9112 -> 5005
  98%   9587 -> 5071
  99%   9656 -> 5136
 100%  11491 -> 5276 (last request)

При этом MySQL настроен по соотносящейся части так[2]:

thread_cache = 8
thread_concurrency = 2

Настройка ставила своей целью наличие не менее двух потенциально
конкурентных процессов на одно процессорное ядро согласно общей
практике расчёта оптимальной загрузки системы, но при этом
в отличие от обычных рекомендаций -- была направлена на разумную
минимизацию количества конкурирующих экземпляров httpd, которые
в данной постановке задачи занимаются почти исключительно работой
с веб-приложением, а не дисковым или сетевым I/O и таким образом
конкурируют практически исключительно за CPU и RAM.

Т.е. ограничение количества наиболее активных процессов до двух
на ядро позволило выиграть примерно 10% латентности по нижней
границе и более 50% -- по верхней.

Нагрузка выглядит как две пары httpd:mysql с распределением
потребления процессора примерно как 10:1 на каждое ядро;
уменьшение MaxClients до двух с тем, чтобы ещё снизить
конкуренцию, принесло ~10% уменьшение верхней границы (100%),
но при этом примерно на ту же величину подняло нижнюю границу.

Проварьировав связку с "1-2-3-4", получилось, что при количестве
одновременных подключений 4/20/40/100 среднее время на запрос
особенно не изменяется (скорость остаётся около 4.50/сек).
Последнее замерялось как -n 500 -c 100.

Если эти результаты окажутся полезными -- буду рад включить ещё
несколько комментариев в штатный httpd.conf нашего apache-1.3.x.

PS: народ в Bcc:, надеюсь, не обидится, что поленился форвардить :)

PPS: ещё надеюсь, что не открыл америку через Форточку :)

[1] http://people.redhat.com/alikins/system_tuning.html
[2] http://fly.osdn.org.ua/~mike/docs/mysql-tuning.txt

-- 
 ---- WBR, Michael Shigorin <mike@altlinux.ru>
  ------ Linux.Kiev http://www.linux.kiev.ua/


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Sysadmins] apache tuning in nginx presence
  2007-08-20 17:38 [Sysadmins] apache tuning in nginx presence Michael Shigorin
@ 2007-08-21  5:55 ` Slava Dubrovskiy
  2007-08-21  7:55   ` Michael Shigorin
  2007-08-22 11:16 ` Denis Smirnov
  1 sibling, 1 reply; 8+ messages in thread
From: Slava Dubrovskiy @ 2007-08-21  5:55 UTC (permalink / raw)
  To: ALT Linux sysadmin discuss

[-- Attachment #1: Type: text/plain, Size: 597 bytes --]

Michael Shigorin пишет:
> Тут нарисовались довольно любопытные тенденции по настройке 
> apache-1.3 в качестве бэкенда за nginx.
>   
Вот еще бы такое потестировать и для apache-2 ...
> Если эти результаты окажутся полезными -- буду рад включить ещё
> несколько комментариев в штатный httpd.conf нашего apache-1.3.x.
>   
Да, полезно очень. Спасибо.

-- 
WBR,
Dubrovskiy Vyacheslav


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/x-pkcs7-signature, Size: 3249 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Sysadmins] apache tuning in nginx presence
  2007-08-21  5:55 ` Slava Dubrovskiy
@ 2007-08-21  7:55   ` Michael Shigorin
  0 siblings, 0 replies; 8+ messages in thread
From: Michael Shigorin @ 2007-08-21  7:55 UTC (permalink / raw)
  To: ALT Linux sysadmin discuss

On Tue, Aug 21, 2007 at 08:55:09AM +0300, Slava Dubrovskiy wrote:
> > Тут нарисовались довольно любопытные тенденции по настройке
> > apache-1.3 в качестве бэкенда за nginx.
> Вот еще бы такое потестировать и для apache-2 ...

Потестируй ;-)  Я его сейчас не применяю.

-- 
 ---- WBR, Michael Shigorin <mike@altlinux.ru>
  ------ Linux.Kiev http://www.linux.kiev.ua/


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Sysadmins] apache tuning in nginx presence
  2007-08-20 17:38 [Sysadmins] apache tuning in nginx presence Michael Shigorin
  2007-08-21  5:55 ` Slava Dubrovskiy
@ 2007-08-22 11:16 ` Denis Smirnov
  2007-08-22 11:44   ` Michael Shigorin
  1 sibling, 1 reply; 8+ messages in thread
From: Denis Smirnov @ 2007-08-22 11:16 UTC (permalink / raw)
  To: shigorin, sysadmins

20.08.07, Michael Shigorin<mike@osdn.org.ua> написал(а):

> Если традиционно предлагается[1] поднимать в заметной мере
> параметры, отвечающие за количество свободных серверов,
> то в случае приёма соединений nginx этот подход, похоже,
> менее полезен и может быть вредным (увеличивается scheduling
> overhead).

Именно так. Есть одно принципиальное исключение -- надо учитывать
latency. То есть если по каким-то причинам время выдачи одним апачем
ответа существенно большое на отдельных страницах, то количество
бэкендов приходится увеличивать.


> MinSpareServers 5
> MaxSpareServers 20
> StartServers 12
> MaxClients 12

Везет... мне StartServer 50 надо было делать, а MaxClients 100 на
одном их хостов не хватало... А когда я их увеличил оказалось что надо
поднимать и в MySQL лимиты.

> и это было близко к оптимуму, то в случае, когда неспешные
> коннекшны отрабатывает мультиплексирующий nginx, нам гораздо
> интересней снизить scheduling overhead путём понижения количества
> процессов, между которыми будет распределяться процессорное время:
> MinSpareServers 1
> MaxSpareServers 2
> StartServers 3
> MaxClients 4

Что-то вроде. Правда логику по которой надо рассчитывать оптимум для
этих значений я так и не смог продумать.

> Time per request:       5505.80 -> 4478.60 [ms] (mean)

А что так дофига?

> Requests per second:    3.63 -> 4.47 [#/sec] (mean)
> Time per request:       275.29 -> 223.93 [ms] (mean, across all concurrent requests)
>
> Percentage of the requests served within a certain time (ms)
>   50%   4785 -> 4285
>   66%   5825 -> 4472
>   75%   6879 -> 4610
>   80%   7076 -> 4681
>   90%   8408 -> 4826
>   95%   9112 -> 5005
>   98%   9587 -> 5071

Я правильно понимаю, что это 5 секунд на ответ? И что только 50%
успевают получить ответ за 4 секунды?

>   99%   9656 -> 5136
>  100%  11491 -> 5276 (last request)
>
> При этом MySQL настроен по соотносящейся части так[2]:
>
> thread_cache = 8
> thread_concurrency = 2
>
> Настройка ставила своей целью наличие не менее двух потенциально
> конкурентных процессов на одно процессорное ядро согласно общей
> практике расчёта оптимальной загрузки системы,

Тут есть тонкость -- не все процессы хотят проц, многие хотят всего
лишь диск. Особенно касаемо MySQL. Именно поэтому я пока остановился
на логике "4 треда на ядро".

> но при этом
> в отличие от обычных рекомендаций -- была направлена на разумную
> минимизацию количества конкурирующих экземпляров httpd, которые
> в данной постановке задачи занимаются почти исключительно работой
> с веб-приложением, а не дисковым или сетевым I/O и таким образом
> конкурируют практически исключительно за CPU и RAM.

Дисковым I/O они не будут заниматься исключительно когда ты сделаешь
все на FastCGI каком. А пока у тебя на один запрос минимум:
а) прочитать код скрипта;
б) попытаться прочитать .htaccess (если он не отключен);
в) попытаться прочитать .htacces во всей иерархии каталогов до текущего;
г) намусорить в лог;

Далее, если используется PHP, то мы ещё обычно грузим все include'ы (а
если не грузим потому как умные и юзаем кэши, то тогда как минимум
stat на все include'ы по всей цепочке).

> Т.е. ограничение количества наиболее активных процессов до двух
> на ядро позволило выиграть примерно 10% латентности по нижней
> границе и более 50% -- по верхней.

А вот это бесспорно. nginx отлично справляется с сериализацией потоков
запросов. Собственно на том самом сайте где то установки nginx не
справлялось 100 дочек апача, сейчас их трудится несколько штук.

> Нагрузка выглядит как две пары httpd:mysql с распределением
> потребления процессора примерно как 10:1 на каждое ядро;
> уменьшение MaxClients до двух с тем, чтобы ещё снизить
> конкуренцию, принесло ~10% уменьшение верхней границы (100%),
> но при этом примерно на ту же величину подняло нижнюю границу.

Ты ещё обрати внимание на то, что на сайте обычно находятся страницы
которые исполняются сильно разное количество времени. И вот они могут
здорово тормозить всех остальных.

В теории необходимо их выносить и обслуживать отдельным апачем, и
nginx разруливать по разным апачам обращения к разным страницам.

> PPS: ещё надеюсь, что не открыл америку через Форточку :)

Вообще знание этих фактов позволяет заточить конфиги под один
конкретный сайт чтобы он летал со скоростью света. А вот придумать
более-менее универсальную схему крайне сложно. Мало того, я осмелюсь
утверждать что это практически невозможно.

Я как-то развлекался с идеей спроектировать особо шустрый хостинг для
особо сложных проектов. Так вот все закончилось на том, что либо с
самого начала проектирования сайта в процессе участвует головастый
товарищ, который каждые две секунды пинает всех по поводу того как
правильно писать код с точки зрения производительности, либо можно
слегка (в разы) поднять производительность силами грамотного админа
(который попытается порезать сайт на подсайты, натравить несколько
апачей на один и тот же сайт, разрулить между ними обращения со
стороны nginx, а дальше непрерывно мониторить и крутить настройки).

> [1] http://people.redhat.com/alikins/system_tuning.html
> [2] http://fly.osdn.org.ua/~mike/docs/mysql-tuning.txt

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Sysadmins] apache tuning in nginx presence
  2007-08-22 11:16 ` Denis Smirnov
@ 2007-08-22 11:44   ` Michael Shigorin
  2007-09-01 20:34     ` Денис Смирнов
  0 siblings, 1 reply; 8+ messages in thread
From: Michael Shigorin @ 2007-08-22 11:44 UTC (permalink / raw)
  To: sysadmins

On Wed, Aug 22, 2007 at 03:16:24PM +0400, Denis Smirnov wrote:
> То есть если по каким-то причинам время выдачи одним апачем
> ответа существенно большое на отдельных страницах, то
> количество бэкендов приходится увеличивать.

Угу, но это скорее anti-DoS уже получается.

> > MinSpareServers 5
> > MaxSpareServers 20
> > StartServers 12
> > MaxClients 12
> Везет... мне StartServer 50 надо было делать, а MaxClients 100
> на одном их хостов не хватало... А когда я их увеличил
> оказалось что надо поднимать и в MySQL лимиты.

Это у тебя так долго барахлишко тарахтело?

Я бы попробовал разбросать по разным апачам с разными лимитами
на время исполнения скрипта, наверное.  И всё-таки держать их 
не более двух-трёх на процессор, иначе ты всё равно только дольше
разрываешь скедулер.

> > и это было близко к оптимуму, то в случае, когда неспешные
> > коннекшны отрабатывает мультиплексирующий nginx, нам гораздо
> > интересней снизить scheduling overhead путём понижения
> > количества процессов, между которыми будет распределяться
> > процессорное время:
> > MinSpareServers 1
> > MaxSpareServers 2
> > StartServers 3
> > MaxClients 4
> Что-то вроде. Правда логику по которой надо рассчитывать
> оптимум для этих значений я так и не смог продумать.

Я ж писал -- по два активных процесса на CPU core, это довольно
известное правило оптимальной загрузки при наличии I/O (бишь
когда задача не исключительно в CPU и только в него упёрлась).

У меня в парах httpd/mysqld активным можно было считать httpd,
поскольку он отъедал примерно на порядок больше времени.

> > Time per request:       5505.80 -> 4478.60 [ms] (mean)
> А что так дофига?

Дели на 20 и учитывай, что это один двуствольный Xeon -- они 
для веба по всем тестам оптеронам проигрывают, как sr@ припомнил
аж на прошлой неделе. (если докинуть второй процессор, то
коэффициент масштабирования для dualcore ~0.78 на linpack,
для quad core xeon -- ~0.74 или около того)

> > Time per request:       275.29 -> 223.93 [ms] (mean, across all concurrent requests)

Это поделенное.

> > Percentage of the requests served within a certain time (ms)
> >   50%   4785 -> 4285
> Я правильно понимаю, что это 5 секунд на ответ? И что только
> 50% успевают получить ответ за 4 секунды?

На двадцать ;-)  За четыре с лишним, но поскольку обслуживаются
они в моём варианте ограничений более последовательно -- то кто
первый пришёл, тот более-менее первым и уйдёт.  Т.е. вися в
очереди, они не пытаются отгрызть свой кусочек процессора,
пока он не доступен в разумной мере (это когда накладные на
распределение не сопоставимы с распределяемым ресурсом).

Вместо двадцати запросов, которые попытаются считаться ~5 сек
ближе к одновременно, получается четыре, которые меньше чем за
полсекунды выплёвываются, потом следующие четыре, etc.

> > При этом MySQL настроен по соотносящейся части так[2]:
> > thread_cache = 8
> > thread_concurrency = 2
> > Настройка ставила своей целью наличие не менее двух
> > потенциально конкурентных процессов на одно процессорное ядро
> > согласно общей практике расчёта оптимальной загрузки системы,
> Тут есть тонкость -- не все процессы хотят проц, многие хотят
> всего лишь диск. Особенно касаемо MySQL. Именно поэтому я пока
> остановился на логике "4 треда на ядро".

Так у меня и получается 2*httpd+2*mysqld на ядро.
Опускание до 1* тоже описано, как и предполагалось -- хуже.

> > но при этом в отличие от обычных рекомендаций -- была
> > направлена на разумную минимизацию количества конкурирующих
> > экземпляров httpd, которые в данной постановке задачи
> > занимаются почти исключительно работой с веб-приложением,
> > а не дисковым или сетевым I/O и таким образом конкурируют
> > практически исключительно за CPU и RAM.
> Дисковым I/O они не будут заниматься исключительно когда ты
> сделаешь все на FastCGI каком. А пока у тебя на один запрос
> минимум:
> а) прочитать код скрипта;

Это не дисковое I/O, а shm в php-mmcache ;) (кстати, это только 
мне показалось или и php5-eaccelerator, и php5-xcache в 4.0
скорее прикидываются рабочими?)

> б) попытаться прочитать .htaccess (если он не отключен);
> в) попытаться прочитать .htacces во всей иерархии каталогов до текущего;

Это всё из дискового кэша.  Поскольку я люблю noatime для таких
разделов, да и вообще почти по умолчанию.

> г) намусорить в лог;

Вот это запись.

> > Т.е. ограничение количества наиболее активных процессов до
> > двух на ядро позволило выиграть примерно 10% латентности по
> > нижней границе и более 50% -- по верхней.
> А вот это бесспорно. nginx отлично справляется с сериализацией
> потоков запросов. Собственно на том самом сайте где то
> установки nginx не справлялось 100 дочек апача, сейчас их
> трудится несколько штук.

Так я и говорю -- попробуй _ограничить_ этими несколькими штуками.

> > Нагрузка выглядит как две пары httpd:mysql с распределением
> > потребления процессора примерно как 10:1 на каждое ядро;
> > уменьшение MaxClients до двух с тем, чтобы ещё снизить
> > конкуренцию, принесло ~10% уменьшение верхней границы (100%),
> > но при этом примерно на ту же величину подняло нижнюю границу.
> Ты ещё обрати внимание на то, что на сайте обычно находятся
> страницы которые исполняются сильно разное количество времени.
> И вот они могут здорово тормозить всех остальных.

Ессно.  Это было на стенде, хотя после переехало и в реальную
жисть на старый одномоторный P4 с IDE и DDR266.  На глаз ему
тоже несколько полегчало -- при том, что в отличие от стенда
там роботы топчутся и порой люди ходят.

> В теории необходимо их выносить и обслуживать отдельным апачем,
> и nginx разруливать по разным апачам обращения к разным
> страницам.

Да-да-да-да-да ;-)  Интересно, что я ещё написал, не прочитав 
уже написанное тобой там, чуть ниже? ;-)

> > PPS: ещё надеюсь, что не открыл америку через Форточку :)
> Вообще знание этих фактов позволяет заточить конфиги под один
> конкретный сайт чтобы он летал со скоростью света. А вот
> придумать более-менее универсальную схему крайне сложно. Мало
> того, я осмелюсь утверждать что это практически невозможно.

Ну я и не брался это утверждать.

> Я как-то развлекался с идеей спроектировать особо шустрый хостинг для
> особо сложных проектов. Так вот все закончилось на том, что либо с
> самого начала проектирования сайта в процессе участвует головастый
> товарищ, который каждые две секунды пинает всех по поводу того как
> правильно писать код с точки зрения производительности, либо можно
> слегка (в разы) поднять производительность силами грамотного админа
> (который попытается порезать сайт на подсайты, натравить несколько
> апачей на один и тот же сайт, разрулить между ними обращения со
> стороны nginx, а дальше непрерывно мониторить и крутить настройки).

Естественно.  Причём какой-нить редкого ума околовнедренец,
выключивший кэш на одной-единственной посещаемой странице ради
какой-нить своей финтифлюшки, может угробить весь сайт -- 
наблюдался тут не шибко давно один такой случай со стороны.

-- 
 ---- WBR, Michael Shigorin <mike@altlinux.ru>
  ------ Linux.Kiev http://www.linux.kiev.ua/


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Sysadmins] apache tuning in nginx presence
  2007-08-22 11:44   ` Michael Shigorin
@ 2007-09-01 20:34     ` Денис Смирнов
  2007-09-01 20:51       ` Michael Shigorin
  0 siblings, 1 reply; 8+ messages in thread
From: Денис Смирнов @ 2007-09-01 20:34 UTC (permalink / raw)
  To: shigorin, ALT Linux sysadmin discuss

[-- Attachment #1: Type: text/plain, Size: 5581 bytes --]

On Wed, Aug 22, 2007 at 02:44:25PM +0300, Michael Shigorin wrote:

>> То есть если по каким-то причинам время выдачи одним апачем
>> ответа существенно большое на отдельных страницах, то
>> количество бэкендов приходится увеличивать.
MS> Угу, но это скорее anti-DoS уже получается.

Если у тебя есть страницы которые по каким-то причинам могут сильно
тормозить -- то они сами по себе DoS. Соответственно для хостинга, где
запросто какой-нибудь умник таки может склепать подобную страницу,
подобная настройка сама по себе DoS. Увы :(


> >> MinSpareServers 5
> >> MaxSpareServers 20
> >> StartServers 12
> >> MaxClients 12
>> Везет... мне StartServer 50 надо было делать, а MaxClients 100
>> на одном их хостов не хватало... А когда я их увеличил
>> оказалось что надо поднимать и в MySQL лимиты.
MS> Это у тебя так долго барахлишко тарахтело?

Там автор поделия на PHP шибко умный. Это ещё оно быстро работало, после
того как я грязно матерясь смотрел на особо долгие запросы и ручками
создавал индексы.

MS> Я бы попробовал разбросать по разным апачам с разными лимитами
MS> на время исполнения скрипта, наверное.  И всё-таки держать их 
MS> не более двух-трёх на процессор, иначе ты всё равно только дольше
MS> разрываешь скедулер.

Разрывать-то разрываю. Но когда у тебя пускается одновременно 10 запросов
каждый из которых выполняется 5 секунд, а параллельно тарахтит ворох
запросов, каждый из которых обрабатывается десятки миллисекунд угадай что
будет от заниженого MaxClients.

> >> и это было близко к оптимуму, то в случае, когда неспешные
> >> коннекшны отрабатывает мультиплексирующий nginx, нам гораздо
> >> интересней снизить scheduling overhead путём понижения
> >> количества процессов, между которыми будет распределяться
> >> процессорное время:
> >> MinSpareServers 1
> >> MaxSpareServers 2
> >> StartServers 3
> >> MaxClients 4
>> Что-то вроде. Правда логику по которой надо рассчитывать
>> оптимум для этих значений я так и не смог продумать.
MS> Я ж писал -- по два активных процесса на CPU core, это довольно
MS> известное правило оптимальной загрузки при наличии I/O (бишь
MS> когда задача не исключительно в CPU и только в него упёрлась).
MS> У меня в парах httpd/mysqld активным можно было считать httpd,
MS> поскольку он отъедал примерно на порядок больше времени.

Ты сначала расскажи что такое "активный процесс" для обычного
web-приложения. Особенно с учетом того что часть запросов тормозиться о
диск, а часть о процессор. И ты заранее не знаешь какой из них к чему
более жручий. А распараллеливать надо исходя ещё и из этого (пока молотят
процессор несколько тредов, можно другими несколькими тредами создавать
проблемы HDD). При том что для _правильной_ дисковой системы (то бишь SCSI
какие) наборот нужно нагружать диск _параллельно_.

MS> Это не дисковое I/O, а shm в php-mmcache ;) (кстати, это только 
MS> мне показалось или и php5-eaccelerator, и php5-xcache в 4.0
MS> скорее прикидываются рабочими?)

Ты не забудь что нормальный кэш все-таки обязан сделать stat() на каждый
php-шник и все его include'ы, чтобы убедиться что он не обновился. Так что
не все так радужно. Вот в случае если у тебя это FastCGI какой
действительно не будет лишнего i/o.

Вполне возможно. xcache какие-то намеки на работоспособность даже делает
:) Но, возможно, это больше намеки чем работоспособность.

> >> Т.е. ограничение количества наиболее активных процессов до
> >> двух на ядро позволило выиграть примерно 10% латентности по
> >> нижней границе и более 50% -- по верхней.
>> А вот это бесспорно. nginx отлично справляется с сериализацией
>> потоков запросов. Собственно на том самом сайте где то
>> установки nginx не справлялось 100 дочек апача, сейчас их
>> трудится несколько штук.
MS> Так я и говорю -- попробуй _ограничить_ этими несколькими штуками.

Дык я-ж говорю -- пробовал. Получается DoS. Помнишь на f.i когда спамили
отдельные странички не грузились (по таймауту резались)? Так вот, в те
времена я на себе это ограничение и прочувствовал. Из-за нескольких
заспамленых страничек f.i ложился целиком и полностью. Потому что
несколько человек обращались к ним, и в результате весь остальной сайт был
попросту недоступен.

У меня есть идея как решить эту проблему, но решать надо не на уровне
апача, а на уровне nginx. Чтобы он держал connections pool с сервером
фиксированого размера, и имел два таких пула -- один общий, а один для
"тормозов". И если попался "тормоз" то переводил соединение в другой пул,
а первый -- освобождал.

Так по крайней мере DoS'а настройками не будет, хотя и исчезнет
возможность защитится от внешнего DoS'а.

>> В теории необходимо их выносить и обслуживать отдельным апачем,
>> и nginx разруливать по разным апачам обращения к разным
>> страницам.
MS> Да-да-да-да-да ;-)  Интересно, что я ещё написал, не прочитав 
MS> уже написанное тобой там, чуть ниже? ;-)

:)

MS> Естественно.  Причём какой-нить редкого ума околовнедренец,
MS> выключивший кэш на одной-единственной посещаемой странице ради
MS> какой-нить своей финтифлюшки, может угробить весь сайт -- 
MS> наблюдался тут не шибко давно один такой случай со стороны.

Кстати в nginx есть ещё одна фича, которую я пока ещё не начал применять
но возможно таки начну -- его встроеный SSI. Совместно с
предгенерированием части контента может быть тоже весьма интересной
штукой.

-- 
С уважением, Денис

http://freesource.info
----------------------------------------------------------------------------
Папа! А что означает Format C: Complete?

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Sysadmins] apache tuning in nginx presence
  2007-09-01 20:34     ` Денис Смирнов
@ 2007-09-01 20:51       ` Michael Shigorin
  2007-09-11 14:12         ` Денис Смирнов
  0 siblings, 1 reply; 8+ messages in thread
From: Michael Shigorin @ 2007-09-01 20:51 UTC (permalink / raw)
  To: ALT Linux sysadmin discuss

On Sun, Sep 02, 2007 at 12:34:58AM +0400, Денис Смирнов wrote:
> >> То есть если по каким-то причинам время выдачи одним апачем
> >> ответа существенно большое на отдельных страницах, то
> >> количество бэкендов приходится увеличивать.
> MS> Угу, но это скорее anti-DoS уже получается.
> Если у тебя есть страницы которые по каким-то причинам могут
> сильно тормозить -- то они сами по себе DoS. Соответственно для
> хостинга, где запросто какой-нибудь умник таки может склепать
> подобную страницу, подобная настройка сама по себе DoS. Увы :(

Ага, только в этом случае DoS ещё контролируемый, а если у тебя
двадцать бэкендов жуют один процессор, то поди ещё доберись их
отстрелить... (даже если ты monit)

Бишь между полным DoS'ом, когда приходится звонить-бутать,
и частичным я всё-таки выберу второе.  Ну и за прошешдую 
неделю ни разу не жалел.

> MS> Это у тебя так долго барахлишко тарахтело?
> Там автор поделия на PHP шибко умный. Это ещё оно быстро
> работало, после того как я грязно матерясь смотрел на особо
> долгие запросы и ручками создавал индексы.

IMHO это VPS и ССЗБ.

> >> Что-то вроде. Правда логику по которой надо рассчитывать
> >> оптимум для этих значений я так и не смог продумать.
> MS> Я ж писал -- по два активных процесса на CPU core, это довольно
> MS> известное правило оптимальной загрузки при наличии I/O (бишь
> MS> когда задача не исключительно в CPU и только в него упёрлась).
> MS> У меня в парах httpd/mysqld активным можно было считать httpd,
> MS> поскольку он отъедал примерно на порядок больше времени.
> Ты сначала расскажи что такое "активный процесс" для обычного
> web-приложения.

Здесь это выглядело как libhttpd.ep+mysqld.

> Особенно с учетом того что часть запросов тормозиться о диск, а
> часть о процессор. И ты заранее не знаешь какой из них к чему
> более жручий. А распараллеливать надо исходя ещё и из этого
> (пока молотят процессор несколько тредов, можно другими
> несколькими тредами создавать проблемы HDD). При том что для
> _правильной_ дисковой системы (то бишь SCSI какие) наборот
> нужно нагружать диск _параллельно_.

Я ж не спорю, и для более другого тазика выставил бы более другие
циферки.  Специально же описал железо и соображения.

-- 
 ---- WBR, Michael Shigorin <mike@altlinux.ru>
  ------ Linux.Kiev http://www.linux.kiev.ua/


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Sysadmins] apache tuning in nginx presence
  2007-09-01 20:51       ` Michael Shigorin
@ 2007-09-11 14:12         ` Денис Смирнов
  0 siblings, 0 replies; 8+ messages in thread
From: Денис Смирнов @ 2007-09-11 14:12 UTC (permalink / raw)
  To: shigorin, ALT Linux sysadmin discuss

[-- Attachment #1: Type: text/plain, Size: 3014 bytes --]

On Sat, Sep 01, 2007 at 11:51:04PM +0300, Michael Shigorin wrote:

MS> Ага, только в этом случае DoS ещё контролируемый, а если у тебя
MS> двадцать бэкендов жуют один процессор, то поди ещё доберись их
MS> отстрелить... (даже если ты monit)
MS> Бишь между полным DoS'ом, когда приходится звонить-бутать,
MS> и частичным я всё-таки выберу второе.  Ну и за прошешдую 
MS> неделю ни разу не жалел.

Вопрос в том, сколько именно backend'ов делать. Если у тебя DoS каждый
день будет, то увы и ах -- никого это не устроит.

Глянь в код SeirosWiki, если разберешься как оно работает будешь очень
громко материться. Так вот ответственно заявляю -- это поделие _нельзя_
таким образом защищать. Иначе убиваться будет.

Собственно один из периодов когда меня все материли за постоянные gateway
timeout были потому как я попробовал такое сделать.

> MS>> Это у тебя так долго барахлишко тарахтело?
>> Там автор поделия на PHP шибко умный. Это ещё оно быстро
>> работало, после того как я грязно матерясь смотрел на особо
>> долгие запросы и ручками создавал индексы.
MS> IMHO это VPS и ССЗБ.

Так и сделано. А проку-то там -- в этом VPS все равно пара десятков апачей
крутятся. А если они у меня не будут крутиться -- клиент уйдет к тому, у
кого они крутиться будут :(

> >>> Что-то вроде. Правда логику по которой надо рассчитывать
> >>> оптимум для этих значений я так и не смог продумать.
> MS>> Я ж писал -- по два активных процесса на CPU core, это довольно
> MS>> известное правило оптимальной загрузки при наличии I/O (бишь
> MS>> когда задача не исключительно в CPU и только в него упёрлась).
> MS>> У меня в парах httpd/mysqld активным можно было считать httpd,
> MS>> поскольку он отъедал примерно на порядок больше времени.
>> Ты сначала расскажи что такое "активный процесс" для обычного
>> web-приложения.
MS> Здесь это выглядело как libhttpd.ep+mysqld.

У меня mysqld обычно процессорного времени жрет мало, а вот работает
долго. Диски :(

>> Особенно с учетом того что часть запросов тормозиться о диск, а
>> часть о процессор. И ты заранее не знаешь какой из них к чему
>> более жручий. А распараллеливать надо исходя ещё и из этого
>> (пока молотят процессор несколько тредов, можно другими
>> несколькими тредами создавать проблемы HDD). При том что для
>> _правильной_ дисковой системы (то бишь SCSI какие) наборот
>> нужно нагружать диск _параллельно_.
MS> Я ж не спорю, и для более другого тазика выставил бы более другие
MS> циферки.  Специально же описал железо и соображения.

Я для архива комментирую возможные грабли такого решения, которые могут
оказаться неочевидными для тех, кто на них не напарывался.

В любом случае есть очень важная вещь -- конфиги у разных сервисов могут и
должны быть сильно разными.

-- 
С уважением, Денис

http://freesource.info
----------------------------------------------------------------------------
[...] python22-devel тоже provides python-devel, и он лексикографически
круче.
		-- ldv in devel@

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2007-09-11 14:12 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-08-20 17:38 [Sysadmins] apache tuning in nginx presence Michael Shigorin
2007-08-21  5:55 ` Slava Dubrovskiy
2007-08-21  7:55   ` Michael Shigorin
2007-08-22 11:16 ` Denis Smirnov
2007-08-22 11:44   ` Michael Shigorin
2007-09-01 20:34     ` Денис Смирнов
2007-09-01 20:51       ` Michael Shigorin
2007-09-11 14:12         ` Денис Смирнов

ALT Linux sysadmins discussion

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/sysadmins/0 sysadmins/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 sysadmins sysadmins/ http://lore.altlinux.org/sysadmins \
		sysadmins@lists.altlinux.org sysadmins@lists.altlinux.ru sysadmins@lists.altlinux.com
	public-inbox-index sysadmins

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.sysadmins


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git