Отладка производительности приложения на Erlang / Максим...

40
Отладка multicore производительности софта на Erlang Максим Лапшин [email protected]

Transcript of Отладка производительности приложения на Erlang / Максим...

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

Отладка multicore производительности

софта на Erlang

Максим Лапшин [email protected]

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

Multicore профилирование

• Когда одного ядра не хватает

• И процессор недозагружен

• А скорость обработки падает

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

Добро пожаловать в уютный multicore ад

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

multicore там, где надо в памяти состыковывать онлайн клиентов

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

О чём поговорим

• История одного тикета в нашем редмайне

• Пришли два клиента, пожаловались на тормоза

• Мы пошли разбираться

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

htop что-то показывает

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

Erlang использует акторы начнем их исследовать

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

Акторы вместо тредов

• Актор — это микропроцесс в общем пространстве

• Изоляция по данным

• Коммуникация с помощью сообщений

• Share nothing облегчает параллелизм

• Ещё неплохо бы immutable

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

etop

• в erlang вызов функции — редукция

• каждый оборот цикла — редукция

• etop меряет по редукциям

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

fprof, eprof

• Очень грубые профилировщики линейного кода

• меряют больше редукции, чем такты CPU

• вносят сильные искажения в замеры

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

htop вам не друг

• scheduler spin time — жжет такты впустую

• надо смотреть на scheduler usage внутри beam

• erlang:statistics(scheduler_wall_time)

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

Чего-то намеряли, но ничего непонятно

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

Акторы тупят

• Всё весело запрограммировали, но всё легло

• Пропускная способность ниже рассчетной

• CPU мало используется

• Как эти ваши акторы профилировать?!!

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

Бутылочные горлышки

• Работы много, но всё поручили одному

• Например это актор синглтон

• Инспектируем очереди сообщений

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

Перегруженный актор

• Берем список процессов

• Забираем process_info(Pid, message_queue_len)

• Сортируем

• У первых 10 берем стектрейс

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

Перегруженный актор

• Тысячи или миллионы сообщений в очереди

• Надо шардить или рефакторить

• Erlang пенализирует того, кто шлет такому сообщения (но об этом подробнее дальше)

• То же самое будет в Go/Scala

• Можно воспользоваться ets

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

Привет, блокировки

• Треды лишь спрятаны акторами

• Мьютексы никуда не делись

• Просто теперь они спрятаны

• Но erlang помогает их отследить!

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

Где мьютексы в erlang

• главный мьютекс у каждой ets

• 8-16 мьютексов на чтение и запись в ets

• мьютекс у каждого процесса

• и ещё около сотни

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

lcnt

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

lcnt

• инструмент в erlang для сборки метрик по мьютексам

• стоит некоторых ресурсов, но не смертельно

• некоторые ньюансы пришлось патчить в эрланге

• кроме мьютексов есть spinlock в ets

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

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).

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

Как можно всё испортить?

• проверять process_info у другого процесса

• очень много писать в ets

• межтредное взаимодействие

• бездумно частая аллокация

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

Перегружен синглтон

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

Механика поломок

• отправитель делает process_info(flu_pulsedb, message_queue_len)

• bif лочит очередь сообщений flu_pulsedb

• коллизии на очереди сообщений (proc_msgq)

• все шедулеры тормозят

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

Перегружена ets

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

Что делать с ets?

• Шардить на разные ets. Больше таблиц, больше локов, реже коллизии

• Пропускать всё через единый процесс на таблицу

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

О чём умолчим

• эффект от atomic на N-процессорном сервере

• false sharing

• как это детектить в эрланге — непонятно

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

Локи убрали, CPU в полку, что дальше?

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

scheduler time

• С помощью trace можно узнать время постановки и снятия с шедулера

• очень жестокая штука

• помогает получить иную картину мира

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

msacc

• Очень дешевый быстрый анализ расходов CPU

• аллокатор, C code, busy_wait, check_io, emulator, ets, gc, gc_full, nif, port, send, sleep, timers, other

• надо перекомпиливать для расширенного варианта

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

msacc

• Включается, собирает, выключается

• Можно мерять за 2-10 секунд

• Но имеет смысл ловить всплески за 100-200 мс

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

msacc

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

msacc

• Оказалось, замучали аллокатор

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

Что делать с аллокатором?

• В erlang очень, очень крутые аллокаторы

• Мультитредные, многоступенчатые

• Удобно и понятно настраивается

• +MBas aoffcaobf +MBacul 0 -MBlmbcs 512 -MEas aobf -MElmbcs 512

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

instrument

• Ещё один механизм изучения erlang VM

• показывает, кто аллоцирует много данных

• тяжело запускать на полном продакшне

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

instrument

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

instrument

• Нашли, где делаем кучу лишней аллокации

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

erts_alloc_config

• Подбирает настройки аллокатора

• Но выключает мультитредный аллокатор (beam +Mea config)

• Собирает историю и предлагает настройки

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

Наш опыт• Потратили 3 месяца на поиск загадочной проблемы, спонтанно возникшей где-то

• Разгребли 9 фатальных локов с помощью lcnt, msacc

• Починили аллокацию с помощью instrument, erts_alloc_config

• Случайно нашли три строчки, портивших всё

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

Вопросы?

Максим Лапшин, Flussonic [email protected]