Заявка на июньскую встречу, 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
Хочу показать, как мерить такие вещи и не обманывать себя: прогрев, одинаковое число воркеров, сравнение соседних недель, а не «до праздников и после».
Минус пять миллисекунд. Ради этого стоило обновлять язык? Приду, но спорить буду)
Ставлю на 20 июня. Тимур, 15 минут строго, после тебя ещё armen_pet
Рассказал. Больше всего спрашивали, почему память снизилась, а не выросла, пришлось рисовать, как YJIT в 3.3 решает, что компилировать. Второй вопрос задал artem_67: сколько в итоге приходится на базу. Около 60 мс из общих 105, так что kostya.sokurov прав, дальше ускоряться надо в запросах, а не в JIT.