Уведомления
Очистить всё

Заявка: Ruby 3.3 поверх YJIT, что дал сам апгрейд, цифры с прода

5 Сообщения
4 Пользователи
17 Реакции
397 Просмотры
TimurK62
Сообщения: 31
Автор темы
Читает чужие PR бэкенд-разработчик
Присоединился: 3 года назад
[#42]

Заявка на июньскую встречу, 15 минут. Осенью я приносил замеры YJIT на Ruby 3.2: минус 20% по времени и плюс 70 МБ на воркер. С тех пор монолит переехал на 3.3, и интересно стало другое: что дал сам апгрейд поверх уже включённого JIT. Та же нагрузка, та же половина серверов, по неделе на вариант. Медиана времени приложения без базы с 49 до 44 мс, p95 с 251 до 228, а RSS воркера, наоборот, снизился с 680 до 640 МБ: в 3.3 YJIT компилирует лениво и меньше тратит памяти на код, который почти не вызывается. Заодно поменяли способ включения: вместо переменной окружения в Dockerfile теперь инициализатор, так проще выключить JIT на одном сервере без пересборки образа.

# config/initializers/yjit.rb
if defined?(RubyVM::YJIT.enable) && ENV["DISABLE_YJIT"].nil?
  Rails.application.config.after_initialize do
    RubyVM::YJIT.enable
  end
end

Хочу показать, как мерить такие вещи и не обманывать себя: прогрев, одинаковое число воркеров, сравнение соседних недель, а не «до праздников и после».


4 ответа
artem_67
Сообщения: 18
Пишет тесты разработчик на Go
Присоединился: 4 года назад

Минус пять миллисекунд. Ради этого стоило обновлять язык? Приду, но спорить буду)


Ответ
1 ответ
kostya.sokurov
Присоединился: 4 года назад

Держит прод бэкенд-разработчик, senior
Сообщения: 73

Артём, пять миллисекунд и минус 40 МБ на каждом воркере за одно обновление версии, без единой строчки кода. Это очень хорошая сделка. Основное время там всё равно в базе, а не в интерпретаторе.


Ответ
viktor.petrov
Сообщения: 26
Читает чужие PR бэкенд-разработчик
Присоединился: 4 года назад

Ставлю на 20 июня. Тимур, 15 минут строго, после тебя ещё armen_pet


Ответ
TimurK62
Сообщения: 31
Автор темы
Читает чужие PR бэкенд-разработчик
Присоединился: 3 года назад

Рассказал. Больше всего спрашивали, почему память снизилась, а не выросла, пришлось рисовать, как YJIT в 3.3 решает, что компилировать. Второй вопрос задал artem_67: сколько в итоге приходится на базу. Около 60 мс из общих 105, так что kostya.sokurov прав, дальше ускоряться надо в запросах, а не в JIT.


Ответ