История одного бага в Leaf

Этот сайт работает на Vapor — серверном фреймворке для Swift. Он довольно старый, популярный и известный.

Я использую его уже несколько лет, и мне всегда нравилось, что он быстрый и не требует много памяти на сервере.

Я поддерживаю все зависимости в актуальном состоянии. Но недавно я заметил, что сайт начал потреблять слишком много памяти. Использование начинается примерно с 20 МБ, но спустя несколько недель я обнаружил, что на сервере оно разрослось до 750 МБ.

Для такого простого сайта это очень много, поэтому я начал копать. Изучив код сайта (который я долгое время не менял), я не смог найти никаких проблем (как и AI-агенты).

Для рендеринга HTML я использую Leaf — шаблонизатор от команды Vapor. И в их репозитории на GitHub как раз был открытый тикет, описывающий точно такую же проблему.

Поэтому я попросил Copilot помочь мне разобраться, в чем дело. Он довольно быстро добавил в мой форк новые тесты, которые выполняли множество рендерингов в цикле. И утилита leak обнаружила циклы сильных ссылок (retain cycles). Я исправил это с помощью аннотации weak, но во время проверки моего PR мейнтейнер предложил просто использовать unowned.

И вот и всё. 2 строки кода исправили рост потребления памяти. Трудно поверить, но спустя несколько часов после деплоя сайт всё еще потребляет всего 2 МБ памяти. Так что сегодня я очень собой горжусь.

Мораль: вносите вклад в Open Source проекты, которыми вы пользуетесь.