From: Michael Shigorin <mike@osdn.org.ua> To: sysadmins@lists.altlinux.org Subject: Re: [Sysadmins] apache tuning in nginx presence Date: Wed, 22 Aug 2007 14:44:25 +0300 Message-ID: <20070822114425.GE28425@osdn.org.ua> (raw) In-Reply-To: <b6fe84cf0708220416ha5d0628m327eefe227649b5e@mail.gmail.com> 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/
next prev parent reply other threads:[~2007-08-22 11:44 UTC|newest] Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top 2007-08-20 17:38 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 [this message] 2007-09-01 20:34 ` Денис Смирнов 2007-09-01 20:51 ` Michael Shigorin 2007-09-11 14:12 ` Денис Смирнов
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20070822114425.GE28425@osdn.org.ua \ --to=mike@osdn.org.ua \ --cc=shigorin@gmail.com \ --cc=sysadmins@lists.altlinux.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
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