Журнал LinuxFormat - перейти на главную

LXF97:Пережить Slashdot-эффект

Материал из Linuxformat
Версия от 09:51, 20 октября 2008; Crazy Rebel (обсуждение | вклад)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Как сделать Slashdot’о-упорным ваш сервер

Ваш web-сервер подорвал силы, отбивая наплыв посетителей – аж по два обращения в секунду? Пол Хадсон покажет, как его излечить.
Предупреждение: до старта
Внесение изменений в настройки вашего сервера может привести к непресказуемым последствиям. Мы советуем использовать для этих тестов не занятый в основной деятельности сервер и перед внесением любых изменений в настройки делать резервную копию всех файлов системы. После изменения настроек Apache/MySQL не забудьте перезапустить сервисы, чтобы новые параметры вступили в силу

Digg, Reddit, Delicious, Furl, Newsvine и другие крупные сайты новостей посещаются миллионами пользователей, но, вообще говоря, лишь один из них популярен достаточно, чтобы дать имя явлению, вгоняющему в пот сисадминов: Slashdot-эффекту. Новости на нем, возможно, вам и не по вкусу, но Slashdot остается едва ли не главной отрадой хакеров в Интернете. Ссылка на ваш web-сайт, включенная в одну из новостей с главной страницы, приведет к вам за несколько часов более сорока тысяч человек, что чревато двумя исходами: либо огромным ростом прибыли от рекламы (больше народу прокликает ваши баннеры), либо тем, что ваш сервер расплавится, погрузив сайт в анабиоз ожидать волшебного поцелуя, который вернет его к жизни. Более того, если ваша история интересна широкой аудитории, то ее переопубликуют сотни других сайтов, источником новостей для которых является Slashdot, и посетителей может быть в несколько тысяч раз больше – если, конечно, ваш сайт не рухнет.

Но вот беда: большинство сайтов именно что рухнет. Slashdot-эффект получил свое название из-за того, что орды нагнанных им визитеров превышали пределы возможностей сайтов, и последние в конце концов падали. Если же вы настроены серьезно и хотите, чтобы ваш сайт был доступен всегда и везде, то есть много способов сдержать напор посетителей. Да, надо взяться за оружие и показать прыщавым слэшдоттерам, что вам плевать на 500 запросов в секунду, что вам приятно быть как Dugg и что Delicious остается только отирать с лица грязь, летящую из-под ваших копыт. Короче, пора превратить ваш медленный и средненький web-сервер в супербыстрый и супернадежный сервер вашей мечты.

Живи и дай умереть

[В заголовке – название известной песни Пола Маккартни, – прим. пер.]

Быстрота вашего кода особого значения не имеет: в конечном итоге все зависит от грамотности настройки Apache. Проблема в том, что люди думают: «Ну вот, сайт протестирован: он справляется, даже когда на него заходит сразу 20 человек – отлично!» 20 обращений в секунду – это неплохо, если вы размазываете число посещений в месяц равномерно по месяцу. Когда мы спросили, насколько опасен Slashdot, у эксперта LXF по web-технологиям Майка Сондерса, тот побледнел, задрожал и не сразу ответил: «Slashdot-эффект – это как тысяча термитов, грызущих ваши сетевые кабели». И когда он говорил о тысяче, он и имел в виду тысячу: двадцать обращений в секунду – это неплохо, но если ссылка на ваш сайт угодит на Slashdot, реально получить до тысячи обращений в секунду.

Первый эффект Slashdot возникает тогда, когда из-за огромного количества одновременно открытых соединений посетителям не удается соединиться с сервером, даже если он еще жив и нормально обрабатывает запросы. И они нажимают на кнопку «Обновить», и делают это снова и снова; и рано или поздно сервер в самом деле падает. Вот вам и второй эффект Slashdot: ваш сервер становится дымящейся развалиной.

Таким образом, решение проблемы состоит в выборе: обеспечить пользователям либо 100%-ную производительность ресурса при низ- кой загрузке и 5%-ную при высокой, либо 90%-ную при низкой и 70%-ную при высокой. Большинство людей предпочло бы второй вариант, потому что большую часть времени почувствовать разницу между 90% и 100%-ной производительностью невозможно. Но когда на сайт заходят тысячи посетителей и время имеет значение, различие между этими вариантами становится очевидным.

Эти два варианта разделены одной строкой в файле настроек Apache: KeepAlive. Она появилась в HTTP/1.1 и предназначена для того, чтобы разрешить постоянное соединение между клиентом и сервером. Браузер без поддержки KeepAlive соединяется с сервером, загружает страничку, отсоединяется, затем проверяет, есть ли на странице рисунки и другие вложения, после чего создает отдельные соединения для каждого из этих объектов. Это требует массы дополнительных действий, поэтому KeepAlive сохраняет одно соединение открытым около 15 секунд, позволяя пользователем загрузить в его ходе несколько файлов. Если на вашем сайте много графики, то включение поддержки KeepAlive способно уменьшить время ожидания (это не то же самое, что время загрузки страницы) примерно вдвое.


Все это хорошо, но вспомним, что Apache поддерживает не более 256 одновременных соединений. Так что если пытаются подключиться 1000 пользователей, то Apache откроет соединения с двумястами пятьюдесятью шестью из них, обработает их запросы на все страницы и картинки, потом оставит соединение открытым на 15 секунд на случай, если клиенты затребуют еще что-либо, и, наконец, закроет их. Тут можно перейти к обслуживанию других пользователей. Здесь есть две основные проблемы. Во-первых, глупо сохранять соединение открытым в течение 15 секунд, когда его ждут сотни других пользователей. Во-вторых, приоритет загрузки изображений над загрузкой содержимого – штука неправильная по сути. Если отключить поддержку KeepAlive, то файл журнала запросов будет выглядеть примерно так:

User 1 запросил index.html

User 2 запросил index.html

User 3 запросил index.html

User 1 запросил foo.jpg

User 2 запросил foo.jpg

User 3 запросил foo.jpg

User 4 запросил index.html

User 1 запросил bar.jpg

User 2 запросил bar.jpg

User 3 запросил bar.jpg

User 4 запросил foo.jpg

User 4 запросил bar.jpg


Это куда справедливее, и вероятность того, что будет обслужены все пользователи, а не несколько приоритетных, намного выше. Убедились? Так и должно было быть! Чтобы отключить поддержку KeepAlive, откройте файл настроек Apache (обычно /etc/httpd/httpd.conf или /etc/apache2/apache2.conf) и измените строку

KeepAlive On

на строку

KeepAlive Off

После перезапуска Apache разницы в скорости вы почти не заметите. Но когда наступит критический момент и ваша история станет первой на Slashdot, тогда вы почувствуете разницу.

Персональные инструменты
купить
подписаться
Яндекс.Метрика