Отладка производительности приложения на Erlang / Максим...
-
Upload
ontico -
Category
Engineering
-
view
87 -
download
0
Transcript of Отладка производительности приложения на Erlang / Максим...
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
• Случайно нашли три строчки, портивших всё