SlideShare a Scribd company logo
1 of 33
Download to read offline
Как мы храним 75 млн
 пользователей (пишем
неблокируемый сервер)
     Бирюков Денис
    Компания Каванга
Самопиар :)
• Рекламная сеть (много баннеров, много сайтов)
• При показе баннера мы используем таргетинги
   – уникальные ограничения
   – ретаргетинг
   – таргетинг по соцдему
• Нужен сервер
   – Помним кому, где и что показывали
   – Знаем пол и возраст
   – Решаем что именно показать
Что было?
        Многопоточный сервер
• - Блокировки          • + 5% CPU
• - Фрагментация        • + Высокая скорость
• - Низкий КПД по         ответа
  памяти (в 3,5 раза)   • + Сохранение на диск
  удаление объектов       без доп. памяти
  раз в час             • + Быстрый запуск
Задача
• 75 млн пользователей за 3 МЕС, в день
  меняется 250 млн объектов их
  описывающих (~ 60 ГБ памяти)
• До 3000 запросов/сек на обновление
  данных и столько же на их выборку
• Время ответа критично (<= 200 микросек)
• Сервис должен быть масштабируемым
Задача
• Периодически нужно делать бекап базы
  из памяти на диск
   – быстрый подъем при сбое
   – анализ данных по файлам без опроса
• Сервис должен быть легко расширяемым
  по функционалу
• сервис должен быть масштабируемым
Как можно хранить данные
• Memcached?
 – Насколько гибка логика удаления? +
 – Бэкап базы из памяти на диск? +
 – Как обновлять по UDP (различные
   клиенты)? +/-
 – Кто реализует дополнительную логику
    (ретаргетинг)? -
В каком виде хранить?
• user1       • user1
  – лог1        – struct1
  – лог2        – struct2
• userN       • userN
  – логM        – structM
  – логM+1      – structM+1
В каком виде хранить?
• + гибкость         • - гибкость
• - много памяти     • + меньше памяти
• - есть доп.        • + нет доп.
  обработка            обработки
          • нужна ↑ производительность
Доводы:   • требования меняются редко
          • бонус: sizeof(struct1) = const
Резюмируем требования
• Время ответа (<= 200 микросек)
• Всего храним 67*2 млн юзеров, в день
  меняется 250 млн объектов их
  описывающих (~ 67 ГБ памяти)
• До 3000 з/сек на обновление данных и
  столько же на их выборку
• Бекап базы из памяти на диск
Архитектура
• Однопоточный             • Свои аллокаторы
   – нет блокировок          (new/delete)
• Неблокируемый ВВ         • Свои определения
                             'самый старый'
   – poll, epoll, kqueue
                             объект
• Постоянные
                           • Простая логика
  соединения
                             сохранения (fork)
• UDP и TCP клиенты
Сетевой ВВ
• Все сокеты неблок:
  – fcntl(sock, F_SETFL, O_NONBLOCK);
• Неблокируемый ВВ (мультиплексирование)
  – poll, epoll, kqueue
• Постоянные соединения
• UDP и TCP клиенты
Протокол
struct MSG_TAB {       • TCP, UDP:
  int32_t size;           – read(...) - заголовок
  int32_t func;
                          – readv(...) - данные
};
struct MSG_DATA {         – Action(...) - обработка
  MSG_TAB h;           • TCP:
  char data[h.size];      – writev(...) - заголовок,
};                          данные
Объекты                 ParticularRestrictions:
    User: 128 bytes                                 идентификатор
    int64_t user_id;                                отгрузка
    int64_t time_create;                            показ
    char mask[32];                                  клик
    ....                                            событие
                                                    ...

                 IndexHolder flights, banners;

                                                 Retarget:
IndexHolder places, auditory;                    идентификатор
                                                 ....
Объекты, «устаревание»
• User — есть массив памяти под объекты
   – старый тот кто дольше всех не появлялся в
     сети (+ память на 2-х связный список)
• IndexHolder (ArrayList) — есть массив объектов
   – + 2-х связный список — есть избыток
• ParticularRestrictions (Flight, Banner), Retarget
  (Place, Auditory) - циклический массив.
   – самый старый по времени создания
Как храним user?
• User хранятся std::map<u_int64_t, User*>
   – map — не самый быстрый контейнер, но зато
     легко выделять память для него
   – для убыстрения работы создадим 64 std::map
• Память под std::map выделятся блоками по мере
  необходимости. Есть небольшой массив — хранит
  ссылки на свободные участки памяти
Сохранение на диск
•   По специальной UDP датаграме делаем fork
•   Дочерний процесс читает и записывает на диск 4 куска
    памяти: User, ParticularRestrictions, Retarget, IndexHolder.
    Целостность данных обеспеченна.
•   Результаты (0,75+4+1)/(9,375) ~ 61% КПД (> в 1,6 раза):
    – User — 2,125 Gb (1,5 Gb (main) + 0,625 Gb (add))
    – IndexHolder — 1,5 Gb (1 GB (main) + 0,5 Gb (add))
    – ParticularRestrictions — 4 Gb
    – Retarget — 1 Gb
    – std::map — 0,75 Gb
Емкость памяти
•   По прикидкам скорость просмотра: 1 ~ 1,5 баннера / 1 мес.
•   Время жизни всех объектов ~ 1 мес.
•   Потеря активного flight / banner, менее критична чем потеря
    профиля пользователя.
•   Если потеряем старые auditory (place), то охват уменьшится,
    но качество повысится.
    – User — 67 108 864; std::map — сколько нужно
    – ParticularRestrictions — 134 216 960
    – Retarget — 134 217 728
    – IndexHolder — 268 435 456 > 134 216 960 + 134 217 728 !
Логика. Action().
•   switch(readheader.func) {
    – case (SET_USER_EVT): юзер сделал хит
    – сase (SET_USER_MASK): юзер изменил профиль
    – сase (SET_USER_ADT): юзер добавлен в аудиторию
    – сase (SET_RETARGETS): обновили ретаргетинги
    – сase (SET_CAMPAIGN): обновили уникальность по РК
    – сase (GET_USER_EXP): описание юзера, выдаем банер
    – сase (GET_USER_EVT): описание юзера, проверяем клик
    – сase (UU_CONTROL): служ: fork, fork_info, mem_info
Архитектура

uuserver1                 uuserver1
                front1
uuserver2                 uuserver2

uuserver3                 uuserver3
                front2
uuserver4                 uuserver4
Кол-во запросов в сек от Exp
Время ответа для Exp
Время ответа для Exp
Кол-во запросов в сек от Evt
Время ответа для Evt
Время ответа для Evt
Кол-во обновлений
Время для обновлений
Кол-во добавлений в аудит.
Время добавлений в аудит.
Резюме по боевой нагрузке
• Кол-во TCP запросов: 37 тыс + 2,6 тыс ~ 39,6 тыс
  з/мин
• Кол-во UDP пакетов: 38,3 тыс з/мин
• Кол-во аудиторных UDP пакетов: 4 тыс з/мин.
 Итого на сервер сейчас в номинальном режиме:
 ~ TCP 670 з/сек.
 ~ UPD 680 з/сек.
 А каков предел по нагрузке?
Тестовая нагрузка
                        AMD Opteron 2800.13-MHz 2*4, 16 Gb (memory)
                   80
                   70
Время теста, сек




                   60
                   50
                   40                                             50 потоков
                   30
                                                                  100 поток
                                                                  180 потоков
                   20
                   10
                    0
                   0,5 млн       1 млн          1,5 млн   2 млн
                                   Количество запросов
Тестовая нагрузка
                            90000
Количество запросов в сек




                            80000
                            70000
                            60000
                            50000
                            40000                                  50 потоков
                                                                   100 потоков
                            30000                                  180 потоков
                            20000
                            10000
                                0
                                       количество запросов в сек
Вопросы?

More Related Content

What's hot

Незаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервераНезаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервераodnoklassniki.ru
 
Cтрах и ненависть в MongoDB
Cтрах и ненависть в MongoDBCтрах и ненависть в MongoDB
Cтрах и ненависть в MongoDBDmitry Viskov
 
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)Ontico
 
Лекция 9. Программирование GPU
Лекция 9. Программирование GPUЛекция 9. Программирование GPU
Лекция 9. Программирование GPUMikhail Kurnosov
 
Распределенные системы в Одноклассниках
Распределенные системы в ОдноклассникахРаспределенные системы в Одноклассниках
Распределенные системы в Одноклассникахodnoklassniki.ru
 
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)Ontico
 
Oracle exa2 biz_summit
Oracle exa2 biz_summitOracle exa2 biz_summit
Oracle exa2 biz_summitNick Turunov
 
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...Ontico
 
Александр Крижановский, NatSys Lab
Александр Крижановский, NatSys LabАлександр Крижановский, NatSys Lab
Александр Крижановский, NatSys LabOntico
 
Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)Ontico
 
Developing highload servers with Java
Developing highload servers with JavaDeveloping highload servers with Java
Developing highload servers with JavaAndrei Pangin
 
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ LibraryИнтервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ LibraryTatyanazaxarova
 
Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...a15464321646213
 
обзор средств разработки для вычислений Gpgpu
обзор средств разработки для вычислений Gpgpuобзор средств разработки для вычислений Gpgpu
обзор средств разработки для вычислений GpgpuCOMAQA.BY
 
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
 
MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?Alexey Tokar
 

What's hot (19)

Незаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервераНезаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервера
 
Cтрах и ненависть в MongoDB
Cтрах и ненависть в MongoDBCтрах и ненависть в MongoDB
Cтрах и ненависть в MongoDB
 
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
 
Лекция 9. Программирование GPU
Лекция 9. Программирование GPUЛекция 9. Программирование GPU
Лекция 9. Программирование GPU
 
Распределенные системы в Одноклассниках
Распределенные системы в ОдноклассникахРаспределенные системы в Одноклассниках
Распределенные системы в Одноклассниках
 
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
 
Oracle exa2 biz_summit
Oracle exa2 biz_summitOracle exa2 biz_summit
Oracle exa2 biz_summit
 
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
 
Александр Крижановский, NatSys Lab
Александр Крижановский, NatSys LabАлександр Крижановский, NatSys Lab
Александр Крижановский, NatSys Lab
 
Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)
 
Developing highload servers with Java
Developing highload servers with JavaDeveloping highload servers with Java
Developing highload servers with Java
 
Simd
SimdSimd
Simd
 
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ LibraryИнтервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
 
Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...
 
обзор средств разработки для вычислений Gpgpu
обзор средств разработки для вычислений Gpgpuобзор средств разработки для вычислений Gpgpu
обзор средств разработки для вычислений Gpgpu
 
Chronicle Map
Chronicle MapChronicle Map
Chronicle Map
 
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
 
1508 10035
1508 100351508 10035
1508 10035
 
MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?
 

Similar to Как мы храним 75 млн пользователей (Денис Бирюков)

Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)
Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)
Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)Ontico
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНСit-people
 
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)Ontico
 
Жизнь проекта на production
Жизнь проекта на productionЖизнь проекта на production
Жизнь проекта на productionNikolay Sivko
 
Эксплуатация container-based-инфраструктур / Николай Сивко (okmeter.io)
Эксплуатация container-based-инфраструктур / Николай Сивко (okmeter.io)Эксплуатация container-based-инфраструктур / Николай Сивко (okmeter.io)
Эксплуатация container-based-инфраструктур / Николай Сивко (okmeter.io)Ontico
 
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)Ontico
 
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...Ontico
 
Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Mikhail Shcherbakov
 
DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...
DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...
DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...it-people
 
Ликбез по Эльбрусу, Константин Трушкин (МЦСТ)
Ликбез по Эльбрусу, Константин Трушкин (МЦСТ)Ликбез по Эльбрусу, Константин Трушкин (МЦСТ)
Ликбез по Эльбрусу, Константин Трушкин (МЦСТ)Ontico
 
WinDbg со товарищи
WinDbg со товарищиWinDbg со товарищи
WinDbg со товарищиCUSTIS
 
Введение в отладку производительности MySQL приложений
Введение в отладку производительности MySQL приложенийВведение в отладку производительности MySQL приложений
Введение в отладку производительности MySQL приложенийSveta Smirnova
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковSergey Platonov
 
GRANIT — Global Russian Advanced Network Initiative
GRANIT — Global Russian Advanced Network InitiativeGRANIT — Global Russian Advanced Network Initiative
GRANIT — Global Russian Advanced Network InitiativeARCCN
 
MySQL: Есть ли жизнь после 1 млрд. записей.
MySQL: Есть ли жизнь после 1 млрд. записей.MySQL: Есть ли жизнь после 1 млрд. записей.
MySQL: Есть ли жизнь после 1 млрд. записей.MageCloud
 
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаMikhail Shcherbakov
 
Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»e-Legion
 
YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011CodeCamp
 

Similar to Как мы храним 75 млн пользователей (Денис Бирюков) (20)

Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)
Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)
Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
 
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
 
Жизнь проекта на production
Жизнь проекта на productionЖизнь проекта на production
Жизнь проекта на production
 
Эксплуатация container-based-инфраструктур / Николай Сивко (okmeter.io)
Эксплуатация container-based-инфраструктур / Николай Сивко (okmeter.io)Эксплуатация container-based-инфраструктур / Николай Сивко (okmeter.io)
Эксплуатация container-based-инфраструктур / Николай Сивко (okmeter.io)
 
SECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформ
SECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформSECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформ
SECON'2014 - Дмитрий Швеенков - Рассылка push-уведомлений для мобильных платформ
 
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
 
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
 
Efficiency vvv
Efficiency vvvEfficiency vvv
Efficiency vvv
 
Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"
 
DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...
DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...
DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...
 
Ликбез по Эльбрусу, Константин Трушкин (МЦСТ)
Ликбез по Эльбрусу, Константин Трушкин (МЦСТ)Ликбез по Эльбрусу, Константин Трушкин (МЦСТ)
Ликбез по Эльбрусу, Константин Трушкин (МЦСТ)
 
WinDbg со товарищи
WinDbg со товарищиWinDbg со товарищи
WinDbg со товарищи
 
Введение в отладку производительности MySQL приложений
Введение в отладку производительности MySQL приложенийВведение в отладку производительности MySQL приложений
Введение в отладку производительности MySQL приложений
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
 
GRANIT — Global Russian Advanced Network Initiative
GRANIT — Global Russian Advanced Network InitiativeGRANIT — Global Russian Advanced Network Initiative
GRANIT — Global Russian Advanced Network Initiative
 
MySQL: Есть ли жизнь после 1 млрд. записей.
MySQL: Есть ли жизнь после 1 млрд. записей.MySQL: Есть ли жизнь после 1 млрд. записей.
MySQL: Есть ли жизнь после 1 млрд. записей.
 
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчика
 
Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»
 
YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011
 

More from Ontico

Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Ontico
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Ontico
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Ontico
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Ontico
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)Ontico
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Ontico
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Ontico
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)Ontico
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)Ontico
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Ontico
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Ontico
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Ontico
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Ontico
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)Ontico
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Ontico
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Ontico
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...Ontico
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Ontico
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Ontico
 
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)Ontico
 

More from Ontico (20)

Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
 
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
 

Как мы храним 75 млн пользователей (Денис Бирюков)

  • 1. Как мы храним 75 млн пользователей (пишем неблокируемый сервер) Бирюков Денис Компания Каванга
  • 2. Самопиар :) • Рекламная сеть (много баннеров, много сайтов) • При показе баннера мы используем таргетинги – уникальные ограничения – ретаргетинг – таргетинг по соцдему • Нужен сервер – Помним кому, где и что показывали – Знаем пол и возраст – Решаем что именно показать
  • 3. Что было? Многопоточный сервер • - Блокировки • + 5% CPU • - Фрагментация • + Высокая скорость • - Низкий КПД по ответа памяти (в 3,5 раза) • + Сохранение на диск удаление объектов без доп. памяти раз в час • + Быстрый запуск
  • 4. Задача • 75 млн пользователей за 3 МЕС, в день меняется 250 млн объектов их описывающих (~ 60 ГБ памяти) • До 3000 запросов/сек на обновление данных и столько же на их выборку • Время ответа критично (<= 200 микросек) • Сервис должен быть масштабируемым
  • 5. Задача • Периодически нужно делать бекап базы из памяти на диск – быстрый подъем при сбое – анализ данных по файлам без опроса • Сервис должен быть легко расширяемым по функционалу • сервис должен быть масштабируемым
  • 6. Как можно хранить данные • Memcached? – Насколько гибка логика удаления? + – Бэкап базы из памяти на диск? + – Как обновлять по UDP (различные клиенты)? +/- – Кто реализует дополнительную логику (ретаргетинг)? -
  • 7. В каком виде хранить? • user1 • user1 – лог1 – struct1 – лог2 – struct2 • userN • userN – логM – structM – логM+1 – structM+1
  • 8. В каком виде хранить? • + гибкость • - гибкость • - много памяти • + меньше памяти • - есть доп. • + нет доп. обработка обработки • нужна ↑ производительность Доводы: • требования меняются редко • бонус: sizeof(struct1) = const
  • 9. Резюмируем требования • Время ответа (<= 200 микросек) • Всего храним 67*2 млн юзеров, в день меняется 250 млн объектов их описывающих (~ 67 ГБ памяти) • До 3000 з/сек на обновление данных и столько же на их выборку • Бекап базы из памяти на диск
  • 10. Архитектура • Однопоточный • Свои аллокаторы – нет блокировок (new/delete) • Неблокируемый ВВ • Свои определения 'самый старый' – poll, epoll, kqueue объект • Постоянные • Простая логика соединения сохранения (fork) • UDP и TCP клиенты
  • 11. Сетевой ВВ • Все сокеты неблок: – fcntl(sock, F_SETFL, O_NONBLOCK); • Неблокируемый ВВ (мультиплексирование) – poll, epoll, kqueue • Постоянные соединения • UDP и TCP клиенты
  • 12. Протокол struct MSG_TAB { • TCP, UDP: int32_t size; – read(...) - заголовок int32_t func; – readv(...) - данные }; struct MSG_DATA { – Action(...) - обработка MSG_TAB h; • TCP: char data[h.size]; – writev(...) - заголовок, }; данные
  • 13. Объекты ParticularRestrictions: User: 128 bytes идентификатор int64_t user_id; отгрузка int64_t time_create; показ char mask[32]; клик .... событие ... IndexHolder flights, banners; Retarget: IndexHolder places, auditory; идентификатор ....
  • 14. Объекты, «устаревание» • User — есть массив памяти под объекты – старый тот кто дольше всех не появлялся в сети (+ память на 2-х связный список) • IndexHolder (ArrayList) — есть массив объектов – + 2-х связный список — есть избыток • ParticularRestrictions (Flight, Banner), Retarget (Place, Auditory) - циклический массив. – самый старый по времени создания
  • 15. Как храним user? • User хранятся std::map<u_int64_t, User*> – map — не самый быстрый контейнер, но зато легко выделять память для него – для убыстрения работы создадим 64 std::map • Память под std::map выделятся блоками по мере необходимости. Есть небольшой массив — хранит ссылки на свободные участки памяти
  • 16. Сохранение на диск • По специальной UDP датаграме делаем fork • Дочерний процесс читает и записывает на диск 4 куска памяти: User, ParticularRestrictions, Retarget, IndexHolder. Целостность данных обеспеченна. • Результаты (0,75+4+1)/(9,375) ~ 61% КПД (> в 1,6 раза): – User — 2,125 Gb (1,5 Gb (main) + 0,625 Gb (add)) – IndexHolder — 1,5 Gb (1 GB (main) + 0,5 Gb (add)) – ParticularRestrictions — 4 Gb – Retarget — 1 Gb – std::map — 0,75 Gb
  • 17. Емкость памяти • По прикидкам скорость просмотра: 1 ~ 1,5 баннера / 1 мес. • Время жизни всех объектов ~ 1 мес. • Потеря активного flight / banner, менее критична чем потеря профиля пользователя. • Если потеряем старые auditory (place), то охват уменьшится, но качество повысится. – User — 67 108 864; std::map — сколько нужно – ParticularRestrictions — 134 216 960 – Retarget — 134 217 728 – IndexHolder — 268 435 456 > 134 216 960 + 134 217 728 !
  • 18. Логика. Action(). • switch(readheader.func) { – case (SET_USER_EVT): юзер сделал хит – сase (SET_USER_MASK): юзер изменил профиль – сase (SET_USER_ADT): юзер добавлен в аудиторию – сase (SET_RETARGETS): обновили ретаргетинги – сase (SET_CAMPAIGN): обновили уникальность по РК – сase (GET_USER_EXP): описание юзера, выдаем банер – сase (GET_USER_EVT): описание юзера, проверяем клик – сase (UU_CONTROL): служ: fork, fork_info, mem_info
  • 19. Архитектура uuserver1 uuserver1 front1 uuserver2 uuserver2 uuserver3 uuserver3 front2 uuserver4 uuserver4
  • 30. Резюме по боевой нагрузке • Кол-во TCP запросов: 37 тыс + 2,6 тыс ~ 39,6 тыс з/мин • Кол-во UDP пакетов: 38,3 тыс з/мин • Кол-во аудиторных UDP пакетов: 4 тыс з/мин. Итого на сервер сейчас в номинальном режиме: ~ TCP 670 з/сек. ~ UPD 680 з/сек. А каков предел по нагрузке?
  • 31. Тестовая нагрузка AMD Opteron 2800.13-MHz 2*4, 16 Gb (memory) 80 70 Время теста, сек 60 50 40 50 потоков 30 100 поток 180 потоков 20 10 0 0,5 млн 1 млн 1,5 млн 2 млн Количество запросов
  • 32. Тестовая нагрузка 90000 Количество запросов в сек 80000 70000 60000 50000 40000 50 потоков 100 потоков 30000 180 потоков 20000 10000 0 количество запросов в сек