Отладка multicore
производительности
софта на Erlang
Максим Лапшин
max@erlyvideo.org
Multicore профилирование
• Когда одного ядра не хватает
• И процессор недозагружен
• А скорость обработки падает
Добро пожаловать в
уютный multicore ад
multicore там, где надо в памяти
состыковывать онлайн клиентов
О чём поговорим
• История одного тикета в нашем редмайне
• Пришли два клиента, пожаловались на тормоза
• Мы пошли разбираться
htop что-то показывает
Erlang использует акторы
начнем их исследовать
Акторы вместо тредов
• Актор — это микропроцесс в общем пространстве
• Изоляция по данным
• Коммуникация с помощью сообщений
• Share nothing облегчает параллелизм
• Ещё неплохо бы immutable
etop
• в erlang вызов функции — редукция
• каждый оборот цикла — редукция
• etop меряет по редукциям
fprof, eprof
• Очень грубые профилировщики линейного кода
• меряют больше редукции, чем такты CPU
• вносят сильные искажения в замеры
htop вам не друг
• scheduler spin time — жжет такты впустую
• надо смотреть на scheduler usage внутри beam
• erlang:statistics(scheduler_wall_time)
Чего-то намеряли, но
ничего непонятно
Акторы тупят
• Всё весело запрограммировали, но всё легло
• Пропускная способность ниже рассчетной
• CPU мало используется
• Как эти ваши акторы профилировать?!!
Бутылочные горлышки
• Работы много, но всё поручили одному
• Например это актор синглтон
• Инспектируем очереди сообщений
Перегруженный актор
• Берем список процессов
• Забираем process_info(Pid, message_queue_len)
• Сортируем
• У первых 10 берем стектрейс
Перегруженный актор
• Тысячи или миллионы сообщений в очереди
• Надо шардить или рефакторить
• Erlang пенализирует того, кто шлет такому
сообщения (но об этом подробнее дальше)
• То же самое будет в Go/Scala
• Можно воспользоваться ets
Привет, блокировки
• Треды лишь спрятаны акторами
• Мьютексы никуда не делись
• Просто теперь они спрятаны
• Но erlang помогает их отследить!
Где мьютексы в erlang
• главный мьютекс у каждой ets
• 8-16 мьютексов на чтение и запись в ets
• мьютекс у каждого процесса
• и ещё около сотни
lcnt
lcnt
• инструмент в erlang для сборки метрик по мьютексам
• стоит некоторых ресурсов, но не смертельно
• некоторые ньюансы пришлось патчить в эрланге
• кроме мьютексов есть spinlock в ets
lcnt
• Для тех, кто читает со slideshare
• lcnt:start(), lcnt:rt_opt({copy_save, true}),lcnt:clear(),
timer:sleep(5000), lcnt:collect(), lcnt:swap_pid_keys(),
lcnt:conflicts([{max_locks, 5}]).
• lcnt:inspect(proc_status).
Как можно всё испортить?
• проверять process_info у другого процесса
• очень много писать в ets
• межтредное взаимодействие
• бездумно частая аллокация
Перегружен синглтон
Механика поломок
• отправитель делает process_info(flu_pulsedb,
message_queue_len)
• bif лочит очередь сообщений flu_pulsedb
• коллизии на очереди сообщений (proc_msgq)
• все шедулеры тормозят
Перегружена ets
Что делать с ets?
• Шардить на разные ets. Больше таблиц, больше
локов, реже коллизии
• Пропускать всё через единый процесс на таблицу
О чём умолчим
• эффект от atomic на N-процессорном сервере
• false sharing
• как это детектить в эрланге — непонятно
Локи убрали, CPU в полку,
что дальше?
scheduler time
• С помощью trace можно узнать время постановки
и снятия с шедулера
• очень жестокая штука
• помогает получить иную картину мира
msacc
• Очень дешевый быстрый анализ расходов CPU
• аллокатор, C code, busy_wait, check_io, emulator,
ets, gc, gc_full, nif, port, send, sleep, timers, other
• надо перекомпиливать для расширенного
варианта
msacc
• Включается, собирает, выключается
• Можно мерять за 2-10 секунд
• Но имеет смысл ловить всплески за 100-200 мс
msacc
msacc
• Оказалось, замучали аллокатор
Что делать с аллокатором?
• В erlang очень, очень крутые аллокаторы
• Мультитредные, многоступенчатые
• Удобно и понятно настраивается
• +MBas aoffcaobf +MBacul 0 -MBlmbcs 512 -MEas
aobf -MElmbcs 512
instrument
• Ещё один механизм изучения erlang VM
• показывает, кто аллоцирует много данных
• тяжело запускать на полном продакшне
instrument
instrument
• Нашли, где делаем кучу лишней аллокации
erts_alloc_config
• Подбирает настройки аллокатора
• Но выключает мультитредный аллокатор
(beam +Mea config)
• Собирает историю и предлагает настройки
Наш опыт
• Потратили 3 месяца на поиск загадочной
проблемы, спонтанно возникшей где-то
• Разгребли 9 фатальных локов с помощью lcnt,
msacc
• Починили аллокацию с помощью instrument,
erts_alloc_config
• Случайно нашли три строчки, портивших всё
Вопросы?
Максим Лапшин, Flussonic
max@erlyvideo.org

Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)

  • 1.
  • 2.
    Multicore профилирование • Когдаодного ядра не хватает • И процессор недозагружен • А скорость обработки падает
  • 3.
  • 4.
    multicore там, гденадо в памяти состыковывать онлайн клиентов
  • 5.
    О чём поговорим •История одного тикета в нашем редмайне • Пришли два клиента, пожаловались на тормоза • Мы пошли разбираться
  • 6.
  • 7.
  • 8.
    Акторы вместо тредов •Актор — это микропроцесс в общем пространстве • Изоляция по данным • Коммуникация с помощью сообщений • Share nothing облегчает параллелизм • Ещё неплохо бы immutable
  • 9.
    etop • в erlangвызов функции — редукция • каждый оборот цикла — редукция • etop меряет по редукциям
  • 10.
    fprof, eprof • Оченьгрубые профилировщики линейного кода • меряют больше редукции, чем такты CPU • вносят сильные искажения в замеры
  • 11.
    htop вам недруг • scheduler spin time — жжет такты впустую • надо смотреть на scheduler usage внутри beam • erlang:statistics(scheduler_wall_time)
  • 12.
  • 13.
    Акторы тупят • Всёвесело запрограммировали, но всё легло • Пропускная способность ниже рассчетной • CPU мало используется • Как эти ваши акторы профилировать?!!
  • 14.
    Бутылочные горлышки • Работымного, но всё поручили одному • Например это актор синглтон • Инспектируем очереди сообщений
  • 15.
    Перегруженный актор • Беремсписок процессов • Забираем process_info(Pid, message_queue_len) • Сортируем • У первых 10 берем стектрейс
  • 16.
    Перегруженный актор • Тысячиили миллионы сообщений в очереди • Надо шардить или рефакторить • Erlang пенализирует того, кто шлет такому сообщения (но об этом подробнее дальше) • То же самое будет в Go/Scala • Можно воспользоваться ets
  • 17.
    Привет, блокировки • Тредылишь спрятаны акторами • Мьютексы никуда не делись • Просто теперь они спрятаны • Но erlang помогает их отследить!
  • 18.
    Где мьютексы вerlang • главный мьютекс у каждой ets • 8-16 мьютексов на чтение и запись в ets • мьютекс у каждого процесса • и ещё около сотни
  • 19.
  • 20.
    lcnt • инструмент вerlang для сборки метрик по мьютексам • стоит некоторых ресурсов, но не смертельно • некоторые ньюансы пришлось патчить в эрланге • кроме мьютексов есть spinlock в ets
  • 21.
    lcnt • Для тех,кто читает со slideshare • lcnt:start(), lcnt:rt_opt({copy_save, true}),lcnt:clear(), timer:sleep(5000), lcnt:collect(), lcnt:swap_pid_keys(), lcnt:conflicts([{max_locks, 5}]). • lcnt:inspect(proc_status).
  • 22.
    Как можно всёиспортить? • проверять process_info у другого процесса • очень много писать в ets • межтредное взаимодействие • бездумно частая аллокация
  • 23.
  • 24.
    Механика поломок • отправительделает process_info(flu_pulsedb, message_queue_len) • bif лочит очередь сообщений flu_pulsedb • коллизии на очереди сообщений (proc_msgq) • все шедулеры тормозят
  • 25.
  • 26.
    Что делать сets? • Шардить на разные ets. Больше таблиц, больше локов, реже коллизии • Пропускать всё через единый процесс на таблицу
  • 27.
    О чём умолчим •эффект от atomic на N-процессорном сервере • false sharing • как это детектить в эрланге — непонятно
  • 28.
    Локи убрали, CPUв полку, что дальше?
  • 29.
    scheduler time • Спомощью trace можно узнать время постановки и снятия с шедулера • очень жестокая штука • помогает получить иную картину мира
  • 30.
    msacc • Очень дешевыйбыстрый анализ расходов CPU • аллокатор, C code, busy_wait, check_io, emulator, ets, gc, gc_full, nif, port, send, sleep, timers, other • надо перекомпиливать для расширенного варианта
  • 31.
    msacc • Включается, собирает,выключается • Можно мерять за 2-10 секунд • Но имеет смысл ловить всплески за 100-200 мс
  • 32.
  • 33.
  • 34.
    Что делать саллокатором? • В erlang очень, очень крутые аллокаторы • Мультитредные, многоступенчатые • Удобно и понятно настраивается • +MBas aoffcaobf +MBacul 0 -MBlmbcs 512 -MEas aobf -MElmbcs 512
  • 35.
    instrument • Ещё одинмеханизм изучения erlang VM • показывает, кто аллоцирует много данных • тяжело запускать на полном продакшне
  • 36.
  • 37.
    instrument • Нашли, гдеделаем кучу лишней аллокации
  • 38.
    erts_alloc_config • Подбирает настройкиаллокатора • Но выключает мультитредный аллокатор (beam +Mea config) • Собирает историю и предлагает настройки
  • 39.
    Наш опыт • Потратили3 месяца на поиск загадочной проблемы, спонтанно возникшей где-то • Разгребли 9 фатальных локов с помощью lcnt, msacc • Починили аллокацию с помощью instrument, erts_alloc_config • Случайно нашли три строчки, портивших всё
  • 40.