?

Log in

No account? Create an account

Previous Entry | Next Entry

Сегодня утром запустили наш специализированный HTTP сервер Coser на полную мощность.

Я рассказывал об этом сервере в посте «Заменяем Erlang на Си», говоря, что он делает 16,500+ HTTP/1.0 (non-persistent) запросов в секунду на половине одного ядра. В смысле, утыкается в амазоновскую сеть раньше, чем в CPU.

Так вот, после этого поста сервер вырос с 1500 до 7900 LOC, начал уметь HTTP/1.1 keep-alive, gzip и научился отдавать наши LiveUpdate запросы. LiveUpdate запросы периодически делаются виджетами комментариев на странице для того, чтобы подгрузить новые записи. Пока виджетами запросы на сервер делаются периодически (раз в несколько секунд), но в дальнейшем полностью уйдёт на COMET.

На HTTP/1.1+keep-alive сервер нельзя нагрузить несколькими десятками тысяч запросов — раньше сдыхают генераторы запросов (три сервера). Поэтому я пока нагрузочное тестирование до логического конца не доводил. Тем более, что пока мы работаем на старой версии Haproxy в качестве балансера, у которой нет Keep-Alive в сторону сервера. Будем менять Haproxy на новый — заодно и посмотрим.

Некоторые спрашивали про экономический эффект этой системы. Отвечаю. Четыре ядра с работающими на них Coser'ом, загруженных на 45%, убирают ~75% нагрузки с шестидесяти машин с Erlang'ом. То есть, экономия получается в 45*$(c1.medium) = $6.1k в месяц. Это на текущем трафике, который прямо сейчас есть. А ведь он более чем в два раза возрос за последний месяц!

Вот график загрузки одной из машин с Эрлангом:



Больше чем в два раза убрана нагрузка в 15:00. Это в текущем релизе, в котором на Coser переброшены LiveUpdates. А при первом своём релизе Coser убрал тоже два раза с эрланговских боксов, когда начал обслуживать Counters. Отсюда цифра ~75% (сначала половину убрали, потом половину от оставшейся половины).

Прямо сейчас четыре ядра с косером (каждое загружено на 35-45%) обслуживают в сумме 700 мегабит в секунду трафика (480 down, 220 up) с суммарной скоростью 23560 запроса в секунду.

Косер поддерживает gzip-компрессию. Примерно 3.5% динамических ответов косера идут в сторону клиента сжатыми. Это в сумме 3188 запросов в секунду, 169 мегабит в секунду на этих четырёх половинках ядер.

Про gzip в серверах надо сказать отдельное спасибо Microsoft'у. Если вы не в курсе, зачем веб-сервера часто первые два килобайта ответа заполняют пробелами — посмотрите, приколитесь: http://support.microsoft.com/kb/312496.

Про поддержку ASN.1 в Erlange надо сказать отдельное спасибо команде-разработчикам эрланга. Эрланг не умеет парсить правильно значение 0.0 (ноль) в типе REAL. Смеялсо. Баг отослан: http://erlang.org/pipermail/erlang-bugs/2011-June/002486.html

Про поддержку ASN.1 в asn1c надо сказать мне, ибо я тоже там баг нашёл в парсинге REAL. Не смеялсо. https://github.com/vlm/asn1c/commit/0959f.

Comments

( 79 comments — Leave a comment )
alexott
Jun. 27th, 2011 06:03 pm (UTC)
а чем нагрузку генерировали при тестировании?
lionet
Jun. 27th, 2011 06:04 pm (UTC)
httperf.
synergy_ek
Jun. 27th, 2011 06:07 pm (UTC)
прощай, Эрланг, или он остается где-то на бэкендах?
lionet
Jun. 27th, 2011 06:11 pm (UTC)
Без эрланга никуда нам. Почти весь процессинг потоков (кроме того, что на OCaml) и все control flows на нём, и никуда сворачивать не собираемся.
zmeygor
Jun. 27th, 2011 06:23 pm (UTC)
Ого, очень классные результаты.

Разработка проприетарная или её можно пошчупать?
lionet
Jun. 27th, 2011 06:25 pm (UTC)
Я думаю, что это competitive advantage, особенно в плане скорости компрессии. Так что не отдадим.
(no subject) - zmeygor - Jun. 27th, 2011 06:30 pm (UTC) - Expand
(no subject) - lionet - Jun. 27th, 2011 06:32 pm (UTC) - Expand
(no subject) - zmeygor - Jun. 27th, 2011 06:42 pm (UTC) - Expand
(no subject) - lionet - Jun. 27th, 2011 07:12 pm (UTC) - Expand
(no subject) - zmeygor - Jun. 28th, 2011 07:52 am (UTC) - Expand
(no subject) - blacklion - Jun. 27th, 2011 07:57 pm (UTC) - Expand
(no subject) - lionet - Jun. 27th, 2011 07:59 pm (UTC) - Expand
(no subject) - blacklion - Jun. 27th, 2011 08:03 pm (UTC) - Expand
(no subject) - lionet - Jun. 27th, 2011 08:04 pm (UTC) - Expand
(no subject) - jabrusli - Apr. 4th, 2014 09:34 am (UTC) - Expand
(no subject) - lionet - Apr. 4th, 2014 10:00 am (UTC) - Expand
(no subject) - jabrusli - Apr. 4th, 2014 12:16 pm (UTC) - Expand
(no subject) - lionet - Apr. 4th, 2014 12:21 pm (UTC) - Expand
(no subject) - jabrusli - Apr. 4th, 2014 01:41 pm (UTC) - Expand
(no subject) - Светляк 40вт [svetlyak.ru] - Jun. 28th, 2011 07:09 am (UTC) - Expand
(no subject) - lionet - Jun. 28th, 2011 08:56 am (UTC) - Expand
levgem
Jun. 27th, 2011 06:24 pm (UTC)
Скажи пожалуйста, а ты не думал это всё сделать чем-то типа драйвера к эрлангу?

https://github.com/erlyvideo/erlyvideo/blob/master/apps/microtcp/c_src/microtcp.c

Я начал готовить этот кусок как замену gen_tcp в эрланге, потому что мне нужна специфичная функциональность.
lionet
Jun. 27th, 2011 06:27 pm (UTC)
А оно и так портом к эрлангу работает. Драйверность ничего не даст. Я же не хочу каждый запрос выносить в Erlang VM, а "некоторые" данные Косер периодически у эрланга спрашивает (единицы сотен раз в секунду).
(no subject) - levgem - Jun. 27th, 2011 06:28 pm (UTC) - Expand
(no subject) - lionet - Jun. 27th, 2011 06:32 pm (UTC) - Expand
(no subject) - levgem - Jun. 27th, 2011 06:37 pm (UTC) - Expand
(no subject) - lionet - Jun. 27th, 2011 06:55 pm (UTC) - Expand
(no subject) - levgem - Jun. 27th, 2011 06:58 pm (UTC) - Expand
(no subject) - lionet - Jun. 27th, 2011 07:17 pm (UTC) - Expand
(no subject) - levgem - Jun. 27th, 2011 07:19 pm (UTC) - Expand
(no subject) - lionet - Jun. 27th, 2011 07:31 pm (UTC) - Expand
(no subject) - levgem - Jun. 27th, 2011 07:32 pm (UTC) - Expand
(no subject) - Sergey Yelin - Jun. 27th, 2011 07:53 pm (UTC) - Expand
(no subject) - lionet - Jun. 27th, 2011 07:56 pm (UTC) - Expand
(Deleted comment)
(no subject) - lionet - Jun. 27th, 2011 10:56 pm (UTC) - Expand
(Deleted comment)
(no subject) - lionet - Jun. 28th, 2011 08:37 am (UTC) - Expand
(no subject) - lionet - Jun. 28th, 2011 08:38 am (UTC) - Expand
(Deleted comment)
(no subject) - lionet - Jun. 28th, 2011 09:22 am (UTC) - Expand
(no subject) - zevlg - Jun. 27th, 2011 11:44 pm (UTC) - Expand
(Deleted comment)
(no subject) - blacklion - Jun. 28th, 2011 12:21 pm (UTC) - Expand
rainman_rocks
Jun. 27th, 2011 06:26 pm (UTC)
а зачем асн1, божемой?!
lionet
Jun. 27th, 2011 06:28 pm (UTC)
Удобно потому что.
(no subject) - rainman_rocks - Jun. 27th, 2011 07:06 pm (UTC) - Expand
(no subject) - lionet - Jun. 27th, 2011 07:21 pm (UTC) - Expand
(no subject) - blackyblack - Jun. 28th, 2011 05:55 am (UTC) - Expand
(no subject) - lionet - Jun. 28th, 2011 08:54 am (UTC) - Expand
(no subject) - blackyblack - Jun. 28th, 2011 10:43 am (UTC) - Expand
(no subject) - lionet - Jun. 28th, 2011 10:52 am (UTC) - Expand
(no subject) - blackyblack - Jun. 28th, 2011 11:26 am (UTC) - Expand
(no subject) - lionet - Jun. 28th, 2011 11:27 am (UTC) - Expand
(no subject) - rainman_rocks - Jun. 28th, 2011 08:58 am (UTC) - Expand
(no subject) - lionet - Jun. 28th, 2011 09:10 am (UTC) - Expand
(no subject) - nealar - Jun. 28th, 2011 09:38 am (UTC) - Expand
(Deleted comment)
demmonoid
Jun. 27th, 2011 06:59 pm (UTC)
А какая разница в перфомансе с чем-нибудь более легковесным, чем yaws? С тем же yucan, например?
lionet
Jun. 27th, 2011 07:12 pm (UTC)
2-5 раз быстрее чем Yucan. Смотря чем Yucan нагрузить.
Andrew Korzhuev
Jun. 27th, 2011 07:53 pm (UTC)
А сколько потратили на разработку времени\денег?
lionet
Jun. 27th, 2011 07:55 pm (UTC)
Недели две моих. За месяц окупится.
(Deleted comment)
_zerg
Jun. 28th, 2011 04:41 am (UTC)
raa
Jun. 28th, 2011 06:17 am (UTC)
так чем плох модуль к nginx, о котором говорили в прошлом посте? казалось бы, серверная часть, самое геморойное, уже есть - нафига её было с нуля писать? for fun?
lionet
Jun. 28th, 2011 08:48 am (UTC)
Да чё там писать, когда я веб сервера разные семь лет писал на C для Netli (Akamai) и Cisco? Там бизнес-логики больше, чем серверной части. В прошлом посте я сказал, что сделав модуль к nginx, я бы сэкономил сотню строчек. Из 1500.
tonsky
Jun. 28th, 2011 07:10 am (UTC)
Хехе, никакие ie9bugs и ie8bugs никогда не заменят старых добрых эпических ie6bugs. Все-таки был у Майкрософта свой уровень классности.
levgem
Jun. 28th, 2011 08:06 am (UTC)
А можешь пояснить ещё такую вещь: че вы так уперлись в амазон с его жуткими ценами?
lionet
Jun. 28th, 2011 08:49 am (UTC)
TTM
(Deleted comment)
(no subject) - lionet - Jun. 28th, 2011 10:24 am (UTC) - Expand
(no subject) - levgem - Jun. 28th, 2011 10:51 am (UTC) - Expand
(Deleted comment)
(no subject) - levgem - Jun. 28th, 2011 11:30 am (UTC) - Expand
(no subject) - levgem - Jun. 28th, 2011 12:44 pm (UTC) - Expand
(Deleted comment)
lionet
Jun. 28th, 2011 10:26 am (UTC)
Сейчас — не делают, к концу года эти $6k превратятся $60k экономии, а это уже существенный процент расходов компании.
_sparrow
Jun. 28th, 2011 06:46 pm (UTC)
В одном из последних выпусков радио-т упоминалась цифра порядка 200k rps в отношении netty на железячном сервере. Понятно, что вещи весьма разные. Кастомный протокол через протобаф вместо хттп, живой сервер вместо амазона, nio вместо libev. Хочется узнать, насколько влияет на производительность каждый из факторов.

эни комментс ?
lionet
Jun. 28th, 2011 06:50 pm (UTC)
Допустим, один реквест — это 10 пакетов TCP. 23kRPS — это 230k пакетов на четырёх ядрах. Сравнимо.
iamjaph
Jul. 1st, 2011 09:05 am (UTC)
А почему не Ocaml?
А почему не Ocaml?
lionet
Jul. 1st, 2011 03:46 pm (UTC)
Re: А почему не Ocaml?
До сих пор об этом думаю.
( 79 comments — Leave a comment )

Profile

lionet
Lev Walkin
Website

Latest Month

December 2016
S M T W T F S
    123
45678910
11121314151617
18192021222324
25262728293031
Powered by LiveJournal.com
Designed by yoksel