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