Обещал цифры, приношу. Монолит на Rails 7.0, Ruby 3.2.2, Puma, 4 воркера по 5 потоков. Включили YJIT переменной окружения на половине серверов на неделю, трафик делится поровну. Проверка, что включилось:
$ RUBY_YJIT_ENABLE=1 ruby -v
ruby 3.2.2 (2023-03-30 revision e51014f9c0) +YJIT [x86_64-linux]
Время ответа приложения без учёта базы и внешних вызовов, считал по логам:
без YJIT с YJIT
p50 62 мс 49 мс
p95 310 мс 251 мс
CPU 58% 47%
RSS воркера 610 МБ 680 МБ
То есть около минус 20% по времени и плюс 70 МБ на воркер. Для нас это бесплатно, оставляем везде.
Двадцать процентов, и все радуются. На Go это отвечало бы за единицы миллисекунд. Ладно, бесплатные 20% лучше, чем никаких
По памяти совпадает с тем, что я видел: плюс 10-15% на процесс. Если сервера впритык по RAM, первые дни следите за OOM. И проверьте, что Ruby в образе собран с YJIT: для сборки нужен rustc, без него переменная просто молча ничего не делает. ruby -v с плюсом, как выше, это и показывает.
Покажу команде. Жду, когда это включат по умолчанию в самом Rails
а воркеры Sidekiq мерили? если джобы больше считают в Ruby, чем ждут базу, выигрыш там бывает даже больше, чем на вебе