HighLoad++ 2017
Зал «Рио-де-Жанейро», 7 ноября, 17:00
Тезисы:
http://www.highload.ru/2017/abstracts/2932.html
Наша компания более 9 лет использует язык Lua для реализации бизнес-логики в проектах. Довольно быстро мы пришли к LuaJIT в качестве рантайм-платформы, а пару лет назад, столкнувшись с серьёзными архитектурными ограничениями этого продукта, создали собственный форк и успешно мигрировали на него.
...
2. IPONWEB
● Технологические решения в сфере онлайн-рекламы
● Работаем с нагрузками порядка 5M RPS
● Сложный технологический стек
● Сервер приложений
● Интерпретатор Lua для реализации бизнес-логики
3. Lua в IPONWEB
● Использовали LuaJIT (1.x, 2.0) более 9 лет
● Q2 2015: Форкнули LuaJIT (Linux, x64)
● 2015-2016: Разработка, стабилизация, первые миграции
● Q1 2017: Мигрировали более 95% серверов
● 2017: Поддержка, работа над новой функциональностью
5. Над чем работали (2015 – 2017 гг.)?
● "Проблема гигабайта"
● Новая функция хэширования строк
6. Над чем работали (2015 – 2017 гг.)?
● "Проблема гигабайта"
● Новая функция хэширования строк
● Тесты
7. Над чем работали (2015 – 2017 гг.)?
● "Проблема гигабайта"
● Новая функция хэширования строк
● Тесты
● Неизменяемые объекты
8. Над чем работали (2015 – 2017 гг.)?
● "Проблема гигабайта"
● Новая функция хэширования строк
● Тесты
● Неизменяемые объекты
● Завершение корутин по тайм-ауту
9. Над чем работали (2015 – 2017 гг.)?
● "Проблема гигабайта"
● Новая функция хэширования строк
● Тесты
● Неизменяемые объекты
● Завершение корутин по тайм-ауту
● Профилировщик, новые утилиты
10. Осень 2016 г.
● Решены самые насущные проблемы
● Первые миграции
● Задача – проанализировать работу JIT-компилятора
11. ● Несколько проектов
● Сервер с выключенным компилятором
● Сервер с включенным компилятором
Анализ производительности JIT-компилятора
16. Какие были инструменты для анализа?
● Количественно: Graphite, скорость работы системы
● Качественно: luajit -jdump
17. Какие были инструменты для анализа?
● Количественно: Graphite, скорость работы системы
● Качественно: luajit -jdump
● luajit-web-inspector
● loom
● studio (RaptorJIT)
Что появилось за последний год?
21. src/jit/bc.lua:
local ma, mb, mc = band(m, 7), band(m, 15*8), band(m, 15*128)
local a = band(shr(ins, 8), 0xff)
local oidx = 6*band(ins, 0xff)
local op = sub(bcnames, oidx+1, oidx+6)
local s = format("%04d %s %-6s %3s ",
pc, prefix or " ", op, ma == 0 and "" or a)
local d = shr(ins, 16)
if mc == 13*128 then -- BCMjump
return format("%s=> %04dn", s, pc+d-0x7fff)
end
Исходный код
22. ● 700 Мб данных на рабочий поток
● 3500 скомпилированных трасс
● Неудачные попытки компиляции
● Дампы регистров при выходе из трассы
Объем данных
25. ● Переписали на C
● Написали анализатор (совместим с LuaJIT)
https://github.com/iponweb/dumpanalyze
Решение
26. ● Переписали на C
● Написали анализатор (совместим с LuaJIT)
https://github.com/iponweb/dumpanalyze
● Сгруппированные "кусты" трасс
● Статистика по скомпилированным трассам
● Статистика по неудачным попыткам компиляции
Решение
46. ● Смартфон
● Приложение
● Геолокация
● Баннер
● Настольный ПК
● Сайт
● Do Not Track
● Видео
● Смартфон
● Сайт
● Do Not Track
● Аудио-ролик
Поток объектов различной структуры
51. for i = 1, N do
foo()
if i > 1000 then
bar()
end
end
baz()
Компилируемый цикл
52. for i = 1, N do
foo()
if i > 1000 then
bar()
end
end
baz()
Компилируемый цикл
53. for i = 1, N do
foo()
if i > 1000 then
bar()
end
end
baz()
Код вне цикла
54.
55. Выводы
● Инструменты общего назначения могут не справляться со
спецификой бизнес-задач.
● Мы стали добавлять опции в компилятор, тестировали,
сравнивали.
● Локальные изменения улучшили производительность на
10%.
● Экосистеме LuaJIT'а нужно помочь с инструментами
аналитики.