SlideShare a Scribd company logo
1 of 55
Download to read offline
Как	
  сделать	
  вычислительную	
  
инфраструктуру	
  для	
  большого	
  кластера	
  
              Евгений	
  Кирпичёв	
  
               Станислав	
  Лагун	
  
•  Введение	
  и	
  Архитектура	
  
•  Доставка	
  задач/результатов	
  
•  Отладка	
  и	
  анализ	
  
•  Обобщение	
  опыта:	
  	
  
   корректность,	
  надежность,	
  производительность	
  
Что	
  мы	
  строим	
  
•  Очень	
  тяжелые	
  вычисления	
  (но	
  очень	
  параллельные)	
  
•  Много	
  одновременных	
  заданий	
  (Job)	
  и	
  юзеров	
  разной	
  важности	
  
•  Простой	
  API	
  –	
  задание	
  =	
  поток	
  задач:	
  CreateJob,	
  SubmitTask,	
  OnResult	
  
     –  Задание	
  –	
  атомарное	
  и	
  stateless	
  однопоточное	
  вычисление	
  	
  
        (напр.	
  перемножить	
  пару	
  матриц)	
  

•  Непредсказуемые	
  вычисления:	
  
   От	
  секунд	
  (нужна	
  интерактивность)	
  	
  
   до	
  дней	
  (но	
  не	
  мешать	
  чужой	
  интерактивности)	
  
•  Задействовать	
  кластер	
  целиком	
  
•  Отказоустойчивость	
  (смерть	
  вычислителей,	
  перезапуск	
  системных	
  сервисов)	
  
1	
  задание	
  (CreateJob)	
  =	
  	
  
        Тьма	
  маленьких	
  задач	
  (SubmitTask)	
  
Есть	
  обратная	
  связь	
  (OnResult	
  =>	
  SubmitTask)	
  

                       Legacy	
  
                                  API	
  
                        app	
  

                       Legacy	
  
                                  API	
  
                        app	
  

                       Legacy	
  
                                  API	
  
                        app	
  
Обычно	
  (на	
  суперкомпьютерах)	
  используют:	
  
	
     PlaGorm	
  LSF	
  



                          +	
  
	
    MS	
  HPC	
  Server	
              MPI	
  
     Oracle	
  Grid	
  Engine	
        OpenMP	
  
	
          Condor	
                      …	
  
                …	
  
	
  
     Это	
  называется	
  «batch	
  scheduler»	
  
Нам	
  не	
  подходит	
  
Они	
  предполагают:	
  
•    Планировщик	
  ничего	
  не	
  знает	
  про	
  задачу	
  
     (Просто	
  выделяет	
  ядра)	
  
•    Задачи	
  монолитны	
  
        •     «Мне	
  надо	
  100	
  ядер»	
  
        •     Как	
  появится	
  100	
  ядер	
  –	
  запустит	
  
        •     На	
  99	
  не	
  запустит	
  
•    Есть	
  куча	
  сложных	
  правил	
  и	
  квот	
  
•    Акцент	
  на	
  фичи,	
  а	
  не	
  на	
  эффективность	
  
Без	
  этих	
  ограничений	
  можно	
  сделать	
  эффективнее.	
  
Мы	
  знаем:	
  1)	
  задачи	
  прерываемы	
  2)	
  задачи	
  независимы	
  и	
  массивно	
  параллельны	
  
Пакетный	
  планировщик	
                                                    Наш	
  планировщик	
  

Приложение:	
                                                               Приложение:	
  
    «Дай-­‐ка	
  мне	
  300	
  –	
  400	
  ядер	
  и	
  запусти	
  на	
          Я	
  хочу	
  использовать	
  кластер	
  для	
  
    них	
  вот	
  эту	
  команду»	
                                              вычисления	
  задач	
  
    	
                                                                      	
  
Планировщик:	
                                                              Планировщик:	
  
    Вот	
  ядра,	
  команду	
  запустил.	
  	
                                   Хорошо,	
  кидай	
  задачи	
  сюда,	
  жди	
  
    Разбирайся	
  сам.	
                                                         результатов	
  отсюда.	
  Я	
  позабочусь	
  об	
  
                                                                                 эффективной	
  и	
  справедливой	
  делёжке	
  
                                                                                 ресурсов.	
  
            Становятся	
  возможными	
  некоторые	
  трюки	
  для	
  повышения	
  утилизации.	
  
                           But	
  this	
  margin	
  is	
  too	
  small	
  and	
  NDA	
  too	
  strict…	
  
Пример	
  неудачной	
  архитектуры	
  
 Клиент	
  1	
     Клиент	
  2	
       Клиент	
  3	
  


                               брокер	
  




                 Очевидно,	
  single	
  bomleneck	
  –	
  не	
  масштабируется	
  
            +балансировка	
  нагрузки	
  очень	
  математически	
  нестабильна	
  
Более	
  удачная	
  архитектура	
  
•  Планировщик	
                                                                   +клиенты	
  
     –  Слушает	
  команды	
  о	
  запуске-­‐останове	
  заданий	
  
                                                                                             +статистика	
  
     –  Приказывает	
  демонам	
  обслуживать	
  задачи	
  

•  Трубы	
  (как	
  очереди,	
  только	
  шире)	
                        +логгирование	
  
     –  Доставляют	
  задачи	
  и	
  ответы	
  

•  Вычислительные	
  демоны	
  на	
  узлах	
                                             +мониторинг	
  

     –  Слушаются	
  планировщика	
  
     –  Тянут	
  из	
  труб	
  задач,	
  считают,	
  публикуют	
  ответы	
  
Пример	
  
•    Клиент	
  –	
  Планировщику:	
  	
  
     Создай	
  задачу	
  A,	
  важность	
  30%	
  
•    Планировщик	
  (выбирает	
  несколько	
  демонов)	
  –	
  демонам:	
  
     Ты,	
  ты	
  и	
  ты	
  –	
  бросайте	
  всё	
  и	
  подключайтесь	
  к	
  трубе	
  А.	
  
     (возможно	
  вытеснение	
  работающей	
  задачи)	
  

•    Клиент	
  шлет	
  задачи	
  в	
  трубу	
  А	
  
•    Демоны	
  считают,	
  шлют	
  ответы	
  
•    Клиент	
  собирает	
  ответы,	
  шлет	
  новые	
  задачи	
  и	
  т.п.	
  
•  Введение	
  и	
  Архитектура	
  
•  Доставка	
  задач/результатов	
  
•  Отладка	
  и	
  анализ	
  
•  Обобщение	
  опыта:	
  	
  
   корректность,	
  надежность,	
  производительность	
  
Трубы	
  
•  На	
  основе	
  RabbitMQ	
  
    –  Лучший	
  продукт	
  в	
  своем	
  классе	
  (надежная	
  доставка)	
  
    –  Но	
  «из	
  коробки»	
  сам	
  по	
  себе	
  не	
  масштабируется	
  
Надежная	
  доставка	
  
Цикл	
  жизни	
  демона:	
  
•  Получить	
  задачу	
  
•  Посчитать	
  
                                            Порядок	
  очень	
  важен	
  
•  Отослать	
  ответ	
  
•  Подтвердить	
  получение	
  задачи	
  
Демон	
  A	
  	
                        вычисления	
                               вычисле	
  

                 Задача	
  X	
                «Подтверждаю:	
  
                                                                           Задача	
  Y	
             Разрыв	
  связи	
  
                                             задачу	
  X	
  получил»	
  

 Демон	
  B	
  	
  

                                                                                                             Задача	
  Y	
  


RabbitMQ	
                     Ждет	
  подтверждения	
  X	
                          Ждет	
  Y	
               Ждет	
  Y	
  
Масштабирование	
  
Из	
  коробки	
  RabbitMQ	
  совсем	
  не	
  подходит	
  
•  Одна	
  очередь	
  плохо	
  тянет	
  10000	
  клиентов	
  
•  Встроенная	
  кластеризация	
  делает	
  не	
  то	
  
    От	
  нее	
  вообще	
  лучше	
  отказаться	
  (одни	
  проблемы)	
  
•  Очевидное	
  решение:	
  несколько	
  очередей	
  +	
  load	
  balancing	
  
Масштабирование	
  
        задачи	
                        ответы	
  
      Голова	
  задачи	
              Голова	
  задачи	
  




                                                               Демон	
  выбирает	
  случайного	
  кролика	
  
(подбираются	
  демонами)	
     (отсылаются	
  демонами)	
        и	
  всю	
  жизнь*	
  работает	
  с	
  ним	
  
Трудности	
  работы	
  с	
  очередями	
  
•    RabbitMQ	
  под	
  Windows	
  тянет	
  мало	
  соединений	
  
      –    Решено:	
  каждая	
  машина	
  подключается	
  к	
  кому-­‐нибудь	
  одному	
  
•    При	
  крахах	
  демонов	
  данные	
  теряются	
  
      –    Решено:	
  подтверждения	
  тасков	
  
•    При	
  крахах	
  RabbitMQ	
  данные	
  теряются	
  
      –    RabbitMQ	
  не	
  гарантирует	
  безопасность	
  данных	
  вне	
  транзакции!	
  
•    Соединение	
  может	
  спонтанно	
  рваться	
  
•    RabbitMQ	
  дохнет	
  под	
  нагрузкой	
  
      –    Надо	
  избегать	
  перегрузки	
  
•    Нужно	
  мгновенное	
  переключение	
  между	
  заданиями	
  (бросай	
  всё	
  и	
  берись	
  за	
  задачу	
  А)	
  
      –    Самая	
  сложная	
  часть	
  
•    В	
  очереди	
  на	
  конкретном	
  RabbitMQ	
  могут	
  кончиться	
  задачи	
  
      –    Надо	
  переключаться,	
  не	
  нарушая	
  остальных	
  свойств	
  
Сохранность	
  данных	
  при	
  крахах	
  RabbitMQ	
  
                                              Publish	
  confirmaƒons	
  
     Client	
  


                                              0..3	
               4..5	
                 6..7	
  

   RabbitMQ	
  
                                                   fsync	
             fsync	
            fsync	
  
      Disk	
  
      Клиент	
  помнит	
  сообщения,	
  про	
  которые	
  еще	
  не	
  известно,	
  на	
  диске	
  ли	
  они.	
  
                             При	
  разрыве	
  связи	
  перепосылает	
  их.	
  
      Это	
  универсальный	
  паттерн	
  в	
  распределенных	
  системах	
  (stream	
  replica•on).	
  
Не	
  перегружать	
  RabbitMQ	
  
•  Если	
  слишком	
  интенсивно	
  слать	
  сообщения,	
  	
  
   RabbitMQ	
  захлебнется	
  (не	
  успевая	
  писать	
  на	
  диск)	
  
•  Тормоза,	
  крахи,	
  разрывы	
  соединений	
  
Не	
  перегружать	
  RabbitMQ	
  

                      Белое	
  –	
  «ждем	
  задачи»	
  
                        доставка	
  тормозит,	
  	
  
                        или	
  реконнектимся	
  
Не	
  перегружать	
  RabbitMQ	
  
Оказывается,	
  отличная	
  метрика	
  загрузки	
  –	
  	
  
число	
  неподтвержденных	
  сообщений	
  

                                       4	
  задания,	
  4	
  разноцветных	
  кролика	
  
                                       Один	
  кролик	
  не	
  поспевает.	
  
Не	
  перегружать	
  RabbitMQ	
  
Ограничить	
  число	
  сообщений	
  «в	
  полете»	
  
    –  Ждать	
  при	
  roundrobin,	
  пока	
  текущему	
  кролику	
  полегчает?	
  
    –  Нет,	
  тогда	
  один	
  медленный	
  будет	
  всех	
  тормозить.	
  
    –  А	
  как	
  тогда?	
  
    –  Давать	
  очередное	
  сообщение	
  случайному	
  неперегруженному.	
  
Поддерживать	
  асинхронные	
  прерывания	
  
Иногда	
  надо	
  всё	
  бросить	
  и	
  заняться	
  другим	
  заданием	
  
      –  Прервать	
  запущенную	
  задачу	
  и	
  кинуть	
  обратно	
  в	
  трубу	
  
      –  Или	
  прервать	
  ожидание	
  завершения	
  задачи	
  
      –  Порвать	
  соединения	
  с	
  трубами	
  предыдущего	
  задания	
  
              •    Убедиться,	
  что	
  все	
  ответы	
  точно	
  сохранены	
  на	
  диск	
  


Об	
  этом	
  мы	
  узнаем	
  из	
  другого	
  потока	
  
      –  Многопоточность	
  –	
  это	
  всегда	
  ад	
  
      –  К	
  счастью,	
  это	
  почти	
  единственное	
  использование	
  многопоточности	
  
      –  Но	
  все	
  равно	
  ад	
  
      –  На	
  5000	
  ядрах	
  быстро	
  проявляются	
  ВСЕ	
  многопоточные	
  баги	
  
Переключаться	
  между	
  кроликами	
  
•  Если	
  кончились	
  задачи	
  в	
  нашем	
  –	
  постучаться	
  в	
  другого	
  

•  Если	
  делать	
  наивно,	
  будет	
  куча	
  проблем	
  
     –  Бури	
  реконнектов	
  
     –  Голодание	
  
     –  Дисбаланс	
  
     –  Кончатся	
  соединения	
  
     –  ...	
  
     –  NO	
  PROFIT!!!11	
  
Как	
  это	
  закодировать	
  
Можно	
  сделать	
  лапшу,	
  делающую	
  все	
  сразу	
  
    –  Реконнекты,	
  
       подтверждения	
  	
  
       доставки,	
  
       переключение,	
  	
  
       балансировка,	
  
       асинхронные	
  
       прерывания…	
  
Как	
  не	
  сойти	
  с	
  ума	
  
Разумеется,	
  слои.	
  
           	
  
           	
  
Слои	
  
Отсыльщик:	
  
     –  Отослать	
  
     –  Получить/сбросить	
  список	
  неподтвержденных	
  
     –  Завершиться	
  (возможно,	
  асинхронно)	
  

Слушатель:	
  
     –  Достать	
  сейчас	
  (blocking	
  +	
  •meout)	
  
     –  Достать	
  потом	
  (callback)	
  
     –  Завершиться	
  (возможно,	
  асинхронно)	
  
Слои	
  
        «Игнорировать	
                                           «Балансировать	
  отправку	
  	
  
        неподтвержденные	
  	
                                      между	
  несколькими»	
  
        при	
  закрытии»	
  
                           «При	
  ошибке	
  переоткрыться»	
  

«Слушать	
  сразу	
  несколько»	
                      «Преобразовать	
  тип	
  	
  
                                                          сообщения»	
  
                  «При	
  ошибке	
  сделать	
  	
                              «При	
  ошибке	
  	
  
                  то-­‐то	
  и	
  то-­‐то»	
                               попробовать	
  еще	
  раз»	
  
Например	
  
                 задачи	
                                                             ответы	
  
            Сериализовать	
                                                      Десериализовать	
  
При	
  ошибке	
  повторять	
  до	
  успеха	
                           При	
  ошибке	
  повторять	
  до	
  успеха	
  
    При	
  ошибке	
  залоггировать	
                                       При	
  ошибке	
  залоггировать	
  
   При	
  ошибке	
  переоткрыть	
                                           При	
  ошибке	
  переоткрыть	
  
(неподтвержденное	
  переслать)	
  
                                                                            Слушать	
  сразу	
  несколько	
  
            Балансировать	
  
                                                 По	
  числу	
  	
      Неограниченная	
  предвыборка	
  
          Слать	
  в	
  RabbitMQ	
  
                                                 кроликов	
                   Слушать	
  из	
  RabbitMQ	
  
•    Введение	
  и	
  Архитектура	
  
•    Доставка	
  задач/результатов	
  
•    Отладка	
  и	
  анализ	
  
•    Обобщение	
  опыта:	
  	
  
     корректность,	
  надежность,	
  производительность	
  
Отладка	
  и	
  анализ	
  
•  Дебаггер	
  –	
  не	
  вариант	
  (только	
  для	
  локальных	
  тестов)	
  
•  Проблемы	
  тоже	
  распределенные	
  
     –  Особенно	
  проблемы	
  производительности	
  
•  Post	
  mortem	
  отладка	
  по	
  логам	
  
•  Логов,	
  по	
  нашим	
  меркам,	
  дох	
  очень	
  много	
  
   (тысячи	
  важных	
  сообщений	
  в	
  сек.,	
  в	
  пике	
  до	
  сотен	
  тысяч)	
  
Пара	
  фокусов	
  в	
  рукаве	
  
•  Мощный	
  логгер	
  
     –  Глобальная	
  ось	
  времени	
  (точнее,	
  чем	
  NTP)	
  
     –  Тянет	
  сотни	
  тысяч	
  сообщений	
  в	
  секунду	
  от	
  тысяч	
  клиентов	
  
     –  hšp://code.google.com/p/greg	
  –	
  опенсорс-­‐версия	
  
     –  Ставим	
  1шт.	
  на	
  кластер,	
  получаем	
  точную	
  глобальную	
  картину	
  
        (без	
  мучений	
  со	
  специальным	
  сбором-­‐слиянием	
  логов)	
  

•  GNU	
  textu•ls	
  +	
  awk	
  
ƒmeplomers	
  
	
  
две	
  специальных	
  рисовалки	
  
	
  
A	
  picture	
  is	
  worth	
  a	
  thousand	
  words	
  



       hšp://jkff.info/so¡ware/•meplošers/	
  
http://jkff.info/software/timeplotters/
Что	
  для	
  этого	
  нужно?	
  

  Очень	
  подробные	
  логи.	
  
   Еще	
  об	
  этом	
  –	
  позже.	
  
•  Введение	
  и	
  Архитектура	
  
•  Доставка	
  задач/результатов	
  
•  Отладка	
  и	
  анализ	
  
•  Обобщение	
  опыта:	
  	
  
   корректность,	
  надежность,	
  производительность	
  
Корректность:	
  Главный	
  принцип	
  

Как	
  писать	
  правильный	
  код?	
  
Корректность:	
  Главный	
  принцип	
  

       Код	
  точно	
  неправильный.	
  	
  
                 Как	
  быть?	
  
Как	
  быть?	
  
•  Писать	
  максимально	
  подробные	
  логи	
  
•  Писать	
  меньше	
  кода	
  
     (только	
  то,	
  без	
  чего	
  программа	
  не	
  будет	
  работать)	
  
•  Минимизировать	
  «ядро	
  корректности»	
  
•  Избегать	
  многопоточности	
  и	
  других	
  опасных	
  приемов	
  
     (никакого	
  геройства)	
  
•  Использовать	
  eventual	
  consistency	
  	
  
     (не	
  настаивать	
  на	
  strong	
  consistency)	
  
•  Использовать	
  «барьеры»	
  
	
  
Барьеры	
  
Переводят	
  любое	
  состояние	
  в	
  предсказуемое.	
  
Уничтожение	
  процесса	
  (выполнение	
  действия	
  в	
  отдельном	
  процессе)	
  
•    Защищает	
  от	
  утечек	
  ресурсов	
  внутри	
  процесса	
  

Периодический	
  перезапуск	
  системы	
  
•    Защищает	
  от	
  неограниченно	
  долгих	
  зависаний	
  

Закрытие	
  соединения	
  с	
  очередью	
  
•    В	
  худшем	
  случае	
  (неподтвержденная)задача	
  будет	
  сдублирована	
  
•  Введение	
  и	
  Архитектура	
  
•  Доставка	
  задач/результатов	
  
•  Отладка	
  и	
  анализ	
  
•  Обобщение	
  опыта:	
  	
  
   корректность,	
  надежность,	
  производительность	
  
Надежность	
  
•  Всё	
  перезапускаемо	
  и	
  готово	
  к	
  перезапуску	
  или	
  смерти	
  остальных	
  
     –  Инфраструктурные	
  сервисы	
  реплицируют	
  состояние	
  и	
  выбирают	
  «лидера»	
  

•  Только	
  асинхронная	
  коммуникация	
  
•  Все	
  компоненты	
  готовы	
  к	
  дублям	
  и	
  потерям	
  сообщений	
  
•  Явно	
  формулировать	
  переход	
  ответственности	
  за	
  целостность	
  данных	
  
•  Eventual	
  consistency	
  	
  
   (система	
  не	
  обязана	
  быть	
  согласованной	
  постоянно)	
  
Перезапускаемость	
  
Если	
  она	
  есть:	
  
•    Можно	
  перезапустить	
  оборзевший	
  процесс	
  
•    Можно	
  навсегда	
  забыть	
  о	
  редких	
  крахах	
  
•    Можно	
  перезапускать	
  процесс	
  периодически	
  и	
  забыть	
  навсегда	
  об	
  утечках	
  и	
  
     зависаниях	
  

Если	
  ее	
  нет:	
  
•    Надо	
  вылизывать	
  код,	
  пока	
  не	
  исчезнут	
  самые	
  маловероятные	
  крахи	
  и	
  утечки	
  
•    Если	
  крах	
  не	
  по	
  вашей	
  вине	
  (ОС,	
  библиотека,	
  железо,	
  уборщица)	
  –	
  	
  
     это	
  все	
  равно	
  ваши	
  проблемы.	
  
Асинхронные	
  коммуникации	
  
•  С	
  синхронными	
  труднее	
  обрабатывать	
  ошибки,	
  
   есть	
  больше	
  классов	
  ошибок.	
  

•  Можно	
  использовать	
  софт,	
  хорошо	
  разбирающийся	
  
   в	
  асинхронных	
  коммуникациях.	
  

•  Лучше	
  использовать	
  connec•onless	
  протоколы	
  (UDP):	
  
   исчезает	
  как	
  класс	
  проблема	
  «разрыв	
  связи».	
  
   (если	
  задача	
  позволяет)	
  
Eventual	
  consistency	
  
  Стремление	
  к	
  согласованности.	
  
                       	
  


Строгая	
  глобальная	
  согласованность	
  
                    трудна	
  	
  
         далеко	
  не	
  всегда	
  нужна	
  	
  
   и	
  далеко	
  не	
  всегда	
  возможна	
  
Eventual	
  consistency	
  
                                   Publish	
  confirma•ons	
  
  Client	
  


                                  0..3	
           4..5	
            6..7	
  

RabbitMQ	
  
                                       fsync	
         fsync	
       fsync	
  
   Disk	
  

   Клиент	
  и	
  кролик	
  постепенно	
  согласуют	
  знание	
  о	
  том,	
  	
  
                 какие	
  данные	
  надежно	
  сохранены	
  
Eventual	
  consistency	
  
 Scheduler	
  
                 «Займись	
  B»	
         «Займись	
  B»	
  

                 «Занимаюсь	
  A»	
                            «Занимаюсь	
  B»	
  
 Daemon	
  


Планировщик	
  и	
  тысячи	
  демонов	
  постепенно	
  согласуют	
  представление	
  	
  
                    о	
  том,	
  чем	
  демонам	
  надо	
  заниматься	
  
•  Введение	
  и	
  Архитектура	
  
•  Доставка	
  задач/результатов	
  
•  Отладка	
  и	
  анализ	
  
•  Обобщение	
  опыта:	
  	
  
   корректность,	
  надежность,	
  производительность	
  
Производительность	
  
Несколько	
  аспектов:	
  
•  Стабильность	
  под	
  нагрузкой	
  
•  Пропускная	
  способность	
  
•  Задержка	
  
Главное	
  

       Ресурсы	
  конечны	
  
	
  
Что	
  кончалось	
  у	
  нас	
  
Соединения	
  с	
  RabbitMQ	
                                    Одновременные	
  RPC-­‐вызовы	
  
Erlang-­‐процессы	
  в	
  RabbitMQ	
                             Место	
  на	
  диске	
  
Cинхронные	
  AMQP-­‐операции	
  /	
  сек.	
  (e.g.	
            CPU	
  и	
  диск	
  машины,	
  куда	
  погрузили	
  два	
  сервиса	
  сразу	
  
queue.declare)	
                                                 Успешные	
  UDP-­‐пакеты	
  по	
  нагруженному	
  каналу	
  
Установленные	
  соединения	
  /	
  сек.	
  с	
  RabbitMQ	
      Транзакции	
  RabbitMQ	
  в	
  секунду	
  /	
  в	
  минуту	
  
Установленные	
  соединения	
  /	
  сек.	
  с	
  логгером	
      Терпение	
  при	
  анализе	
  больших	
  логов	
  
Внутренние	
  буферы	
  сообщений	
  в	
  логгере	
              Память	
  у	
  инструментов	
  рисования	
  логов	
  
                                                                 	
  
Место	
  в	
  пуле	
  потоков	
  (медленно	
  разгребался)	
  
                                                                 	
  
	
  
Мораль	
  
•  Планируйте	
  потребление	
  ресурсов	
  
•  Особенно	
  таких,	
  потребление	
  которых	
  растет	
  с	
  масштабом	
  
•  Особенно	
  централизованных	
  (в	
  т.ч.	
  сеть)	
  
•  Учитывайте	
  характер	
  нагрузки!	
  
     –  Его	
  бывает	
  трудно	
  предсказать	
  
     –  Наивные	
  бенчмарки	
  нерепрезентативны	
  
Пропускная	
  способность	
  
                         	
  
    Избегайте	
  зависимости	
  от	
  обратной	
  связи	
  
                                     	
  
Иначе	
  задержка	
  начинает	
  уменьшать	
  пропускную	
  способность	
  
                      (печальный	
  пример	
  –	
  TCP)	
  
            Задержку	
  оптимизировать	
  гораздо	
  труднее	
  
                                 	
  
Задержка	
  
•  Измеряйте	
  
•  Избегайте	
  централизованных	
  компонентов	
  на	
  пути	
  запроса	
  
•  Не	
  делите	
  ресурсы	
  между	
  batch	
  и	
  real-­‐•me	
  компонентами	
  
•  Рано	
  или	
  поздно	
  придется	
  управлять	
  приоритетами	
  запросов/
   действий	
  вручную	
  	
  
     –  Понадобятся	
  не	
  просто	
  очереди,	
  а	
  приоритетные	
  очереди	
  
That’s	
  all	
  folks.	
  
Поставьте	
  мне	
  оценку	
  :)	
  
                                                        *	
  




         *	
  Это	
  не	
  наше,	
  но	
  похоже.	
  

More Related Content

Similar to Как разработать вычислительную инфраструктуру для большого кластера

Нагрузочное тестирование без границ (Юрий Ковалёв)
Нагрузочное тестирование без границ (Юрий Ковалёв)Нагрузочное тестирование без границ (Юрий Ковалёв)
Нагрузочное тестирование без границ (Юрий Ковалёв)Ontico
 
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...Ontico
 
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)Ontico
 
Жизнь проекта на production
Жизнь проекта на productionЖизнь проекта на production
Жизнь проекта на productionNikolay Sivko
 
Highload++2013: TopGun - архитектура терабитной платформы DPI
Highload++2013: TopGun - архитектура терабитной платформы DPIHighload++2013: TopGun - архитектура терабитной платформы DPI
Highload++2013: TopGun - архитектура терабитной платформы DPILeonid Yuriev
 
Daemons In Web on #devrus
Daemons In Web on #devrusDaemons In Web on #devrus
Daemons In Web on #devrusAlex Chistyakov
 
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...IT-Portfolio
 
Выявление неполадок в Java приложениях
Выявление неполадок в Java приложенияхВыявление неполадок в Java приложениях
Выявление неполадок в Java приложенияхPavel Grushetzky
 
Дмитрий Куликовский, Алексей Лавренюк - Построение кластеров, нагрузочное тес...
Дмитрий Куликовский, Алексей Лавренюк - Построение кластеров, нагрузочное тес...Дмитрий Куликовский, Алексей Лавренюк - Построение кластеров, нагрузочное тес...
Дмитрий Куликовский, Алексей Лавренюк - Построение кластеров, нагрузочное тес...Yandex
 
Дмитрий Куликовский - Построение кластеров, нагрузочное тестирование, capacit...
Дмитрий Куликовский - Построение кластеров, нагрузочное тестирование, capacit...Дмитрий Куликовский - Построение кластеров, нагрузочное тестирование, capacit...
Дмитрий Куликовский - Построение кластеров, нагрузочное тестирование, capacit...Yandex
 
Опыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyОпыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyAlex Chistyakov
 
Опыт внедрения OpenStack
Опыт внедрения OpenStackОпыт внедрения OpenStack
Опыт внедрения OpenStackYandex
 
Alexander Shigin Slides
Alexander Shigin SlidesAlexander Shigin Slides
Alexander Shigin Slidesguest092df8
 
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013Alex Chistyakov
 
Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Serguei Gitinsky
 
Считаем Рунет или миллион pps в секунду / Дмитрий Смирнов (TNS Russia)
Считаем Рунет или миллион pps в секунду / Дмитрий Смирнов (TNS Russia)Считаем Рунет или миллион pps в секунду / Дмитрий Смирнов (TNS Russia)
Считаем Рунет или миллион pps в секунду / Дмитрий Смирнов (TNS Russia)Ontico
 
WapStart: Как показывать 200 миллионов баннеров ежедневно и быть готовым пока...
WapStart: Как показывать 200 миллионов баннеров ежедневно и быть готовым пока...WapStart: Как показывать 200 миллионов баннеров ежедневно и быть готовым пока...
WapStart: Как показывать 200 миллионов баннеров ежедневно и быть готовым пока...Procontent.Ru Magazine
 
Как показывать 200 миллионов баннеров ежедневно и быть готовым показать милли...
Как показывать 200 миллионов баннеров ежедневно и быть готовым показать милли...Как показывать 200 миллионов баннеров ежедневно и быть готовым показать милли...
Как показывать 200 миллионов баннеров ежедневно и быть готовым показать милли...Evgeny Kokovikhin
 
Мастер-класс про организацию службы эксплуатации
Мастер-класс про организацию службы эксплуатацииМастер-класс про организацию службы эксплуатации
Мастер-класс про организацию службы эксплуатацииNikolay Sivko
 
Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)Ontico
 

Similar to Как разработать вычислительную инфраструктуру для большого кластера (20)

Нагрузочное тестирование без границ (Юрий Ковалёв)
Нагрузочное тестирование без границ (Юрий Ковалёв)Нагрузочное тестирование без границ (Юрий Ковалёв)
Нагрузочное тестирование без границ (Юрий Ковалёв)
 
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
 
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
 
Жизнь проекта на production
Жизнь проекта на productionЖизнь проекта на production
Жизнь проекта на production
 
Highload++2013: TopGun - архитектура терабитной платформы DPI
Highload++2013: TopGun - архитектура терабитной платформы DPIHighload++2013: TopGun - архитектура терабитной платформы DPI
Highload++2013: TopGun - архитектура терабитной платформы DPI
 
Daemons In Web on #devrus
Daemons In Web on #devrusDaemons In Web on #devrus
Daemons In Web on #devrus
 
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
 
Выявление неполадок в Java приложениях
Выявление неполадок в Java приложенияхВыявление неполадок в Java приложениях
Выявление неполадок в Java приложениях
 
Дмитрий Куликовский, Алексей Лавренюк - Построение кластеров, нагрузочное тес...
Дмитрий Куликовский, Алексей Лавренюк - Построение кластеров, нагрузочное тес...Дмитрий Куликовский, Алексей Лавренюк - Построение кластеров, нагрузочное тес...
Дмитрий Куликовский, Алексей Лавренюк - Построение кластеров, нагрузочное тес...
 
Дмитрий Куликовский - Построение кластеров, нагрузочное тестирование, capacit...
Дмитрий Куликовский - Построение кластеров, нагрузочное тестирование, capacit...Дмитрий Куликовский - Построение кластеров, нагрузочное тестирование, capacit...
Дмитрий Куликовский - Построение кластеров, нагрузочное тестирование, capacit...
 
Опыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyОпыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на Ruby
 
Опыт внедрения OpenStack
Опыт внедрения OpenStackОпыт внедрения OpenStack
Опыт внедрения OpenStack
 
Alexander Shigin Slides
Alexander Shigin SlidesAlexander Shigin Slides
Alexander Shigin Slides
 
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
 
Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013
 
Считаем Рунет или миллион pps в секунду / Дмитрий Смирнов (TNS Russia)
Считаем Рунет или миллион pps в секунду / Дмитрий Смирнов (TNS Russia)Считаем Рунет или миллион pps в секунду / Дмитрий Смирнов (TNS Russia)
Считаем Рунет или миллион pps в секунду / Дмитрий Смирнов (TNS Russia)
 
WapStart: Как показывать 200 миллионов баннеров ежедневно и быть готовым пока...
WapStart: Как показывать 200 миллионов баннеров ежедневно и быть готовым пока...WapStart: Как показывать 200 миллионов баннеров ежедневно и быть готовым пока...
WapStart: Как показывать 200 миллионов баннеров ежедневно и быть готовым пока...
 
Как показывать 200 миллионов баннеров ежедневно и быть готовым показать милли...
Как показывать 200 миллионов баннеров ежедневно и быть готовым показать милли...Как показывать 200 миллионов баннеров ежедневно и быть готовым показать милли...
Как показывать 200 миллионов баннеров ежедневно и быть готовым показать милли...
 
Мастер-класс про организацию службы эксплуатации
Мастер-класс про организацию службы эксплуатацииМастер-класс про организацию службы эксплуатации
Мастер-класс про организацию службы эксплуатации
 
Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
 

Как разработать вычислительную инфраструктуру для большого кластера

  • 1. Как  сделать  вычислительную   инфраструктуру  для  большого  кластера   Евгений  Кирпичёв   Станислав  Лагун  
  • 2. •  Введение  и  Архитектура   •  Доставка  задач/результатов   •  Отладка  и  анализ   •  Обобщение  опыта:     корректность,  надежность,  производительность  
  • 3. Что  мы  строим   •  Очень  тяжелые  вычисления  (но  очень  параллельные)   •  Много  одновременных  заданий  (Job)  и  юзеров  разной  важности   •  Простой  API  –  задание  =  поток  задач:  CreateJob,  SubmitTask,  OnResult   –  Задание  –  атомарное  и  stateless  однопоточное  вычисление     (напр.  перемножить  пару  матриц)   •  Непредсказуемые  вычисления:   От  секунд  (нужна  интерактивность)     до  дней  (но  не  мешать  чужой  интерактивности)   •  Задействовать  кластер  целиком   •  Отказоустойчивость  (смерть  вычислителей,  перезапуск  системных  сервисов)  
  • 4. 1  задание  (CreateJob)  =     Тьма  маленьких  задач  (SubmitTask)   Есть  обратная  связь  (OnResult  =>  SubmitTask)   Legacy   API   app   Legacy   API   app   Legacy   API   app  
  • 5. Обычно  (на  суперкомпьютерах)  используют:     PlaGorm  LSF   +     MS  HPC  Server   MPI   Oracle  Grid  Engine   OpenMP     Condor   …   …     Это  называется  «batch  scheduler»  
  • 6. Нам  не  подходит   Они  предполагают:   •  Планировщик  ничего  не  знает  про  задачу   (Просто  выделяет  ядра)   •  Задачи  монолитны   •  «Мне  надо  100  ядер»   •  Как  появится  100  ядер  –  запустит   •  На  99  не  запустит   •  Есть  куча  сложных  правил  и  квот   •  Акцент  на  фичи,  а  не  на  эффективность   Без  этих  ограничений  можно  сделать  эффективнее.   Мы  знаем:  1)  задачи  прерываемы  2)  задачи  независимы  и  массивно  параллельны  
  • 7. Пакетный  планировщик   Наш  планировщик   Приложение:   Приложение:   «Дай-­‐ка  мне  300  –  400  ядер  и  запусти  на   Я  хочу  использовать  кластер  для   них  вот  эту  команду»   вычисления  задач       Планировщик:   Планировщик:   Вот  ядра,  команду  запустил.     Хорошо,  кидай  задачи  сюда,  жди   Разбирайся  сам.   результатов  отсюда.  Я  позабочусь  об   эффективной  и  справедливой  делёжке   ресурсов.   Становятся  возможными  некоторые  трюки  для  повышения  утилизации.   But  this  margin  is  too  small  and  NDA  too  strict…  
  • 8. Пример  неудачной  архитектуры   Клиент  1   Клиент  2   Клиент  3   брокер   Очевидно,  single  bomleneck  –  не  масштабируется   +балансировка  нагрузки  очень  математически  нестабильна  
  • 9. Более  удачная  архитектура   •  Планировщик   +клиенты   –  Слушает  команды  о  запуске-­‐останове  заданий   +статистика   –  Приказывает  демонам  обслуживать  задачи   •  Трубы  (как  очереди,  только  шире)   +логгирование   –  Доставляют  задачи  и  ответы   •  Вычислительные  демоны  на  узлах   +мониторинг   –  Слушаются  планировщика   –  Тянут  из  труб  задач,  считают,  публикуют  ответы  
  • 10. Пример   •  Клиент  –  Планировщику:     Создай  задачу  A,  важность  30%   •  Планировщик  (выбирает  несколько  демонов)  –  демонам:   Ты,  ты  и  ты  –  бросайте  всё  и  подключайтесь  к  трубе  А.   (возможно  вытеснение  работающей  задачи)   •  Клиент  шлет  задачи  в  трубу  А   •  Демоны  считают,  шлют  ответы   •  Клиент  собирает  ответы,  шлет  новые  задачи  и  т.п.  
  • 11. •  Введение  и  Архитектура   •  Доставка  задач/результатов   •  Отладка  и  анализ   •  Обобщение  опыта:     корректность,  надежность,  производительность  
  • 12. Трубы   •  На  основе  RabbitMQ   –  Лучший  продукт  в  своем  классе  (надежная  доставка)   –  Но  «из  коробки»  сам  по  себе  не  масштабируется  
  • 13. Надежная  доставка   Цикл  жизни  демона:   •  Получить  задачу   •  Посчитать   Порядок  очень  важен   •  Отослать  ответ   •  Подтвердить  получение  задачи  
  • 14. Демон  A     вычисления   вычисле   Задача  X   «Подтверждаю:   Задача  Y   Разрыв  связи   задачу  X  получил»   Демон  B     Задача  Y   RabbitMQ   Ждет  подтверждения  X   Ждет  Y   Ждет  Y  
  • 15. Масштабирование   Из  коробки  RabbitMQ  совсем  не  подходит   •  Одна  очередь  плохо  тянет  10000  клиентов   •  Встроенная  кластеризация  делает  не  то   От  нее  вообще  лучше  отказаться  (одни  проблемы)   •  Очевидное  решение:  несколько  очередей  +  load  balancing  
  • 16. Масштабирование   задачи   ответы   Голова  задачи   Голова  задачи   Демон  выбирает  случайного  кролика   (подбираются  демонами)   (отсылаются  демонами)   и  всю  жизнь*  работает  с  ним  
  • 17. Трудности  работы  с  очередями   •  RabbitMQ  под  Windows  тянет  мало  соединений   –  Решено:  каждая  машина  подключается  к  кому-­‐нибудь  одному   •  При  крахах  демонов  данные  теряются   –  Решено:  подтверждения  тасков   •  При  крахах  RabbitMQ  данные  теряются   –  RabbitMQ  не  гарантирует  безопасность  данных  вне  транзакции!   •  Соединение  может  спонтанно  рваться   •  RabbitMQ  дохнет  под  нагрузкой   –  Надо  избегать  перегрузки   •  Нужно  мгновенное  переключение  между  заданиями  (бросай  всё  и  берись  за  задачу  А)   –  Самая  сложная  часть   •  В  очереди  на  конкретном  RabbitMQ  могут  кончиться  задачи   –  Надо  переключаться,  не  нарушая  остальных  свойств  
  • 18. Сохранность  данных  при  крахах  RabbitMQ   Publish  confirmaƒons   Client   0..3   4..5   6..7   RabbitMQ   fsync   fsync   fsync   Disk   Клиент  помнит  сообщения,  про  которые  еще  не  известно,  на  диске  ли  они.   При  разрыве  связи  перепосылает  их.   Это  универсальный  паттерн  в  распределенных  системах  (stream  replica•on).  
  • 19. Не  перегружать  RabbitMQ   •  Если  слишком  интенсивно  слать  сообщения,     RabbitMQ  захлебнется  (не  успевая  писать  на  диск)   •  Тормоза,  крахи,  разрывы  соединений  
  • 20. Не  перегружать  RabbitMQ   Белое  –  «ждем  задачи»   доставка  тормозит,     или  реконнектимся  
  • 21. Не  перегружать  RabbitMQ   Оказывается,  отличная  метрика  загрузки  –     число  неподтвержденных  сообщений   4  задания,  4  разноцветных  кролика   Один  кролик  не  поспевает.  
  • 22. Не  перегружать  RabbitMQ   Ограничить  число  сообщений  «в  полете»   –  Ждать  при  roundrobin,  пока  текущему  кролику  полегчает?   –  Нет,  тогда  один  медленный  будет  всех  тормозить.   –  А  как  тогда?   –  Давать  очередное  сообщение  случайному  неперегруженному.  
  • 23. Поддерживать  асинхронные  прерывания   Иногда  надо  всё  бросить  и  заняться  другим  заданием   –  Прервать  запущенную  задачу  и  кинуть  обратно  в  трубу   –  Или  прервать  ожидание  завершения  задачи   –  Порвать  соединения  с  трубами  предыдущего  задания   •  Убедиться,  что  все  ответы  точно  сохранены  на  диск   Об  этом  мы  узнаем  из  другого  потока   –  Многопоточность  –  это  всегда  ад   –  К  счастью,  это  почти  единственное  использование  многопоточности   –  Но  все  равно  ад   –  На  5000  ядрах  быстро  проявляются  ВСЕ  многопоточные  баги  
  • 24. Переключаться  между  кроликами   •  Если  кончились  задачи  в  нашем  –  постучаться  в  другого   •  Если  делать  наивно,  будет  куча  проблем   –  Бури  реконнектов   –  Голодание   –  Дисбаланс   –  Кончатся  соединения   –  ...   –  NO  PROFIT!!!11  
  • 25. Как  это  закодировать   Можно  сделать  лапшу,  делающую  все  сразу   –  Реконнекты,   подтверждения     доставки,   переключение,     балансировка,   асинхронные   прерывания…  
  • 26. Как  не  сойти  с  ума   Разумеется,  слои.      
  • 27. Слои   Отсыльщик:   –  Отослать   –  Получить/сбросить  список  неподтвержденных   –  Завершиться  (возможно,  асинхронно)   Слушатель:   –  Достать  сейчас  (blocking  +  •meout)   –  Достать  потом  (callback)   –  Завершиться  (возможно,  асинхронно)  
  • 28. Слои   «Игнорировать   «Балансировать  отправку     неподтвержденные     между  несколькими»   при  закрытии»   «При  ошибке  переоткрыться»   «Слушать  сразу  несколько»   «Преобразовать  тип     сообщения»   «При  ошибке  сделать     «При  ошибке     то-­‐то  и  то-­‐то»   попробовать  еще  раз»  
  • 29. Например   задачи   ответы   Сериализовать   Десериализовать   При  ошибке  повторять  до  успеха   При  ошибке  повторять  до  успеха   При  ошибке  залоггировать   При  ошибке  залоггировать   При  ошибке  переоткрыть   При  ошибке  переоткрыть   (неподтвержденное  переслать)   Слушать  сразу  несколько   Балансировать   По  числу     Неограниченная  предвыборка   Слать  в  RabbitMQ   кроликов   Слушать  из  RabbitMQ  
  • 30. •  Введение  и  Архитектура   •  Доставка  задач/результатов   •  Отладка  и  анализ   •  Обобщение  опыта:     корректность,  надежность,  производительность  
  • 31. Отладка  и  анализ   •  Дебаггер  –  не  вариант  (только  для  локальных  тестов)   •  Проблемы  тоже  распределенные   –  Особенно  проблемы  производительности   •  Post  mortem  отладка  по  логам   •  Логов,  по  нашим  меркам,  дох  очень  много   (тысячи  важных  сообщений  в  сек.,  в  пике  до  сотен  тысяч)  
  • 32. Пара  фокусов  в  рукаве   •  Мощный  логгер   –  Глобальная  ось  времени  (точнее,  чем  NTP)   –  Тянет  сотни  тысяч  сообщений  в  секунду  от  тысяч  клиентов   –  hšp://code.google.com/p/greg  –  опенсорс-­‐версия   –  Ставим  1шт.  на  кластер,  получаем  точную  глобальную  картину   (без  мучений  со  специальным  сбором-­‐слиянием  логов)   •  GNU  textu•ls  +  awk  
  • 33. ƒmeplomers     две  специальных  рисовалки     A  picture  is  worth  a  thousand  words   hšp://jkff.info/so¡ware/•meplošers/  
  • 35. Что  для  этого  нужно?   Очень  подробные  логи.   Еще  об  этом  –  позже.  
  • 36. •  Введение  и  Архитектура   •  Доставка  задач/результатов   •  Отладка  и  анализ   •  Обобщение  опыта:     корректность,  надежность,  производительность  
  • 37. Корректность:  Главный  принцип   Как  писать  правильный  код?  
  • 38. Корректность:  Главный  принцип   Код  точно  неправильный.     Как  быть?  
  • 39. Как  быть?   •  Писать  максимально  подробные  логи   •  Писать  меньше  кода   (только  то,  без  чего  программа  не  будет  работать)   •  Минимизировать  «ядро  корректности»   •  Избегать  многопоточности  и  других  опасных  приемов   (никакого  геройства)   •  Использовать  eventual  consistency     (не  настаивать  на  strong  consistency)   •  Использовать  «барьеры»    
  • 40. Барьеры   Переводят  любое  состояние  в  предсказуемое.   Уничтожение  процесса  (выполнение  действия  в  отдельном  процессе)   •  Защищает  от  утечек  ресурсов  внутри  процесса   Периодический  перезапуск  системы   •  Защищает  от  неограниченно  долгих  зависаний   Закрытие  соединения  с  очередью   •  В  худшем  случае  (неподтвержденная)задача  будет  сдублирована  
  • 41. •  Введение  и  Архитектура   •  Доставка  задач/результатов   •  Отладка  и  анализ   •  Обобщение  опыта:     корректность,  надежность,  производительность  
  • 42. Надежность   •  Всё  перезапускаемо  и  готово  к  перезапуску  или  смерти  остальных   –  Инфраструктурные  сервисы  реплицируют  состояние  и  выбирают  «лидера»   •  Только  асинхронная  коммуникация   •  Все  компоненты  готовы  к  дублям  и  потерям  сообщений   •  Явно  формулировать  переход  ответственности  за  целостность  данных   •  Eventual  consistency     (система  не  обязана  быть  согласованной  постоянно)  
  • 43. Перезапускаемость   Если  она  есть:   •  Можно  перезапустить  оборзевший  процесс   •  Можно  навсегда  забыть  о  редких  крахах   •  Можно  перезапускать  процесс  периодически  и  забыть  навсегда  об  утечках  и   зависаниях   Если  ее  нет:   •  Надо  вылизывать  код,  пока  не  исчезнут  самые  маловероятные  крахи  и  утечки   •  Если  крах  не  по  вашей  вине  (ОС,  библиотека,  железо,  уборщица)  –     это  все  равно  ваши  проблемы.  
  • 44. Асинхронные  коммуникации   •  С  синхронными  труднее  обрабатывать  ошибки,   есть  больше  классов  ошибок.   •  Можно  использовать  софт,  хорошо  разбирающийся   в  асинхронных  коммуникациях.   •  Лучше  использовать  connec•onless  протоколы  (UDP):   исчезает  как  класс  проблема  «разрыв  связи».   (если  задача  позволяет)  
  • 45. Eventual  consistency   Стремление  к  согласованности.     Строгая  глобальная  согласованность   трудна     далеко  не  всегда  нужна     и  далеко  не  всегда  возможна  
  • 46. Eventual  consistency   Publish  confirma•ons   Client   0..3   4..5   6..7   RabbitMQ   fsync   fsync   fsync   Disk   Клиент  и  кролик  постепенно  согласуют  знание  о  том,     какие  данные  надежно  сохранены  
  • 47. Eventual  consistency   Scheduler   «Займись  B»   «Займись  B»   «Занимаюсь  A»   «Занимаюсь  B»   Daemon   Планировщик  и  тысячи  демонов  постепенно  согласуют  представление     о  том,  чем  демонам  надо  заниматься  
  • 48. •  Введение  и  Архитектура   •  Доставка  задач/результатов   •  Отладка  и  анализ   •  Обобщение  опыта:     корректность,  надежность,  производительность  
  • 49. Производительность   Несколько  аспектов:   •  Стабильность  под  нагрузкой   •  Пропускная  способность   •  Задержка  
  • 50. Главное   Ресурсы  конечны    
  • 51. Что  кончалось  у  нас   Соединения  с  RabbitMQ   Одновременные  RPC-­‐вызовы   Erlang-­‐процессы  в  RabbitMQ   Место  на  диске   Cинхронные  AMQP-­‐операции  /  сек.  (e.g.   CPU  и  диск  машины,  куда  погрузили  два  сервиса  сразу   queue.declare)   Успешные  UDP-­‐пакеты  по  нагруженному  каналу   Установленные  соединения  /  сек.  с  RabbitMQ   Транзакции  RabbitMQ  в  секунду  /  в  минуту   Установленные  соединения  /  сек.  с  логгером   Терпение  при  анализе  больших  логов   Внутренние  буферы  сообщений  в  логгере   Память  у  инструментов  рисования  логов     Место  в  пуле  потоков  (медленно  разгребался)      
  • 52. Мораль   •  Планируйте  потребление  ресурсов   •  Особенно  таких,  потребление  которых  растет  с  масштабом   •  Особенно  централизованных  (в  т.ч.  сеть)   •  Учитывайте  характер  нагрузки!   –  Его  бывает  трудно  предсказать   –  Наивные  бенчмарки  нерепрезентативны  
  • 53. Пропускная  способность     Избегайте  зависимости  от  обратной  связи     Иначе  задержка  начинает  уменьшать  пропускную  способность   (печальный  пример  –  TCP)   Задержку  оптимизировать  гораздо  труднее    
  • 54. Задержка   •  Измеряйте   •  Избегайте  централизованных  компонентов  на  пути  запроса   •  Не  делите  ресурсы  между  batch  и  real-­‐•me  компонентами   •  Рано  или  поздно  придется  управлять  приоритетами  запросов/ действий  вручную     –  Понадобятся  не  просто  очереди,  а  приоритетные  очереди  
  • 55. That’s  all  folks.   Поставьте  мне  оценку  :)   *   *  Это  не  наше,  но  похоже.