SlideShare ist ein Scribd-Unternehmen logo
1 von 68
Downloaden Sie, um offline zu lesen
Как написать
масшабируемую
баннерокрутилку

Бирюков Денис,
компания Каванга
Задачи перед сервисом
• Производительность
  – сейчас: 1000 баннеров/сек.
  – хотим: 10 000 баннеров/сек.
  – время отклика < 200 миллисекунд.
• 365*24*7, обязательно отдать контент (хотя
  бы заглушку).
• Много площадок (>1.000), много баннеров
  (>100.000).
Задачи (прод.)
• Таргетинги
  –   Стандартные (UserAgent, geo …).
  –   Стандартные ограничения, скорость, бюджет.
  –   Стандартные уникальные ограничения.
  –   Аудиторные таргетинги (ретагетинг: бумеранг,
      поисковый, соцдем).
• Точный подсчёт показов, кликов и событий,
  начислений и списаний денег.
Резюмируем свойства
• Горизонтально масштабируемый (до 10000
  хитов/сек). Перекрутов, в идеале, быть не
  должно.
• Многопоточный (медленные запросы не должны
  держать быстрые). Минимизировать блокировки.
• Синхронизация серверов в режиме “реального
  времени” (уменьшаем перекруты).
Схема сервиса в целом
Площадка    Клиент               Пользователь     Пользователь

                        hadoop
     PHP                                     nginx
                      hadoop

                                     front           front




                                                             SearchServer
  MySQL


                                         uuserver

   sphinx            соцдем            uuserver
UUServer
•   Кука всего 4 KB – мало.
•   Очень близко к хранилищу key/value.
•   Выдача данных по TCP (свой протокол).
•   Прием данных по UDP (свой протокол).
•   Масштабируемый.
•   Многопоточный (много блокировок).
UUServer (прод.)
• Внутри 64 независимых дерева - боремся с
  локами и балансировками дерева при
  вставке.
• Раз в 5 мин запускается цикл сохранения
  пользователей на диск.
• Классический ретаргетинг организован
  плагинами на стороне uuserver.
• Соединения ‘постоянные’.
Схема uuserver
TCP запрос       UPD пакет (событие)

                 UPD пакет (событие)      foreach(libs)
                                          {Retargeting;}
Выбор map
Поиск user       Выбираем очередь

                                        Выбор map
                      Выбор map
                                        Поиск user
 Анализ               Поиск user

             Map.insert(…)
                                       Выбираем очередь
TCP ответ
                        Increment,
                          Update;
Схема front
                                 nginx


fastcgiexp            UUserver           fastcgievent       fastcgidummy
fastcgiexp            UUserver           fastcgievent       fastcgidummy

                           CounterQueue
                                                              MySQL
                                               cache
             Syslog                                            Gearman
                                     sender      receiver

SearchServer     hadoop             receiver      sender
Cache
• Хранит много объектов, если примитивно, то
  std::map(u_int64_t, std::vector<...sort...> *).
  Значение в каждой записи — это табличка из
  СУБД.
• Объекты — берутся из базы данных (она отвечает
  за сортировку и за целостность данных).
• Данные в некоторых 'табличках' меняются редко
  (площадки, рекламные кампании, цены), или
  очень редко (гео база) — изменения всегда
  приходят из СУБД.
Cache (прод.)
• Есть 'таблички', данные в которых меняются часто
  ('счетчики') — изменения приходят как из СУБД
  так и от CounterQueue.
• Многопоточный (на каждое соединение — свой
  поток).
• Соединения 'постоянные'.
• Блокировки (чтение/запись) накладываются на
  всю таблицу.
Cache: логика обновления
                                            CacheInOut {
TCP запрос     Данные из СУБД
                                              u_int32_t size;
                                              u_int32_t func;
                   Анализ и                   char data[size];
                 построение                 }
                  ‘таблички’
                                    WaitToWrite()


TCP ответ    Данные из Cache    Swap(std::vector<...>*)


              Delete old data           Done()
Cache: выбор баннеров
TCP запрос     WaitToRead(),…

                                Find place, geo

                                  Сортировка РК


                                    foreach(PK)
                                    {Targets;}


TCP ответ    Done(),…               result
Cache: инкрементация (2экз)
                                Есть 2 экземпляра
     Increment(…)              Счетчиков (Readers-1)
    WaitToWrite()
                       TCP запрос
                                    Call Increment(2)
    foreach(…){
       Increment;
       syslog(...);}                   Swap(1,2)

                       TCP ответ
       Done()
                                    Call Increment(2)
FastCgiExp
• Сервер – и диспетчер и обработчик.
• Есть пулы нитей (nginx (fastcgi), cache, uuserver).
• В каждом процессе хранятся тела баннеров,
  заглушек и ссылок (доступ к ним производиться
  через read/write блокировку).
• Настройка количества listen сокетов, размеры
  пулов, количество процессов производится
  редактированием файла конфигурации, с
  последующим перезапуском.
FastCgiExp: запрос
FastCgi запрос    Выбрать Нить               PoolThread FastCgi

    Dummy         CheckReferer              UDP to SearchServer


 FastCgi ответ    Выделить Нить             PoolThread UUServer


                   Get User Info             PoolThread Cache
 mq_send(…)
 mq_send(…)
                  Выделить Нить                Get BannerId

UDP to UUserver                    Banner
FastCgiEvent: запрос
FastCgi запрос        Выбрать Нить     PoolThread FastCgi


     204             Выделить Нить     PoolThread UUServer


FastCgi ответ          Get User Info


 mq_send(…)
                       Get Location
 mq_send(…)

           UDP to UUserver
FastCgiDummy: запрос
FastCgi запрос     Выделить Нить       PoolThread FastCgi




                 UDP to SearchServer




FastCgi ответ          Dummy
Что дальше?
• Постоянные изменения логики движка
  (поддержка).
• Написать антинакрутчик (aio).
• Переписать UUserver (aio) ?
• Мониторинг серверов (zabbix).
Что дальше? (прод.)
• Новые интерфейсы рекламодателям и
  владельцам площадок (и поддержка и
  юзабилити).
• Соцдем.
• Новые отчеты (hadoop).
• Мониторинг серверов (zabbix).
Оптимизация трафика
Трафика много, денег     Возможно мало уников
мало?
                         Возможно сейчас у нас нет рекламы
                         для вас (новые форматы)
                         Возможно вы хотите много денег, или
                         другие таргетинги.


Опрашивайте рекламные движки каскадом

Делитесь информацией о своих юзерах
Тестирование. Машина.
Процессор   Intel(R) Xeon(R) CPU E5630 @ 2.53GHz (2527.30-MHz K8-
            class CPU), 2x4 core
Память      96 GB
nload       Incoming:                  Outgoing:
                Curr: 13.65 MBit/s          Curr: 57.67 MBit/s
                                            Avg: 16.72 MBit/s
                Avg: 3.93 MBit/s
                                            Min: 5.52 kBit/s
                Min: 1.02 kBit/s
                                            Max: 66.14 MBit/s
                Max: 16.60 MBit/s
                                            Ttl: 783.21 MByte
                Ttl: 402.25 MByte
netstat         27 LISTEN                 625 SYN_SENT
                42 CLOSE_WAIT            971 LAST_ACK
                42 FIN_WAIT_2             1928 ESTABLISHED
                73 CLOSED                23593 TIME_WAIT
Тестирование. Бенчмарк.
denis:/home/bdn# /usr/sbin/ab -r -c100 -n10000 -b2048 -C kui1v=777 "http://10.5.1.50/exp?sid=5&bt=5&bn=1&bc=3&ct=2"

              100/10000                                                                   100/10000

              100/50000                                                                   100/50000

              1000/10000                                                                  10000/10000
              1000/50000                                                                  10000/50000

              4050                                              500
                                                                450
              4000
                                                                400




                                                     микросек
              3950                                              350
      кол-во 3900                                               300
     запросов                                                   250
              3850
       в сек                                                    200
              3800                                              150
                                                                100
              3750
                                                                 50
              3700                                                0




                                                                                                               %
                                                                      %


                                                                           %


                                                                                %


                                                                                     %


                                                                                          %


                                                                                               %


                                                                                                    %


                                                                                                         %
                         одновременные




                                                                                                              0
                                                                   0


                                                                           6


                                                                                5


                                                                                     0


                                                                                          0


                                                                                               5


                                                                                                    8


                                                                                                         9

                                                                                                              0
                                                                  5


                                                                          6


                                                                               7


                                                                                    8


                                                                                         9


                                                                                              9


                                                                                                   9


                                                                                                        9

                                                                                                             1
                       соединения / кол-во
                         запросов всего                                              доля запросов
Тестирование. TOP.
[root@mega ~]# top
last pid: 10965; load averages: 13.32, 6.52, 3.64               up
1+23:47:28 16:18:52
646 processes: 8 running, 638 sleeping
CPU: 55.2% user, 0.0% nice, 14.3% system, 7.2% interrupt, 23.3% idle
Mem: 18G Active, 1610M Inact, 11G Wired, 136K Cache, 9833M Buf, 63G
Free
Swap: 4096M Total, 4096M Free
Тестирование. TOP.
PID     UN THR PRI NICE SIZE     RES      STATE    C   TIME     WCPU COMMAND
2583    kbe 54 47 0 220M         147M     CPU7     7   21:25    353.47% cache
706     root 1 73    0 6956K     1520K    RUN      7   4:29     23.39% syslogd
10890   www 1   65 0 50268K      36736K   RUN      1   1:01     18.46% nginx
10891   www 1   67 0 42076K      30064K   RUN      1   0:56     18.16% nginx
2615    kbe 49 44 0 76784K       22176K   nanslp   0   1:42     11.52% fcgiexp
2616    kbe 49 44 0 78832K       22268K   nanslp   1   1:43     11.43% fcgiexp
2617    кbe 49 44 0 82672K       20876K   nanslp   0   1:40     11.33% fcgiexp
2613    kbe 49 44 0 78704K       21924K   nanslp   0   1:43     11.23% fcgiexp
2614    kbe 49 44 0 80752K       22112K   nanslp   1   1:42     11.04% fcgiexp
1557    kbe 170 44 0    18291M   18159M   sbwait   5   100:46   3.52%   uuserver
2609    kbe 3   44 0 28944K      4052K    nanslp   0   0:06     1.07%   sender
2605    kbe 3   44 0 47372K      4232K    nanslp   7   0:08     0.98%   counterqueue
2626    kbe 73 44 0 62856K       22464K   nanslp   5   0:16     0.00%   fcgievent
2639    kbe 73 44 0 62856K       22472K   nanslp   3   0:16     0.00%   fcgievent
1013    root 1 44 0 12064K       4152K    select   3   0:02     0.00%   sendmail
10889   root 1 76 0 17500K       6024K    pause    2   0:00     0.00%   nginx
Масшабируемая
баннерокрутилка:
как это было
на Erlang
Артем Гавриченков,
Highload Lab
Задача
• Выдача ссылок на новости
  – База из тысяч новостей
  – Ссылки выбираются произвольно
  – Распределение – неравномерное
• Форматирование ссылок перед выдачей
  – Ссылки должны иметь формат блока
  – Дополнительные поля: идентификатор блока, …
Ta-da!
• Требования: >= 5000 запросов в секунду
  – Не справляемся – должны быстро выдавать
    пустую страницу, чтобы не «ломать» вёрстку
  – Никакого кэширования
• Срок выполнения: полтора месяца.
  – При этом у разработчика баннерокрутилки
    есть и другие задачи
Схема решения
• Структуры в памяти, хранящие новости
  и статистику показов
• Множество потоков, обрабатывающих HTTP-запросы


• Контроллер
  – добавляющий и удаляющий новости
  – собирающий статистику
  – на основе TCP-сокетов
Схема решения
Структуры в памяти, хранящие новости
и статистику показов
Множество потоков, обрабатывающих запросы


Контроллер
 добавляющий и удаляющий новости
 собирающий статистику
 на основе TCP-сокетов
Erlang
• DSL для многопоточных приложений
• Встроенные в язык примитивы для посылки и
  приёма сообщений
• Встроенные в язык шаблоны поведения
• Встроенная в язык in-memory БД
Схема решения
• Структуры в памяти, хранящие новости
  и статистику показов: mnesia/ets/dict!
• Множество потоков, обрабатывающих HTTP-запросы:
  gen_server!

• Контроллер: gen_tcp!
    добавляющий и удаляющий новости
    собирающий статистику
    на основе TCP-сокетов
Схема решения
• Структуры в памяти, хранящие новости
  и статистику показов: mnesia/ets/dict!
• Множество потоков, обрабатывающих HTTP-запросы:
  gen_server!
  – который уже написан за нас! mochiweb/misultin
• Контроллер: gen_tcp!
   добавляющий и удаляющий новости
   собирающий статистику
 Batteries included
   на основе TCP-сокетов
Batteries included, though not all
Костяк решения
• HTTP-сервер Mochiweb получает запрос, создаёт поток
• Поток забирает из Mnesia данные
• Поток производит выборку, сортирует данные,
  форматирует строки, выдаёт, умирает.
  Все счастливы.

                  «In theory, there's no difference between
                 theory and practice. In practice, there is».
                                  L. A. van der Snepscheut.
Факап #1
 У каждой новости есть коэффициент важности. В
 соответствии с этим коэффициентом необходимо
 выдавать новость чаще или реже остальных.

• Перед выдачей нужно назначать взвешенные
  произвольные числа каждой новости и делать по
  ним выборку.
• Новостей много.
Факап #1
• Mnesia построена на основе ETS
• http://www.erlang.org/doc/man/ets.html:
    «In the current implementation, every object insert
    and look-up operation results in a copy of the
    object.»
• Т. е. в копировании сотен новостей из потока
  в поток. Slow as hell.
Эврика:
• Вместо ETS напишем собственную структуру
  данных на основе gen_server, dict, queue,
  blackjack и hookers.
• Повесим её в виде отдельного потока
• Будем делать там грубую предвыборку
  новостей, которые потом быстро
  скопируются в рабочий поток
Результат:
  рост производительности в 3 раза

Вывод:
 – всегда думай, что копируешь!
 – профилируй!
Костяк решения v0.2
• HTTP-сервер Mochiweb получает запрос, создаёт поток
• Поток отправляет запрос в gen_server
• gen_server производит предвыборку новостей и
  присылает результат
• Поток производит выборку, сортирует данные,
  форматирует строки, выдаёт, умирает.
  Все счастливы.
Факап #2
 Новости – это текст.
 Текст – это строки.

• Строки в Erlang – это связные списки
  символов
• IO в Erlang – это очень медленно
Эврика:
• Если вы пишете на Erlang,
  то строка символов записывается так:

               "Hello world!~n"

• Конкатенация записывается так:

        "Hello " ++ Username ++ "!~n"
Эврика:
• Если вы пишете на Erlang веб-приложения,
  то строка символов записывается так:

            <<"Hello world!~n">>

• Конкатенация записывается так:

    [<<"Hello ">>, Username, <<"!~n">>]
Почему:
• <<>> – встроенный бинарный тип
• <<"">> – бинарная строка
• Списки символов нужно обрабатывать
  перед выдачей
• Вывод бинарных данных – это просто
  вызов writev(2)
  – Blazingly Fast
Почему:
• "Hello" ++ "!n" => "Hello!n" => строка
  – Конкатенация списков – O(n)
  – Вывод строки => цикл по списку из 7 символов
• [<<"Hello">>, <<"!n">>] – тип iolist()
  – Добавление в начало списка – O(1)
  – Вывод => цикл по списку из 2 элементов
  – Built-in функциям I/O всё равно, что выводить
Кроме того:
• Строковые операции, наподобие обработки
  регулярных выражений, всё равно дорогие
• Впрочем, они вообще не очень дешевы.
  Надо делать предобработку
• Кэширование конструируемых URL новостей
  и т. п. позволило отыграть 15%
Результат:
  рост производительности в 10 (десять) раз

Вывод:
 – всегда думай, как обрабатывать строки!
 – профилируй!
Костяк решения v0.3
• HTTP-сервер Mochiweb получает запрос, создаёт поток
• Поток отправляет запрос в gen_server
• gen_server производит предвыборку новостей и
  присылает результат
• Поток производит выборку, сортирует данные,
  форматирует iolist()'ы, выдаёт, умирает.
Результат:
  рост производительности в 10 (десять) раз

Вывод:
  всегда думай, как обрабатывать строки!
  профилируй!
Костяк решения v0.4
• HTTP-сервер Misultin получает запрос, создаёт поток
• Поток отправляет запрос в gen_server
• gen_server производит предвыборку новостей и
  присылает результат
• Поток производит выборку, сортирует данные,
  форматирует iolist()'ы, выдаёт, умирает.
Misultin
• Реализация gen_server, как и Mochiweb
• Интерфейс, аналогичный Mochiweb
• Стабильно на 10-15% быстрее
Результат
• Один человекомесяц
• Быстрое веб-приложение


# ab -qc 7200 -n 450000 http://localhost/block/35237
| grep Requests per sec
Requests per second:    7693.35 [#/sec] (mean)
#
Killing feature!
  Начиная со второй недели разработки (как
  только был написан каркас), приложение
  было готово к работе.
• Ни отладки
• Ни непредусмотренного поведения
• Только фичи и профилирование
Killing feature!
• Ни отладки
• Ни непредусмотренного поведения
  В Erlang есть концепция «Let it crash».
  Близкий перевод – «Ну и хрен с ним».
Let it crash
• На обычном языке программирования:

 res = web_server.start_link(callback = F)

 if res == web_server.port_in_use:
     raise Exception("Port in use")
 elif res == web_server.socket_error:
     raise Exception("Socket error")
 elif res == errno.EACCES:
     raise Exception("Not enough privileges")
Let it crash
• На Erlang

 {ok, Pid} = misultin:start_link([{loop, F}]).

 if res == web_server.port_in_use:
     raise Exception("Port in use")
 elif res == web_server.socket_error:
     raise Exception("Socket error")
 elif res == errno.EACCES:
     raise Exception("Not enough privileges")
Let it crash
• На Erlang

 {ok, Pid} = misultin:start_link([{loop, F}]).

 if res == web_server.port_in_use:
     raise Exception("Port in use")
 Not ok? {badmatch, {error, eacces}}
     raise Exception("Socket error")
 elif res == errno.EACCES:
     raise Exception("Not enough privileges")
Результат
• Один человекомесяц
• Быстрое веб-приложение
• Стабильное веб-приложение
  – eunit и «Let it crash»
• Минимум кода
  – множество встроенных примитивов и «Let it crash»
• Минимум требуемого опыта
Уровень кодера
• С одной стороны, Erlang учится за 2 недели
• С другой стороны, нужно иметь навыки
  программирования. Not all batteries included
Напутствие
•   Предобрабатывай данные, пока это дёшево!
•   Не выполняй одни и те же операции дважды!
•   Используй «Let it crash» в интерфейсах
•   Профилируй!
•   Переписывай медленные операции на C,
    PHP, OCaml, whatever
Блокировки. (опц.)
pthread_rwlock_t rwlock; // 1       • Блокировки нужны
pthread_rwlock_rdlock(&rwlock);       многопоточным серверам
                                      (время отклика клиентам
//pthread_rwlock_wrlock(&rwlock);     очень отличается от
...do something...                    запроса к запросу)
pthread_rwlock_unlock(&rwlock);     • Возможно вы кроме
                                      функции блокировки
pthread_mutex_t mtx;    // 2          вызовете еще и
                                      планировщик (если поток
pthread_mutex_lock(&mtx);             будет заблокирован)
...do something...
pthread_mutex_unlock(&mtx);
Блокировки. (прод.) (опц.)
volatile int lock = 0; // 3 (0-unlock, 1-lock)
while (__sync_bool_compare_and_swap(&lock, 0, 1))
{usleep(10);}
...do something...
lock = 0;

• Если вы уверенны что блокировки потоков 'ПОЧТИ' не будет —
  используйте 3-й тип
• Если обработка запроса ВСЕГДА БЫСТРАЯ — а почему не aio?
SearchServer (java) (опц.)
• Поисковые РК: трафика и пользователей нужно
  много (чем быстрее отдадим пользователю
  поисковый баннер тем лучше).
• Интересных поисковых фраз много (сейчас пару
  тысяч).
• Запросов пользователей много – мы примерно
  100 пользователей в сек добавляем в различные
  поисковые аудитории.
SearchServer (java) (прод.)
 • Сервер хочется сделать независимым
   (манипуляции с ним не должны влиять на
   основной движок).
 • Перебор Regexp.match() перестал работать уже на
   паре сотен поисковых фраз.
 • Хочется учесть семантику русского языка и не
   заставлять менеджеров вводить все возможные
   сочетания слов в фразе (стемминг).
SearchServer: схема (опц.)
 РК8                                                                           РК3
               Аудитория1                                Аудитория2
 РК2                                                                           РК5

 Дом за КАД        Дома         …          Домашний уют        В доме          …
                           После стемминга и lowcast

   дом кад          дом         …           домашн уют            дом          …
                            После применения hash

  {230 5589}       {230}        …            {389 501}            {230}        …

Обратный индекс             …        230       …
                                                           Пользователь ввел:
UDP: PK2,РК8,РК3,РК5                230       {230}         дом           “у дома”
Тестирование. Конфиг (опц.)
[root@mega /usr/local/kbe]# cat etc/kbe.conf

##########################################################################
# Counters from different process's come in this queue, and than sended to cache process #
##########################################################################

# Maximum messages in system queue, number
counter_queue_circ_buff_capacity=60000
# Name for system queue. path (string) - only small sibols in root folder
counter_queue=/cache_counter_queue
# Maximum messages in system queue, number
max_msg_in_queue=200
# Maximum messages in internal queue (if it more, they'll send to cache), number
max_internal_queuq_len=5
# Period time when thread send counters to cache, microseconds
time_for_periodic_counters_send=1000000
# Time for limit wait data from system queue, (for reaction on TERM), nanoseconds
time_for_max_queue_wait=110000000
# Time for limit wait data from read process, (for reaction on TERM), nanoseconds
time_for_max_condition_wait=220000000
Тестирование. Конфиг (опц.)
# Delay to connect "dead" UUserver (in microseconds)
repeat_time_to_uuserver=1000000
# Thread count in cache pool, number
thread_count_in_pool_cache=10
# Thread count in pool unique user, number
thread_count_in_pool_unique_user_exp=10
# Time out for request for wait cache in cache queue, microseconds
time_out_in_pool_cache_queue=200000
# Time out for request for wait unique user in unique user queue,in microseconds
time_out_in_pool_unique_user_queue=200000
# Number of main fast cgi exposure process
fast_cgi_exp_process_number=5
# Ports for fastcgiexp, string - divided by ',' #
# For main process (check nginx nginx.conf)
fast_cgi_1_exp_ports=:9000,:9200,:9201
fast_cgi_2_exp_ports=:9040,:9300,:9301
fast_cgi_3_exp_ports=:9010,:9400,:9401
fast_cgi_4_exp_ports=:9020,:9500,:9501
fast_cgi_5_exp_ports=:9030,:9600,:9601
# Number of threads processing the request on one socket
fast_cgi_exp_concurency_for_port=5
Тестирование. Конфиг (опц.)
# Maximum possible clients connected through Unix socket
max_internal_clients=110
# Maximum possible clients connected through TCP socket
max_external_clients=10
cache_external_port=1030
cache_external_addr=127.0.0.1
cache_internal_port=1031
cache_internal_addr=/tmp/InternalSocketName

###################################################
# Parameters for pool initialised in fastcgidummy #
###################################################
# Number of main fast cgi exposure process
fast_cgi_dummy_process_number=2
# Ports for fastcgilight, string - divided by ',' #
# For main process (check nginx nginx.conf)
fast_cgi_1_dummy_ports=:9010,:9700
fast_cgi_2_dummy_ports=:9020,:9800
# Number of threads processing the request on one socket
fast_cgi_dummy_concurency_for_port=10

Weitere ähnliche Inhalte

Was ist angesagt?

Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...Ontico
 
"YT — новая платформа распределённых вычислений". Максим Бабенко, Яндекс.
"YT — новая платформа распределённых вычислений". Максим Бабенко, Яндекс. "YT — новая платформа распределённых вычислений". Максим Бабенко, Яндекс.
"YT — новая платформа распределённых вычислений". Максим Бабенко, Яндекс. Yandex
 
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...Ontico
 
Поговорим про память
Поговорим про памятьПоговорим про память
Поговорим про памятьAndrey Akinshin
 
Лекция 11: Программирование графических процессоров на NVIDIA CUDA
Лекция 11: Программирование графических процессоров на NVIDIA CUDAЛекция 11: Программирование графических процессоров на NVIDIA CUDA
Лекция 11: Программирование графических процессоров на NVIDIA CUDAMikhail Kurnosov
 
11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)Smolensk Computer Science Club
 
Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)
Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)
Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)Ontico
 
подходы к проектрованию, разработке и развертыванию больших систем
подходы к проектрованию, разработке и развертыванию больших системподходы к проектрованию, разработке и развертыванию больших систем
подходы к проектрованию, разработке и развертыванию больших системDenis Pavlov
 
Вячеслав Бирюков - HTTP и HTTPS
Вячеслав Бирюков - HTTP и HTTPSВячеслав Бирюков - HTTP и HTTPS
Вячеслав Бирюков - HTTP и HTTPSYandex
 
Александр Крижановский, NatSys Lab
Александр Крижановский, NatSys LabАлександр Крижановский, NatSys Lab
Александр Крижановский, NatSys LabOntico
 
Опыт внедрения и использования распределенной системы хранения данных на осно...
Опыт внедрения и использования распределенной системы хранения данных на осно...Опыт внедрения и использования распределенной системы хранения данных на осно...
Опыт внедрения и использования распределенной системы хранения данных на осно...tfmailru
 
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...Ontico
 
Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)Ontico
 
Krizhanovsky Ddos
Krizhanovsky DdosKrizhanovsky Ddos
Krizhanovsky DdosLiudmila Li
 
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2rit2011
 
Лекция 9. Программирование GPU
Лекция 9. Программирование GPUЛекция 9. Программирование GPU
Лекция 9. Программирование GPUMikhail Kurnosov
 
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...Ontico
 
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...Ontico
 
обзор средств разработки для вычислений Gpgpu
обзор средств разработки для вычислений Gpgpuобзор средств разработки для вычислений Gpgpu
обзор средств разработки для вычислений GpgpuCOMAQA.BY
 

Was ist angesagt? (20)

Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...
 
"YT — новая платформа распределённых вычислений". Максим Бабенко, Яндекс.
"YT — новая платформа распределённых вычислений". Максим Бабенко, Яндекс. "YT — новая платформа распределённых вычислений". Максим Бабенко, Яндекс.
"YT — новая платформа распределённых вычислений". Максим Бабенко, Яндекс.
 
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
 
Поговорим про память
Поговорим про памятьПоговорим про память
Поговорим про память
 
Лекция 11: Программирование графических процессоров на NVIDIA CUDA
Лекция 11: Программирование графических процессоров на NVIDIA CUDAЛекция 11: Программирование графических процессоров на NVIDIA CUDA
Лекция 11: Программирование графических процессоров на NVIDIA CUDA
 
11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)
 
Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)
Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)
Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)
 
подходы к проектрованию, разработке и развертыванию больших систем
подходы к проектрованию, разработке и развертыванию больших системподходы к проектрованию, разработке и развертыванию больших систем
подходы к проектрованию, разработке и развертыванию больших систем
 
Вячеслав Бирюков - HTTP и HTTPS
Вячеслав Бирюков - HTTP и HTTPSВячеслав Бирюков - HTTP и HTTPS
Вячеслав Бирюков - HTTP и HTTPS
 
Александр Крижановский, NatSys Lab
Александр Крижановский, NatSys LabАлександр Крижановский, NatSys Lab
Александр Крижановский, NatSys Lab
 
Опыт внедрения и использования распределенной системы хранения данных на осно...
Опыт внедрения и использования распределенной системы хранения данных на осно...Опыт внедрения и использования распределенной системы хранения данных на осно...
Опыт внедрения и использования распределенной системы хранения данных на осно...
 
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
 
Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)
 
Krizhanovsky Ddos
Krizhanovsky DdosKrizhanovsky Ddos
Krizhanovsky Ddos
 
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
 
Лекция 9. Программирование GPU
Лекция 9. Программирование GPUЛекция 9. Программирование GPU
Лекция 9. Программирование GPU
 
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
 
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
 
введение в Gpu
введение в Gpuвведение в Gpu
введение в Gpu
 
обзор средств разработки для вычислений Gpgpu
обзор средств разработки для вычислений Gpgpuобзор средств разработки для вычислений Gpgpu
обзор средств разработки для вычислений Gpgpu
 

Andere mochten auch

автоматизированная сборка Flash приложений (as2, as3). андрей жданов. зал 4
автоматизированная сборка Flash приложений (as2, as3). андрей жданов. зал 4автоматизированная сборка Flash приложений (as2, as3). андрей жданов. зал 4
автоматизированная сборка Flash приложений (as2, as3). андрей жданов. зал 4rit2011
 
как объяснить заказчику, что он не прав. денис тучин. зал 3
как объяснить заказчику, что он не прав. денис тучин. зал 3как объяснить заказчику, что он не прав. денис тучин. зал 3
как объяснить заказчику, что он не прав. денис тучин. зал 3rit2011
 
Five ways to crack content marketing ROI
Five ways to crack content marketing ROIFive ways to crack content marketing ROI
Five ways to crack content marketing ROIB2B Marketing
 
RECOMMENDATION NEMA
RECOMMENDATION NEMARECOMMENDATION NEMA
RECOMMENDATION NEMARahab Karisa
 
Benjamin d
Benjamin dBenjamin d
Benjamin dfbcat
 

Andere mochten auch (8)

автоматизированная сборка Flash приложений (as2, as3). андрей жданов. зал 4
автоматизированная сборка Flash приложений (as2, as3). андрей жданов. зал 4автоматизированная сборка Flash приложений (as2, as3). андрей жданов. зал 4
автоматизированная сборка Flash приложений (as2, as3). андрей жданов. зал 4
 
как объяснить заказчику, что он не прав. денис тучин. зал 3
как объяснить заказчику, что он не прав. денис тучин. зал 3как объяснить заказчику, что он не прав. денис тучин. зал 3
как объяснить заказчику, что он не прав. денис тучин. зал 3
 
Discurso20
Discurso20Discurso20
Discurso20
 
Five ways to crack content marketing ROI
Five ways to crack content marketing ROIFive ways to crack content marketing ROI
Five ways to crack content marketing ROI
 
Informática Aplicada I - Prof. Giancarlo
Informática Aplicada I - Prof. GiancarloInformática Aplicada I - Prof. Giancarlo
Informática Aplicada I - Prof. Giancarlo
 
Electrical Distribution Maintenance Services Guide
Electrical Distribution Maintenance Services GuideElectrical Distribution Maintenance Services Guide
Electrical Distribution Maintenance Services Guide
 
RECOMMENDATION NEMA
RECOMMENDATION NEMARECOMMENDATION NEMA
RECOMMENDATION NEMA
 
Benjamin d
Benjamin dBenjamin d
Benjamin d
 

Ähnlich wie как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков. зал 3

Developing highload servers with Java
Developing highload servers with JavaDeveloping highload servers with Java
Developing highload servers with JavaAndrei Pangin
 
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)Ontico
 
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...Ontico
 
GRANIT — Global Russian Advanced Network Initiative
GRANIT — Global Russian Advanced Network InitiativeGRANIT — Global Russian Advanced Network Initiative
GRANIT — Global Russian Advanced Network InitiativeARCCN
 
Другая виртуализация
Другая виртуализацияДругая виртуализация
Другая виртуализацияYandex
 
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)Ontico
 
Intel DPDK в решениях для противодействия DDoS-атакам
Intel DPDK в решениях для противодействия DDoS-атакамIntel DPDK в решениях для противодействия DDoS-атакам
Intel DPDK в решениях для противодействия DDoS-атакамГлеб Хохлов
 
Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)
Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)
Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)Ontico
 
Марина Широчкина: Верстка. Вид снизу
Марина Широчкина: Верстка. Вид снизуМарина Широчкина: Верстка. Вид снизу
Марина Широчкина: Верстка. Вид снизуYandex
 
TMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: GenodeTMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: GenodeIosif Itkin
 
Java tricks for high-load server programming
Java tricks for high-load server programmingJava tricks for high-load server programming
Java tricks for high-load server programmingAndrei Pangin
 
Выжимаем из сервера максимум (Андрей Паньгин)
Выжимаем из сервера максимум (Андрей Паньгин)Выжимаем из сервера максимум (Андрей Паньгин)
Выжимаем из сервера максимум (Андрей Паньгин)Ontico
 
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...Ontico
 
Zabbix: рецепты высокопроизводительного мониторинга / Алексей Владышев (Zabbix)
Zabbix: рецепты высокопроизводительного мониторинга / Алексей Владышев (Zabbix)Zabbix: рецепты высокопроизводительного мониторинга / Алексей Владышев (Zabbix)
Zabbix: рецепты высокопроизводительного мониторинга / Алексей Владышев (Zabbix)Ontico
 
Настройка kubernetes: tips and tricks / Михаил Прокопчук (Avito)
Настройка kubernetes: tips and tricks / Михаил Прокопчук (Avito)Настройка kubernetes: tips and tricks / Михаил Прокопчук (Avito)
Настройка kubernetes: tips and tricks / Михаил Прокопчук (Avito)Ontico
 
Настройка Kubernetes: tips ans tricks
Настройка Kubernetes: tips ans tricksНастройка Kubernetes: tips ans tricks
Настройка Kubernetes: tips ans tricksMike Prokopchuk
 
Nexus 7000 – архитектура передачи данных. Поиск и устранение неисправностей.
Nexus 7000 – архитектура передачи данных. Поиск и устранение неисправностей.Nexus 7000 – архитектура передачи данных. Поиск и устранение неисправностей.
Nexus 7000 – архитектура передачи данных. Поиск и устранение неисправностей.Cisco Russia
 
Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)Ontico
 
Виртуализация сетевой инфраструктуры на примере использования IOS-XRv 9000 и ...
Виртуализация сетевой инфраструктуры на примере использования IOS-XRv 9000 и ...Виртуализация сетевой инфраструктуры на примере использования IOS-XRv 9000 и ...
Виртуализация сетевой инфраструктуры на примере использования IOS-XRv 9000 и ...Cisco Russia
 
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Mikhail Kurnosov
 

Ähnlich wie как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков. зал 3 (20)

Developing highload servers with Java
Developing highload servers with JavaDeveloping highload servers with Java
Developing highload servers with Java
 
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
 
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
 
GRANIT — Global Russian Advanced Network Initiative
GRANIT — Global Russian Advanced Network InitiativeGRANIT — Global Russian Advanced Network Initiative
GRANIT — Global Russian Advanced Network Initiative
 
Другая виртуализация
Другая виртуализацияДругая виртуализация
Другая виртуализация
 
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
 
Intel DPDK в решениях для противодействия DDoS-атакам
Intel DPDK в решениях для противодействия DDoS-атакамIntel DPDK в решениях для противодействия DDoS-атакам
Intel DPDK в решениях для противодействия DDoS-атакам
 
Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)
Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)
Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)
 
Марина Широчкина: Верстка. Вид снизу
Марина Широчкина: Верстка. Вид снизуМарина Широчкина: Верстка. Вид снизу
Марина Широчкина: Верстка. Вид снизу
 
TMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: GenodeTMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: Genode
 
Java tricks for high-load server programming
Java tricks for high-load server programmingJava tricks for high-load server programming
Java tricks for high-load server programming
 
Выжимаем из сервера максимум (Андрей Паньгин)
Выжимаем из сервера максимум (Андрей Паньгин)Выжимаем из сервера максимум (Андрей Паньгин)
Выжимаем из сервера максимум (Андрей Паньгин)
 
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
 
Zabbix: рецепты высокопроизводительного мониторинга / Алексей Владышев (Zabbix)
Zabbix: рецепты высокопроизводительного мониторинга / Алексей Владышев (Zabbix)Zabbix: рецепты высокопроизводительного мониторинга / Алексей Владышев (Zabbix)
Zabbix: рецепты высокопроизводительного мониторинга / Алексей Владышев (Zabbix)
 
Настройка kubernetes: tips and tricks / Михаил Прокопчук (Avito)
Настройка kubernetes: tips and tricks / Михаил Прокопчук (Avito)Настройка kubernetes: tips and tricks / Михаил Прокопчук (Avito)
Настройка kubernetes: tips and tricks / Михаил Прокопчук (Avito)
 
Настройка Kubernetes: tips ans tricks
Настройка Kubernetes: tips ans tricksНастройка Kubernetes: tips ans tricks
Настройка Kubernetes: tips ans tricks
 
Nexus 7000 – архитектура передачи данных. Поиск и устранение неисправностей.
Nexus 7000 – архитектура передачи данных. Поиск и устранение неисправностей.Nexus 7000 – архитектура передачи данных. Поиск и устранение неисправностей.
Nexus 7000 – архитектура передачи данных. Поиск и устранение неисправностей.
 
Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)
 
Виртуализация сетевой инфраструктуры на примере использования IOS-XRv 9000 и ...
Виртуализация сетевой инфраструктуры на примере использования IOS-XRv 9000 и ...Виртуализация сетевой инфраструктуры на примере использования IOS-XRv 9000 и ...
Виртуализация сетевой инфраструктуры на примере использования IOS-XRv 9000 и ...
 
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
 

Mehr von rit2011

классификация Ddos. александр лямин, артем гавриченков. зал 2
классификация Ddos. александр лямин, артем гавриченков. зал 2классификация Ddos. александр лямин, артем гавриченков. зал 2
классификация Ddos. александр лямин, артем гавриченков. зал 2rit2011
 
Chef. кто на кухне хозяин. концепция devops. а,титов. зал 2
Chef. кто на кухне хозяин. концепция devops. а,титов. зал 2Chef. кто на кухне хозяин. концепция devops. а,титов. зал 2
Chef. кто на кухне хозяин. концепция devops. а,титов. зал 2rit2011
 
как объяснить заказчику, что он не прав. денис тучин. зал 3
как объяснить заказчику, что он не прав. денис тучин. зал 3как объяснить заказчику, что он не прав. денис тучин. зал 3
как объяснить заказчику, что он не прав. денис тучин. зал 3rit2011
 
классификация Ddos. александр лямин, артем гавриченков. зал 2
классификация Ddos. александр лямин, артем гавриченков. зал 2классификация Ddos. александр лямин, артем гавриченков. зал 2
классификация Ddos. александр лямин, артем гавриченков. зал 2rit2011
 
Kpi разработчика vs kpi разработки. евгения фирсова. зал 1
Kpi разработчика vs kpi разработки. евгения фирсова. зал 1Kpi разработчика vs kpi разработки. евгения фирсова. зал 1
Kpi разработчика vs kpi разработки. евгения фирсова. зал 1rit2011
 
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....rit2011
 
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....rit2011
 
что и почему вы должны программировать на Erlang.максим лапшин. зал 4
что и почему вы должны программировать на Erlang.максим лапшин. зал 4что и почему вы должны программировать на Erlang.максим лапшин. зал 4
что и почему вы должны программировать на Erlang.максим лапшин. зал 4rit2011
 
I pv6 малоизвестные подробности. андрей пантюхин. зал 2
I pv6   малоизвестные подробности. андрей пантюхин. зал 2I pv6   малоизвестные подробности. андрей пантюхин. зал 2
I pv6 малоизвестные подробности. андрей пантюхин. зал 2rit2011
 
безопасность веб приложений сегодня. дмитрий евтеев. зал 4
безопасность веб приложений сегодня. дмитрий евтеев. зал 4безопасность веб приложений сегодня. дмитрий евтеев. зал 4
безопасность веб приложений сегодня. дмитрий евтеев. зал 4rit2011
 
как стать хорошим веб технологом. нарек мкртчян. зал 4
как стать хорошим веб технологом. нарек мкртчян. зал 4как стать хорошим веб технологом. нарек мкртчян. зал 4
как стать хорошим веб технологом. нарек мкртчян. зал 4rit2011
 
сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...
сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...
сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...rit2011
 
выращиваем интерфейс своими руками. ольга павлова. зал 3
выращиваем интерфейс своими руками. ольга павлова. зал 3выращиваем интерфейс своими руками. ольга павлова. зал 3
выращиваем интерфейс своими руками. ольга павлова. зал 3rit2011
 
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2rit2011
 
от Flash к html5. александр бацуев. зал 4
от Flash к html5. александр бацуев. зал 4от Flash к html5. александр бацуев. зал 4
от Flash к html5. александр бацуев. зал 4rit2011
 
Ie9 и ie10. алекс могилевский. зал 2
Ie9 и ie10. алекс могилевский. зал 2Ie9 и ie10. алекс могилевский. зал 2
Ie9 и ie10. алекс могилевский. зал 2rit2011
 
сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...
сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...
сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...rit2011
 
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...rit2011
 
рисуем тз. эффективный способ коммуникации в веб проектах. артем вольфтруб. з...
рисуем тз. эффективный способ коммуникации в веб проектах. артем вольфтруб. з...рисуем тз. эффективный способ коммуникации в веб проектах. артем вольфтруб. з...
рисуем тз. эффективный способ коммуникации в веб проектах. артем вольфтруб. з...rit2011
 
типология личности и прогноз отношений по а. афанасьеву. сергей котырев. зал 2
типология личности и прогноз отношений по а. афанасьеву. сергей котырев. зал 2типология личности и прогноз отношений по а. афанасьеву. сергей котырев. зал 2
типология личности и прогноз отношений по а. афанасьеву. сергей котырев. зал 2rit2011
 

Mehr von rit2011 (20)

классификация Ddos. александр лямин, артем гавриченков. зал 2
классификация Ddos. александр лямин, артем гавриченков. зал 2классификация Ddos. александр лямин, артем гавриченков. зал 2
классификация Ddos. александр лямин, артем гавриченков. зал 2
 
Chef. кто на кухне хозяин. концепция devops. а,титов. зал 2
Chef. кто на кухне хозяин. концепция devops. а,титов. зал 2Chef. кто на кухне хозяин. концепция devops. а,титов. зал 2
Chef. кто на кухне хозяин. концепция devops. а,титов. зал 2
 
как объяснить заказчику, что он не прав. денис тучин. зал 3
как объяснить заказчику, что он не прав. денис тучин. зал 3как объяснить заказчику, что он не прав. денис тучин. зал 3
как объяснить заказчику, что он не прав. денис тучин. зал 3
 
классификация Ddos. александр лямин, артем гавриченков. зал 2
классификация Ddos. александр лямин, артем гавриченков. зал 2классификация Ddos. александр лямин, артем гавриченков. зал 2
классификация Ddos. александр лямин, артем гавриченков. зал 2
 
Kpi разработчика vs kpi разработки. евгения фирсова. зал 1
Kpi разработчика vs kpi разработки. евгения фирсова. зал 1Kpi разработчика vs kpi разработки. евгения фирсова. зал 1
Kpi разработчика vs kpi разработки. евгения фирсова. зал 1
 
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
 
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
ускорение Front end разработки с помощью haml, sass и compass. андрей ситник....
 
что и почему вы должны программировать на Erlang.максим лапшин. зал 4
что и почему вы должны программировать на Erlang.максим лапшин. зал 4что и почему вы должны программировать на Erlang.максим лапшин. зал 4
что и почему вы должны программировать на Erlang.максим лапшин. зал 4
 
I pv6 малоизвестные подробности. андрей пантюхин. зал 2
I pv6   малоизвестные подробности. андрей пантюхин. зал 2I pv6   малоизвестные подробности. андрей пантюхин. зал 2
I pv6 малоизвестные подробности. андрей пантюхин. зал 2
 
безопасность веб приложений сегодня. дмитрий евтеев. зал 4
безопасность веб приложений сегодня. дмитрий евтеев. зал 4безопасность веб приложений сегодня. дмитрий евтеев. зал 4
безопасность веб приложений сегодня. дмитрий евтеев. зал 4
 
как стать хорошим веб технологом. нарек мкртчян. зал 4
как стать хорошим веб технологом. нарек мкртчян. зал 4как стать хорошим веб технологом. нарек мкртчян. зал 4
как стать хорошим веб технологом. нарек мкртчян. зал 4
 
сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...
сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...
сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...
 
выращиваем интерфейс своими руками. ольга павлова. зал 3
выращиваем интерфейс своими руками. ольга павлова. зал 3выращиваем интерфейс своими руками. ольга павлова. зал 3
выращиваем интерфейс своими руками. ольга павлова. зал 3
 
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
 
от Flash к html5. александр бацуев. зал 4
от Flash к html5. александр бацуев. зал 4от Flash к html5. александр бацуев. зал 4
от Flash к html5. александр бацуев. зал 4
 
Ie9 и ie10. алекс могилевский. зал 2
Ie9 и ie10. алекс могилевский. зал 2Ie9 и ie10. алекс могилевский. зал 2
Ie9 и ie10. алекс могилевский. зал 2
 
сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...
сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...
сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...
 
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
 
рисуем тз. эффективный способ коммуникации в веб проектах. артем вольфтруб. з...
рисуем тз. эффективный способ коммуникации в веб проектах. артем вольфтруб. з...рисуем тз. эффективный способ коммуникации в веб проектах. артем вольфтруб. з...
рисуем тз. эффективный способ коммуникации в веб проектах. артем вольфтруб. з...
 
типология личности и прогноз отношений по а. афанасьеву. сергей котырев. зал 2
типология личности и прогноз отношений по а. афанасьеву. сергей котырев. зал 2типология личности и прогноз отношений по а. афанасьеву. сергей котырев. зал 2
типология личности и прогноз отношений по а. афанасьеву. сергей котырев. зал 2
 

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

  • 2. Задачи перед сервисом • Производительность – сейчас: 1000 баннеров/сек. – хотим: 10 000 баннеров/сек. – время отклика < 200 миллисекунд. • 365*24*7, обязательно отдать контент (хотя бы заглушку). • Много площадок (>1.000), много баннеров (>100.000).
  • 3. Задачи (прод.) • Таргетинги – Стандартные (UserAgent, geo …). – Стандартные ограничения, скорость, бюджет. – Стандартные уникальные ограничения. – Аудиторные таргетинги (ретагетинг: бумеранг, поисковый, соцдем). • Точный подсчёт показов, кликов и событий, начислений и списаний денег.
  • 4. Резюмируем свойства • Горизонтально масштабируемый (до 10000 хитов/сек). Перекрутов, в идеале, быть не должно. • Многопоточный (медленные запросы не должны держать быстрые). Минимизировать блокировки. • Синхронизация серверов в режиме “реального времени” (уменьшаем перекруты).
  • 5. Схема сервиса в целом Площадка Клиент Пользователь Пользователь hadoop PHP nginx hadoop front front SearchServer MySQL uuserver sphinx соцдем uuserver
  • 6. UUServer • Кука всего 4 KB – мало. • Очень близко к хранилищу key/value. • Выдача данных по TCP (свой протокол). • Прием данных по UDP (свой протокол). • Масштабируемый. • Многопоточный (много блокировок).
  • 7. UUServer (прод.) • Внутри 64 независимых дерева - боремся с локами и балансировками дерева при вставке. • Раз в 5 мин запускается цикл сохранения пользователей на диск. • Классический ретаргетинг организован плагинами на стороне uuserver. • Соединения ‘постоянные’.
  • 8. Схема uuserver TCP запрос UPD пакет (событие) UPD пакет (событие) foreach(libs) {Retargeting;} Выбор map Поиск user Выбираем очередь Выбор map Выбор map Поиск user Анализ Поиск user Map.insert(…) Выбираем очередь TCP ответ Increment, Update;
  • 9. Схема front nginx fastcgiexp UUserver fastcgievent fastcgidummy fastcgiexp UUserver fastcgievent fastcgidummy CounterQueue MySQL cache Syslog Gearman sender receiver SearchServer hadoop receiver sender
  • 10. Cache • Хранит много объектов, если примитивно, то std::map(u_int64_t, std::vector<...sort...> *). Значение в каждой записи — это табличка из СУБД. • Объекты — берутся из базы данных (она отвечает за сортировку и за целостность данных). • Данные в некоторых 'табличках' меняются редко (площадки, рекламные кампании, цены), или очень редко (гео база) — изменения всегда приходят из СУБД.
  • 11. Cache (прод.) • Есть 'таблички', данные в которых меняются часто ('счетчики') — изменения приходят как из СУБД так и от CounterQueue. • Многопоточный (на каждое соединение — свой поток). • Соединения 'постоянные'. • Блокировки (чтение/запись) накладываются на всю таблицу.
  • 12. Cache: логика обновления CacheInOut { TCP запрос Данные из СУБД u_int32_t size; u_int32_t func; Анализ и char data[size]; построение } ‘таблички’ WaitToWrite() TCP ответ Данные из Cache Swap(std::vector<...>*) Delete old data Done()
  • 13. Cache: выбор баннеров TCP запрос WaitToRead(),… Find place, geo Сортировка РК foreach(PK) {Targets;} TCP ответ Done(),… result
  • 14. Cache: инкрементация (2экз) Есть 2 экземпляра Increment(…) Счетчиков (Readers-1) WaitToWrite() TCP запрос Call Increment(2) foreach(…){ Increment; syslog(...);} Swap(1,2) TCP ответ Done() Call Increment(2)
  • 15. FastCgiExp • Сервер – и диспетчер и обработчик. • Есть пулы нитей (nginx (fastcgi), cache, uuserver). • В каждом процессе хранятся тела баннеров, заглушек и ссылок (доступ к ним производиться через read/write блокировку). • Настройка количества listen сокетов, размеры пулов, количество процессов производится редактированием файла конфигурации, с последующим перезапуском.
  • 16. FastCgiExp: запрос FastCgi запрос Выбрать Нить PoolThread FastCgi Dummy CheckReferer UDP to SearchServer FastCgi ответ Выделить Нить PoolThread UUServer Get User Info PoolThread Cache mq_send(…) mq_send(…) Выделить Нить Get BannerId UDP to UUserver Banner
  • 17. FastCgiEvent: запрос FastCgi запрос Выбрать Нить PoolThread FastCgi 204 Выделить Нить PoolThread UUServer FastCgi ответ Get User Info mq_send(…) Get Location mq_send(…) UDP to UUserver
  • 18. FastCgiDummy: запрос FastCgi запрос Выделить Нить PoolThread FastCgi UDP to SearchServer FastCgi ответ Dummy
  • 19. Что дальше? • Постоянные изменения логики движка (поддержка). • Написать антинакрутчик (aio). • Переписать UUserver (aio) ? • Мониторинг серверов (zabbix).
  • 20. Что дальше? (прод.) • Новые интерфейсы рекламодателям и владельцам площадок (и поддержка и юзабилити). • Соцдем. • Новые отчеты (hadoop). • Мониторинг серверов (zabbix).
  • 21. Оптимизация трафика Трафика много, денег Возможно мало уников мало? Возможно сейчас у нас нет рекламы для вас (новые форматы) Возможно вы хотите много денег, или другие таргетинги. Опрашивайте рекламные движки каскадом Делитесь информацией о своих юзерах
  • 22. Тестирование. Машина. Процессор Intel(R) Xeon(R) CPU E5630 @ 2.53GHz (2527.30-MHz K8- class CPU), 2x4 core Память 96 GB nload Incoming: Outgoing: Curr: 13.65 MBit/s Curr: 57.67 MBit/s Avg: 16.72 MBit/s Avg: 3.93 MBit/s Min: 5.52 kBit/s Min: 1.02 kBit/s Max: 66.14 MBit/s Max: 16.60 MBit/s Ttl: 783.21 MByte Ttl: 402.25 MByte netstat 27 LISTEN 625 SYN_SENT 42 CLOSE_WAIT 971 LAST_ACK 42 FIN_WAIT_2 1928 ESTABLISHED 73 CLOSED 23593 TIME_WAIT
  • 23. Тестирование. Бенчмарк. denis:/home/bdn# /usr/sbin/ab -r -c100 -n10000 -b2048 -C kui1v=777 "http://10.5.1.50/exp?sid=5&bt=5&bn=1&bc=3&ct=2" 100/10000 100/10000 100/50000 100/50000 1000/10000 10000/10000 1000/50000 10000/50000 4050 500 450 4000 400 микросек 3950 350 кол-во 3900 300 запросов 250 3850 в сек 200 3800 150 100 3750 50 3700 0 % % % % % % % % % одновременные 0 0 6 5 0 0 5 8 9 0 5 6 7 8 9 9 9 9 1 соединения / кол-во запросов всего доля запросов
  • 24. Тестирование. TOP. [root@mega ~]# top last pid: 10965; load averages: 13.32, 6.52, 3.64 up 1+23:47:28 16:18:52 646 processes: 8 running, 638 sleeping CPU: 55.2% user, 0.0% nice, 14.3% system, 7.2% interrupt, 23.3% idle Mem: 18G Active, 1610M Inact, 11G Wired, 136K Cache, 9833M Buf, 63G Free Swap: 4096M Total, 4096M Free
  • 25. Тестирование. TOP. PID UN THR PRI NICE SIZE RES STATE C TIME WCPU COMMAND 2583 kbe 54 47 0 220M 147M CPU7 7 21:25 353.47% cache 706 root 1 73 0 6956K 1520K RUN 7 4:29 23.39% syslogd 10890 www 1 65 0 50268K 36736K RUN 1 1:01 18.46% nginx 10891 www 1 67 0 42076K 30064K RUN 1 0:56 18.16% nginx 2615 kbe 49 44 0 76784K 22176K nanslp 0 1:42 11.52% fcgiexp 2616 kbe 49 44 0 78832K 22268K nanslp 1 1:43 11.43% fcgiexp 2617 кbe 49 44 0 82672K 20876K nanslp 0 1:40 11.33% fcgiexp 2613 kbe 49 44 0 78704K 21924K nanslp 0 1:43 11.23% fcgiexp 2614 kbe 49 44 0 80752K 22112K nanslp 1 1:42 11.04% fcgiexp 1557 kbe 170 44 0 18291M 18159M sbwait 5 100:46 3.52% uuserver 2609 kbe 3 44 0 28944K 4052K nanslp 0 0:06 1.07% sender 2605 kbe 3 44 0 47372K 4232K nanslp 7 0:08 0.98% counterqueue 2626 kbe 73 44 0 62856K 22464K nanslp 5 0:16 0.00% fcgievent 2639 kbe 73 44 0 62856K 22472K nanslp 3 0:16 0.00% fcgievent 1013 root 1 44 0 12064K 4152K select 3 0:02 0.00% sendmail 10889 root 1 76 0 17500K 6024K pause 2 0:00 0.00% nginx
  • 26. Масшабируемая баннерокрутилка: как это было на Erlang Артем Гавриченков, Highload Lab
  • 27. Задача • Выдача ссылок на новости – База из тысяч новостей – Ссылки выбираются произвольно – Распределение – неравномерное • Форматирование ссылок перед выдачей – Ссылки должны иметь формат блока – Дополнительные поля: идентификатор блока, …
  • 28. Ta-da! • Требования: >= 5000 запросов в секунду – Не справляемся – должны быстро выдавать пустую страницу, чтобы не «ломать» вёрстку – Никакого кэширования • Срок выполнения: полтора месяца. – При этом у разработчика баннерокрутилки есть и другие задачи
  • 29. Схема решения • Структуры в памяти, хранящие новости и статистику показов • Множество потоков, обрабатывающих HTTP-запросы • Контроллер – добавляющий и удаляющий новости – собирающий статистику – на основе TCP-сокетов
  • 30. Схема решения Структуры в памяти, хранящие новости и статистику показов Множество потоков, обрабатывающих запросы Контроллер добавляющий и удаляющий новости собирающий статистику на основе TCP-сокетов
  • 31. Erlang • DSL для многопоточных приложений • Встроенные в язык примитивы для посылки и приёма сообщений • Встроенные в язык шаблоны поведения • Встроенная в язык in-memory БД
  • 32. Схема решения • Структуры в памяти, хранящие новости и статистику показов: mnesia/ets/dict! • Множество потоков, обрабатывающих HTTP-запросы: gen_server! • Контроллер: gen_tcp! добавляющий и удаляющий новости собирающий статистику на основе TCP-сокетов
  • 33. Схема решения • Структуры в памяти, хранящие новости и статистику показов: mnesia/ets/dict! • Множество потоков, обрабатывающих HTTP-запросы: gen_server! – который уже написан за нас! mochiweb/misultin • Контроллер: gen_tcp! добавляющий и удаляющий новости собирающий статистику Batteries included на основе TCP-сокетов
  • 35. Костяк решения • HTTP-сервер Mochiweb получает запрос, создаёт поток • Поток забирает из Mnesia данные • Поток производит выборку, сортирует данные, форматирует строки, выдаёт, умирает. Все счастливы. «In theory, there's no difference between theory and practice. In practice, there is». L. A. van der Snepscheut.
  • 36. Факап #1 У каждой новости есть коэффициент важности. В соответствии с этим коэффициентом необходимо выдавать новость чаще или реже остальных. • Перед выдачей нужно назначать взвешенные произвольные числа каждой новости и делать по ним выборку. • Новостей много.
  • 37. Факап #1 • Mnesia построена на основе ETS • http://www.erlang.org/doc/man/ets.html: «In the current implementation, every object insert and look-up operation results in a copy of the object.» • Т. е. в копировании сотен новостей из потока в поток. Slow as hell.
  • 38. Эврика: • Вместо ETS напишем собственную структуру данных на основе gen_server, dict, queue, blackjack и hookers. • Повесим её в виде отдельного потока • Будем делать там грубую предвыборку новостей, которые потом быстро скопируются в рабочий поток
  • 39. Результат: рост производительности в 3 раза Вывод: – всегда думай, что копируешь! – профилируй!
  • 40. Костяк решения v0.2 • HTTP-сервер Mochiweb получает запрос, создаёт поток • Поток отправляет запрос в gen_server • gen_server производит предвыборку новостей и присылает результат • Поток производит выборку, сортирует данные, форматирует строки, выдаёт, умирает. Все счастливы.
  • 41. Факап #2 Новости – это текст. Текст – это строки. • Строки в Erlang – это связные списки символов • IO в Erlang – это очень медленно
  • 42. Эврика: • Если вы пишете на Erlang, то строка символов записывается так: "Hello world!~n" • Конкатенация записывается так: "Hello " ++ Username ++ "!~n"
  • 43. Эврика: • Если вы пишете на Erlang веб-приложения, то строка символов записывается так: <<"Hello world!~n">> • Конкатенация записывается так: [<<"Hello ">>, Username, <<"!~n">>]
  • 44. Почему: • <<>> – встроенный бинарный тип • <<"">> – бинарная строка • Списки символов нужно обрабатывать перед выдачей • Вывод бинарных данных – это просто вызов writev(2) – Blazingly Fast
  • 45. Почему: • "Hello" ++ "!n" => "Hello!n" => строка – Конкатенация списков – O(n) – Вывод строки => цикл по списку из 7 символов • [<<"Hello">>, <<"!n">>] – тип iolist() – Добавление в начало списка – O(1) – Вывод => цикл по списку из 2 элементов – Built-in функциям I/O всё равно, что выводить
  • 46. Кроме того: • Строковые операции, наподобие обработки регулярных выражений, всё равно дорогие • Впрочем, они вообще не очень дешевы. Надо делать предобработку • Кэширование конструируемых URL новостей и т. п. позволило отыграть 15%
  • 47. Результат: рост производительности в 10 (десять) раз Вывод: – всегда думай, как обрабатывать строки! – профилируй!
  • 48. Костяк решения v0.3 • HTTP-сервер Mochiweb получает запрос, создаёт поток • Поток отправляет запрос в gen_server • gen_server производит предвыборку новостей и присылает результат • Поток производит выборку, сортирует данные, форматирует iolist()'ы, выдаёт, умирает.
  • 49. Результат: рост производительности в 10 (десять) раз Вывод: всегда думай, как обрабатывать строки! профилируй!
  • 50. Костяк решения v0.4 • HTTP-сервер Misultin получает запрос, создаёт поток • Поток отправляет запрос в gen_server • gen_server производит предвыборку новостей и присылает результат • Поток производит выборку, сортирует данные, форматирует iolist()'ы, выдаёт, умирает.
  • 51. Misultin • Реализация gen_server, как и Mochiweb • Интерфейс, аналогичный Mochiweb • Стабильно на 10-15% быстрее
  • 52. Результат • Один человекомесяц • Быстрое веб-приложение # ab -qc 7200 -n 450000 http://localhost/block/35237 | grep Requests per sec Requests per second: 7693.35 [#/sec] (mean) #
  • 53. Killing feature! Начиная со второй недели разработки (как только был написан каркас), приложение было готово к работе. • Ни отладки • Ни непредусмотренного поведения • Только фичи и профилирование
  • 54. Killing feature! • Ни отладки • Ни непредусмотренного поведения В Erlang есть концепция «Let it crash». Близкий перевод – «Ну и хрен с ним».
  • 55. Let it crash • На обычном языке программирования: res = web_server.start_link(callback = F) if res == web_server.port_in_use: raise Exception("Port in use") elif res == web_server.socket_error: raise Exception("Socket error") elif res == errno.EACCES: raise Exception("Not enough privileges")
  • 56. Let it crash • На Erlang {ok, Pid} = misultin:start_link([{loop, F}]). if res == web_server.port_in_use: raise Exception("Port in use") elif res == web_server.socket_error: raise Exception("Socket error") elif res == errno.EACCES: raise Exception("Not enough privileges")
  • 57. Let it crash • На Erlang {ok, Pid} = misultin:start_link([{loop, F}]). if res == web_server.port_in_use: raise Exception("Port in use") Not ok? {badmatch, {error, eacces}} raise Exception("Socket error") elif res == errno.EACCES: raise Exception("Not enough privileges")
  • 58. Результат • Один человекомесяц • Быстрое веб-приложение • Стабильное веб-приложение – eunit и «Let it crash» • Минимум кода – множество встроенных примитивов и «Let it crash» • Минимум требуемого опыта
  • 59. Уровень кодера • С одной стороны, Erlang учится за 2 недели • С другой стороны, нужно иметь навыки программирования. Not all batteries included
  • 60. Напутствие • Предобрабатывай данные, пока это дёшево! • Не выполняй одни и те же операции дважды! • Используй «Let it crash» в интерфейсах • Профилируй! • Переписывай медленные операции на C, PHP, OCaml, whatever
  • 61. Блокировки. (опц.) pthread_rwlock_t rwlock; // 1 • Блокировки нужны pthread_rwlock_rdlock(&rwlock); многопоточным серверам (время отклика клиентам //pthread_rwlock_wrlock(&rwlock); очень отличается от ...do something... запроса к запросу) pthread_rwlock_unlock(&rwlock); • Возможно вы кроме функции блокировки pthread_mutex_t mtx; // 2 вызовете еще и планировщик (если поток pthread_mutex_lock(&mtx); будет заблокирован) ...do something... pthread_mutex_unlock(&mtx);
  • 62. Блокировки. (прод.) (опц.) volatile int lock = 0; // 3 (0-unlock, 1-lock) while (__sync_bool_compare_and_swap(&lock, 0, 1)) {usleep(10);} ...do something... lock = 0; • Если вы уверенны что блокировки потоков 'ПОЧТИ' не будет — используйте 3-й тип • Если обработка запроса ВСЕГДА БЫСТРАЯ — а почему не aio?
  • 63. SearchServer (java) (опц.) • Поисковые РК: трафика и пользователей нужно много (чем быстрее отдадим пользователю поисковый баннер тем лучше). • Интересных поисковых фраз много (сейчас пару тысяч). • Запросов пользователей много – мы примерно 100 пользователей в сек добавляем в различные поисковые аудитории.
  • 64. SearchServer (java) (прод.) • Сервер хочется сделать независимым (манипуляции с ним не должны влиять на основной движок). • Перебор Regexp.match() перестал работать уже на паре сотен поисковых фраз. • Хочется учесть семантику русского языка и не заставлять менеджеров вводить все возможные сочетания слов в фразе (стемминг).
  • 65. SearchServer: схема (опц.) РК8 РК3 Аудитория1 Аудитория2 РК2 РК5 Дом за КАД Дома … Домашний уют В доме … После стемминга и lowcast дом кад дом … домашн уют дом … После применения hash {230 5589} {230} … {389 501} {230} … Обратный индекс … 230 … Пользователь ввел: UDP: PK2,РК8,РК3,РК5 230 {230} дом “у дома”
  • 66. Тестирование. Конфиг (опц.) [root@mega /usr/local/kbe]# cat etc/kbe.conf ########################################################################## # Counters from different process's come in this queue, and than sended to cache process # ########################################################################## # Maximum messages in system queue, number counter_queue_circ_buff_capacity=60000 # Name for system queue. path (string) - only small sibols in root folder counter_queue=/cache_counter_queue # Maximum messages in system queue, number max_msg_in_queue=200 # Maximum messages in internal queue (if it more, they'll send to cache), number max_internal_queuq_len=5 # Period time when thread send counters to cache, microseconds time_for_periodic_counters_send=1000000 # Time for limit wait data from system queue, (for reaction on TERM), nanoseconds time_for_max_queue_wait=110000000 # Time for limit wait data from read process, (for reaction on TERM), nanoseconds time_for_max_condition_wait=220000000
  • 67. Тестирование. Конфиг (опц.) # Delay to connect "dead" UUserver (in microseconds) repeat_time_to_uuserver=1000000 # Thread count in cache pool, number thread_count_in_pool_cache=10 # Thread count in pool unique user, number thread_count_in_pool_unique_user_exp=10 # Time out for request for wait cache in cache queue, microseconds time_out_in_pool_cache_queue=200000 # Time out for request for wait unique user in unique user queue,in microseconds time_out_in_pool_unique_user_queue=200000 # Number of main fast cgi exposure process fast_cgi_exp_process_number=5 # Ports for fastcgiexp, string - divided by ',' # # For main process (check nginx nginx.conf) fast_cgi_1_exp_ports=:9000,:9200,:9201 fast_cgi_2_exp_ports=:9040,:9300,:9301 fast_cgi_3_exp_ports=:9010,:9400,:9401 fast_cgi_4_exp_ports=:9020,:9500,:9501 fast_cgi_5_exp_ports=:9030,:9600,:9601 # Number of threads processing the request on one socket fast_cgi_exp_concurency_for_port=5
  • 68. Тестирование. Конфиг (опц.) # Maximum possible clients connected through Unix socket max_internal_clients=110 # Maximum possible clients connected through TCP socket max_external_clients=10 cache_external_port=1030 cache_external_addr=127.0.0.1 cache_internal_port=1031 cache_internal_addr=/tmp/InternalSocketName ################################################### # Parameters for pool initialised in fastcgidummy # ################################################### # Number of main fast cgi exposure process fast_cgi_dummy_process_number=2 # Ports for fastcgilight, string - divided by ',' # # For main process (check nginx nginx.conf) fast_cgi_1_dummy_ports=:9010,:9700 fast_cgi_2_dummy_ports=:9020,:9800 # Number of threads processing the request on one socket fast_cgi_dummy_concurency_for_port=10