SlideShare a Scribd company logo
1 of 57
Download to read offline
Тонкости работы
трассирующего
JIT-компилятора
Антон Солдатов, IPONWEB
Москва, 7 ноября 2017 г.
IPONWEB
● Технологические решения в сфере онлайн-рекламы
● Работаем с нагрузками порядка 5M RPS
● Сложный технологический стек
● Сервер приложений
● Интерпретатор Lua для реализации бизнес-логики
Lua в IPONWEB
● Использовали LuaJIT (1.x, 2.0) более 9 лет
● Q2 2015: Форкнули LuaJIT (Linux, x64)
● 2015-2016: Разработка, стабилизация, первые миграции
● Q1 2017: Мигрировали более 95% серверов
● 2017: Поддержка, работа над новой функциональностью
Над чем работали (2015 – 2017 гг.)?
● "Проблема гигабайта"
Над чем работали (2015 – 2017 гг.)?
● "Проблема гигабайта"
● Новая функция хэширования строк
Над чем работали (2015 – 2017 гг.)?
● "Проблема гигабайта"
● Новая функция хэширования строк
● Тесты
Над чем работали (2015 – 2017 гг.)?
● "Проблема гигабайта"
● Новая функция хэширования строк
● Тесты
● Неизменяемые объекты
Над чем работали (2015 – 2017 гг.)?
● "Проблема гигабайта"
● Новая функция хэширования строк
● Тесты
● Неизменяемые объекты
● Завершение корутин по тайм-ауту
Над чем работали (2015 – 2017 гг.)?
● "Проблема гигабайта"
● Новая функция хэширования строк
● Тесты
● Неизменяемые объекты
● Завершение корутин по тайм-ауту
● Профилировщик, новые утилиты
Осень 2016 г.
● Решены самые насущные проблемы
● Первые миграции
● Задача – проанализировать работу JIT-компилятора
● Несколько проектов
● Сервер с выключенным компилятором
● Сервер с включенным компилятором
Анализ производительности JIT-компилятора
Как работает трассирующий JIT-компилятор?
Какие были инструменты для анализа?
● Количественно: Graphite, скорость работы системы
● Качественно: luajit -jdump
Какие были инструменты для анализа?
● Количественно: Graphite, скорость работы системы
● Качественно: luajit -jdump
● luajit-web-inspector
● loom
● studio (RaptorJIT)
Что появилось за последний год?
---- TRACE 1 start (command line):1
0006 ADDVV 0 0 4
0007 FORL 1 => 0006
---- TRACE 1 IR
0001 int SLOAD #2 CI
0002 > num SLOAD #1 T
0003 num CONV 0001 num.int
0004 + num ADD 0003 0002
0005 + int ADD 0001 +1
0006 > int LE 0005 +100
0007 ------ LOOP ------------
0008 num CONV 0005 num.int
0009 + num ADD 0008 0004
0010 + int ADD 0005 +1
0011 > int LE 0010 +100
0012 int PHI 0005 0010
0013 num PHI 0004 0009
luajit -jdump
---- TRACE 1 mcode 76
12a0effac mov dword [0x000424a0], 0x1
12a0effb7 cvtsd2si ebp, [rdx+0x8]
12a0effbc cmp dword [rdx+0x4], 0xfffeffff
12a0effc3 jnb 0x12a0e0010 ->0
12a0effc9 xorps xmm7, xmm7
12a0effcc cvtsi2sd xmm7, ebp
12a0effd0 addsd xmm7, [rdx]
12a0effd4 add ebp, +0x01
12a0effd7 cmp ebp, +0x64
12a0effda jg 0x12a0e0014 ->1
->LOOP:
12a0effe0 xorps xmm6, xmm6
12a0effe3 cvtsi2sd xmm6, ebp
12a0effe7 addsd xmm7, xmm6
12a0effeb add ebp, +0x01
12a0effee cmp ebp, +0x64
12a0efff1 jle 0x12a0effe0 ->LOOP
12a0efff3 jmp 0x12a0e001c ->3
---- TRACE 1 stop -> loop
Какова методика анализа?
● Сервер с продуктовой нагрузкой
● Включаем дампер на 10-15 минут
● Анализируем собранные данные
Проблема №0: Инструментарий
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
Исходный код
● 700 Мб данных на рабочий поток
● 3500 скомпилированных трасс
● Неудачные попытки компиляции
● Дампы регистров при выходе из трассы
Объем данных
Анализировать вручную невозможно
● Переписали на C
Решение
● Переписали на C
● Написали анализатор (совместим с LuaJIT)
https://github.com/iponweb/dumpanalyze
Решение
● Переписали на C
● Написали анализатор (совместим с LuaJIT)
https://github.com/iponweb/dumpanalyze
● Сгруппированные "кусты" трасс
● Статистика по скомпилированным трассам
● Статистика по неудачным попыткам компиляции
Решение
Проблема №1: Большое число точек входа
SSP Ромашка
SSP Одуванчик
SSP N
Общая RTB-логика
Архитектура приложения
SSP Ромашка
SSP Одуванчик
SSP N
Общая RTB-логика
Как компилируется?
SSP Ромашка
SSP Одуванчик
SSP N
Общая RTB-логика
Больше двухсот модулей
Завершаем трассирование на выходе из общего модуля
Решение
Проблема №2: Ключи-литералы в таблицах
local x = t.foo
hash("foo") & (size - 1)
size
Доступ по ключу
local x = t.foo
hash("foo") & (size - 1)
size
Доступ по ключу
local x = t.foo
hash("foo") & (size - 1)
size
Доступ по ключу
local x = t.foo
hash("foo") & (size - 1)
size
Доступ по ключу
local x = t.foo
hash("foo") & (size2 - 1)
size2
Доступ по ключу
Если размер меняется – выходим из трассы
local data = {
{["prop1"] = "value-1", ["prop2"] = 42},
{["prop1"] = "value-2", ["prop2"] = 43},
{["prop1"] = "value-3", ["prop2"] = 44},
{["prop1"] = "value-4", ["prop2"] = 45},
{["prop1"] = "value-5", ["prop2"] = 46},
{["prop1"] = "value-6", ["prop2"] = 47},
{["prop1"] = "value-7", ["prop2"] = 48},
-- ...
}
Поток объектов похожей структуры
● Смартфон
● Приложение
● Геолокация
● Баннер
● Настольный ПК
● Сайт
● Do Not Track
● Видео
● Смартфон
● Сайт
● Do Not Track
● Аудио-ролик
Поток объектов различной структуры
Десятки параметров
Отключаем "быстрое" индексирование
Решение
Проблема №3: Выход боковых трасс из циклов
for i = 1, N do
foo()
if i > 1000 then
bar()
end
end
baz()
Компилируемый цикл
for i = 1, N do
foo()
if i > 1000 then
bar()
end
end
baz()
Компилируемый цикл
for i = 1, N do
foo()
if i > 1000 then
bar()
end
end
baz()
Код вне цикла
Выводы
● Инструменты общего назначения могут не справляться со
спецификой бизнес-задач.
● Мы стали добавлять опции в компилятор, тестировали,
сравнивали.
● Локальные изменения улучшили производительность на
10%.
● Экосистеме LuaJIT'а нужно помочь с инструментами
аналитики.
Ссылки
О нашей реализации:
● http://bit.ly/iow-hl-2016
● http://bit.ly/iow-lim-2017-03
● http://bit.ly/sdcast-56
Инструменты аналитики:
● http://bit.ly/dumpanalyze
● http://bit.ly/cloudflare-loom
● http://bit.ly/luajit-web-inspector
● http://bit.ly/raptorjit-studio
Вопросы
asoldatov@iponweb.net
https://www.linkedin.com/in/antonsoldatov/

More Related Content

What's hot

Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)
Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)
Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)Ontico
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
 
Михаил Матросов, “С++ без new и delete”
Михаил Матросов, “С++ без new и delete”Михаил Матросов, “С++ без new и delete”
Михаил Матросов, “С++ без new и delete”Platonov Sergey
 
Язык программирования PascalABC.NET 2015. Новые возможности
Язык программирования PascalABC.NET 2015. Новые возможностиЯзык программирования PascalABC.NET 2015. Новые возможности
Язык программирования PascalABC.NET 2015. Новые возможностиМихалкович Станислав
 
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Ontico
 
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...Nikolay Grebenshikov
 
Как впихнуть утро в сосновом лесу в 4 килобайта. Иван Авдеев. UNIGINE Open Ai...
Как впихнуть утро в сосновом лесу в 4 килобайта. Иван Авдеев. UNIGINE Open Ai...Как впихнуть утро в сосновом лесу в 4 килобайта. Иван Авдеев. UNIGINE Open Ai...
Как впихнуть утро в сосновом лесу в 4 килобайта. Иван Авдеев. UNIGINE Open Ai...Unigine Corp.
 
Highload. Создание специализированных высокопроизводительных индексов
Highload. Создание специализированных высокопроизводительных индексовHighload. Создание специализированных высокопроизводительных индексов
Highload. Создание специализированных высокопроизводительных индексовAlexander Byndyu
 
«Карта в браузере: путь от спутникового снимка до пользователя» – Илья Тарату...
«Карта в браузере: путь от спутникового снимка до пользователя» – Илья Тарату...«Карта в браузере: путь от спутникового снимка до пользователя» – Илья Тарату...
«Карта в браузере: путь от спутникового снимка до пользователя» – Илья Тарату...2ГИС Технологии
 
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»Platonov Sergey
 
Haskell
HaskellHaskell
HaskellDevDay
 
Komarov borba za-miesto-urfu_2013
Komarov borba za-miesto-urfu_2013Komarov borba za-miesto-urfu_2013
Komarov borba za-miesto-urfu_2013Yandex
 
«Дорожная сеть в графовой базе данных Neo4j» — Вадим Шашенко, 2ГИС
«Дорожная сеть в графовой базе данных Neo4j» — Вадим Шашенко, 2ГИС«Дорожная сеть в графовой базе данных Neo4j» — Вадим Шашенко, 2ГИС
«Дорожная сеть в графовой базе данных Neo4j» — Вадим Шашенко, 2ГИС2ГИС Технологии
 

What's hot (16)

Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)
Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)
Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)
 
Lisp4web
Lisp4webLisp4web
Lisp4web
 
PascalABC.NET 2015-2016
PascalABC.NET 2015-2016PascalABC.NET 2015-2016
PascalABC.NET 2015-2016
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
 
Михаил Матросов, “С++ без new и delete”
Михаил Матросов, “С++ без new и delete”Михаил Матросов, “С++ без new и delete”
Михаил Матросов, “С++ без new и delete”
 
Язык программирования PascalABC.NET 2015. Новые возможности
Язык программирования PascalABC.NET 2015. Новые возможностиЯзык программирования PascalABC.NET 2015. Новые возможности
Язык программирования PascalABC.NET 2015. Новые возможности
 
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
 
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
 
Как впихнуть утро в сосновом лесу в 4 килобайта. Иван Авдеев. UNIGINE Open Ai...
Как впихнуть утро в сосновом лесу в 4 килобайта. Иван Авдеев. UNIGINE Open Ai...Как впихнуть утро в сосновом лесу в 4 килобайта. Иван Авдеев. UNIGINE Open Ai...
Как впихнуть утро в сосновом лесу в 4 килобайта. Иван Авдеев. UNIGINE Open Ai...
 
Highload. Создание специализированных высокопроизводительных индексов
Highload. Создание специализированных высокопроизводительных индексовHighload. Создание специализированных высокопроизводительных индексов
Highload. Создание специализированных высокопроизводительных индексов
 
«Карта в браузере: путь от спутникового снимка до пользователя» – Илья Тарату...
«Карта в браузере: путь от спутникового снимка до пользователя» – Илья Тарату...«Карта в браузере: путь от спутникового снимка до пользователя» – Илья Тарату...
«Карта в браузере: путь от спутникового снимка до пользователя» – Илья Тарату...
 
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
 
Haskell
HaskellHaskell
Haskell
 
OpenACC short review
OpenACC short reviewOpenACC short review
OpenACC short review
 
Komarov borba za-miesto-urfu_2013
Komarov borba za-miesto-urfu_2013Komarov borba za-miesto-urfu_2013
Komarov borba za-miesto-urfu_2013
 
«Дорожная сеть в графовой базе данных Neo4j» — Вадим Шашенко, 2ГИС
«Дорожная сеть в графовой базе данных Neo4j» — Вадим Шашенко, 2ГИС«Дорожная сеть в графовой базе данных Neo4j» — Вадим Шашенко, 2ГИС
«Дорожная сеть в графовой базе данных Neo4j» — Вадим Шашенко, 2ГИС
 

Similar to Тонкости работы трассирующего JIT-компилятора / Антон Солдатов (IPONWEB)

Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)Ontico
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMTech Talks @NSU
 
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...Badoo Development
 
MySQL: Есть ли жизнь после 1 млрд. записей.
MySQL: Есть ли жизнь после 1 млрд. записей.MySQL: Есть ли жизнь после 1 млрд. записей.
MySQL: Есть ли жизнь после 1 млрд. записей.MageCloud
 
"Распределенные" вычисления на мобильных платформах. Зачем еще нужен "металли...
"Распределенные" вычисления на мобильных платформах. Зачем еще нужен "металли..."Распределенные" вычисления на мобильных платформах. Зачем еще нужен "металли...
"Распределенные" вычисления на мобильных платформах. Зачем еще нужен "металли...Ontico
 
Tarantool, .net, newsql
Tarantool, .net, newsqlTarantool, .net, newsql
Tarantool, .net, newsqlAnatoly Popov
 
Урок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиУрок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиTatyanazaxarova
 
Back to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняBack to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняAlexander Granin
 
Haskell Lite - presentation for DevDay about Haskell language
Haskell Lite - presentation for DevDay about Haskell languageHaskell Lite - presentation for DevDay about Haskell language
Haskell Lite - presentation for DevDay about Haskell languageAlexander Granin
 
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...Ontico
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Yandex
 
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...Ontico
 
Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...Dmitri Soshnikov
 
Александр Сомов "C++: препроцессор, компилятор, компоновщик"
Александр Сомов "C++: препроцессор, компилятор, компоновщик"Александр Сомов "C++: препроцессор, компилятор, компоновщик"
Александр Сомов "C++: препроцессор, компилятор, компоновщик"Yandex
 
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Fwdays
 
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)Vadim Kosov
 
Низкоуровневая Оптимизация (Андрей Аксенов)
Низкоуровневая Оптимизация (Андрей Аксенов)Низкоуровневая Оптимизация (Андрей Аксенов)
Низкоуровневая Оптимизация (Андрей Аксенов)Ontico
 
20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1Michael Karpov
 

Similar to Тонкости работы трассирующего JIT-компилятора / Антон Солдатов (IPONWEB) (20)

Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
 
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
 
MySQL: Есть ли жизнь после 1 млрд. записей.
MySQL: Есть ли жизнь после 1 млрд. записей.MySQL: Есть ли жизнь после 1 млрд. записей.
MySQL: Есть ли жизнь после 1 млрд. записей.
 
"Распределенные" вычисления на мобильных платформах. Зачем еще нужен "металли...
"Распределенные" вычисления на мобильных платформах. Зачем еще нужен "металли..."Распределенные" вычисления на мобильных платформах. Зачем еще нужен "металли...
"Распределенные" вычисления на мобильных платформах. Зачем еще нужен "металли...
 
Tarantool, .net, newsql
Tarantool, .net, newsqlTarantool, .net, newsql
Tarantool, .net, newsql
 
Урок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиУрок 24. Фантомные ошибки
Урок 24. Фантомные ошибки
 
2014-11-01 02 Иван Зезюля. To go или не to go
2014-11-01 02 Иван Зезюля. To go или не to go2014-11-01 02 Иван Зезюля. To go или не to go
2014-11-01 02 Иван Зезюля. To go или не to go
 
Back to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняBack to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодня
 
Haskell Lite - presentation for DevDay about Haskell language
Haskell Lite - presentation for DevDay about Haskell languageHaskell Lite - presentation for DevDay about Haskell language
Haskell Lite - presentation for DevDay about Haskell language
 
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
 
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
 
Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...
 
Александр Сомов "C++: препроцессор, компилятор, компоновщик"
Александр Сомов "C++: препроцессор, компилятор, компоновщик"Александр Сомов "C++: препроцессор, компилятор, компоновщик"
Александр Сомов "C++: препроцессор, компилятор, компоновщик"
 
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
 
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
 
Cpp
CppCpp
Cpp
 
Низкоуровневая Оптимизация (Андрей Аксенов)
Низкоуровневая Оптимизация (Андрей Аксенов)Низкоуровневая Оптимизация (Андрей Аксенов)
Низкоуровневая Оптимизация (Андрей Аксенов)
 
20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1
 

More from Ontico

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...Ontico
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Ontico
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Ontico
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Ontico
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Ontico
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)Ontico
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Ontico
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Ontico
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)Ontico
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)Ontico
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Ontico
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Ontico
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Ontico
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Ontico
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)Ontico
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Ontico
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Ontico
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...Ontico
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Ontico
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Ontico
 

More from Ontico (20)

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
 

Тонкости работы трассирующего JIT-компилятора / Антон Солдатов (IPONWEB)

  • 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: Поддержка, работа над новой функциональностью
  • 4. Над чем работали (2015 – 2017 гг.)? ● "Проблема гигабайта"
  • 5. Над чем работали (2015 – 2017 гг.)? ● "Проблема гигабайта" ● Новая функция хэширования строк
  • 6. Над чем работали (2015 – 2017 гг.)? ● "Проблема гигабайта" ● Новая функция хэширования строк ● Тесты
  • 7. Над чем работали (2015 – 2017 гг.)? ● "Проблема гигабайта" ● Новая функция хэширования строк ● Тесты ● Неизменяемые объекты
  • 8. Над чем работали (2015 – 2017 гг.)? ● "Проблема гигабайта" ● Новая функция хэширования строк ● Тесты ● Неизменяемые объекты ● Завершение корутин по тайм-ауту
  • 9. Над чем работали (2015 – 2017 гг.)? ● "Проблема гигабайта" ● Новая функция хэширования строк ● Тесты ● Неизменяемые объекты ● Завершение корутин по тайм-ауту ● Профилировщик, новые утилиты
  • 10. Осень 2016 г. ● Решены самые насущные проблемы ● Первые миграции ● Задача – проанализировать работу JIT-компилятора
  • 11. ● Несколько проектов ● Сервер с выключенным компилятором ● Сервер с включенным компилятором Анализ производительности JIT-компилятора
  • 12.
  • 14.
  • 15.
  • 16. Какие были инструменты для анализа? ● Количественно: Graphite, скорость работы системы ● Качественно: luajit -jdump
  • 17. Какие были инструменты для анализа? ● Количественно: Graphite, скорость работы системы ● Качественно: luajit -jdump ● luajit-web-inspector ● loom ● studio (RaptorJIT) Что появилось за последний год?
  • 18. ---- TRACE 1 start (command line):1 0006 ADDVV 0 0 4 0007 FORL 1 => 0006 ---- TRACE 1 IR 0001 int SLOAD #2 CI 0002 > num SLOAD #1 T 0003 num CONV 0001 num.int 0004 + num ADD 0003 0002 0005 + int ADD 0001 +1 0006 > int LE 0005 +100 0007 ------ LOOP ------------ 0008 num CONV 0005 num.int 0009 + num ADD 0008 0004 0010 + int ADD 0005 +1 0011 > int LE 0010 +100 0012 int PHI 0005 0010 0013 num PHI 0004 0009 luajit -jdump ---- TRACE 1 mcode 76 12a0effac mov dword [0x000424a0], 0x1 12a0effb7 cvtsd2si ebp, [rdx+0x8] 12a0effbc cmp dword [rdx+0x4], 0xfffeffff 12a0effc3 jnb 0x12a0e0010 ->0 12a0effc9 xorps xmm7, xmm7 12a0effcc cvtsi2sd xmm7, ebp 12a0effd0 addsd xmm7, [rdx] 12a0effd4 add ebp, +0x01 12a0effd7 cmp ebp, +0x64 12a0effda jg 0x12a0e0014 ->1 ->LOOP: 12a0effe0 xorps xmm6, xmm6 12a0effe3 cvtsi2sd xmm6, ebp 12a0effe7 addsd xmm7, xmm6 12a0effeb add ebp, +0x01 12a0effee cmp ebp, +0x64 12a0efff1 jle 0x12a0effe0 ->LOOP 12a0efff3 jmp 0x12a0e001c ->3 ---- TRACE 1 stop -> loop
  • 19. Какова методика анализа? ● Сервер с продуктовой нагрузкой ● Включаем дампер на 10-15 минут ● Анализируем собранные данные
  • 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 скомпилированных трасс ● Неудачные попытки компиляции ● Дампы регистров при выходе из трассы Объем данных
  • 24. ● Переписали на C Решение
  • 25. ● Переписали на C ● Написали анализатор (совместим с LuaJIT) https://github.com/iponweb/dumpanalyze Решение
  • 26. ● Переписали на C ● Написали анализатор (совместим с LuaJIT) https://github.com/iponweb/dumpanalyze ● Сгруппированные "кусты" трасс ● Статистика по скомпилированным трассам ● Статистика по неудачным попыткам компиляции Решение
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32. Проблема №1: Большое число точек входа
  • 33. SSP Ромашка SSP Одуванчик SSP N Общая RTB-логика Архитектура приложения
  • 34. SSP Ромашка SSP Одуванчик SSP N Общая RTB-логика Как компилируется?
  • 35. SSP Ромашка SSP Одуванчик SSP N Общая RTB-логика Больше двухсот модулей
  • 36. Завершаем трассирование на выходе из общего модуля Решение
  • 37.
  • 39. local x = t.foo hash("foo") & (size - 1) size Доступ по ключу
  • 40. local x = t.foo hash("foo") & (size - 1) size Доступ по ключу
  • 41. local x = t.foo hash("foo") & (size - 1) size Доступ по ключу
  • 42. local x = t.foo hash("foo") & (size - 1) size Доступ по ключу
  • 43. local x = t.foo hash("foo") & (size2 - 1) size2 Доступ по ключу
  • 44. Если размер меняется – выходим из трассы
  • 45. local data = { {["prop1"] = "value-1", ["prop2"] = 42}, {["prop1"] = "value-2", ["prop2"] = 43}, {["prop1"] = "value-3", ["prop2"] = 44}, {["prop1"] = "value-4", ["prop2"] = 45}, {["prop1"] = "value-5", ["prop2"] = 46}, {["prop1"] = "value-6", ["prop2"] = 47}, {["prop1"] = "value-7", ["prop2"] = 48}, -- ... } Поток объектов похожей структуры
  • 46. ● Смартфон ● Приложение ● Геолокация ● Баннер ● Настольный ПК ● Сайт ● Do Not Track ● Видео ● Смартфон ● Сайт ● Do Not Track ● Аудио-ролик Поток объектов различной структуры
  • 49.
  • 50. Проблема №3: Выход боковых трасс из циклов
  • 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'а нужно помочь с инструментами аналитики.
  • 56. Ссылки О нашей реализации: ● http://bit.ly/iow-hl-2016 ● http://bit.ly/iow-lim-2017-03 ● http://bit.ly/sdcast-56 Инструменты аналитики: ● http://bit.ly/dumpanalyze ● http://bit.ly/cloudflare-loom ● http://bit.ly/luajit-web-inspector ● http://bit.ly/raptorjit-studio