Компания Cloudflare сообщила о переводе своей сети доставки контента на использование прокси Pingora, написанного на языке Rust. Новый прокси заменил конфигурацию на базе сервера NGINX и обрабатывает более триллиона запросов в день. Отмечается, что переход на специализированный прокси позволил не только реализовать новые возможности и увеличить защищённость за счёт безопасной работы с памятью, но и привёл к значительному повышению производительности и экономии ресурсов – решение на базе Pingora потребляет на 70% меньше ресурсов CPU и на 67% меньше памяти при обработке того же объёма трафика.
Долгое время система для проксирования трафика между пользователями и конечными серверами на базе NGINX удовлетворяла потребности Cloudflare, но с ростом сети и увеличения её сложности универсального решения оказалось недостаточно, как с точки зрения производительности, так и из-за ограничений в расширяемости и реализации новых возможностей для клиентов. В частности, возникли сложности в добавлении функциональности, выходящей за рамки простого шлюза и балансировщика нагрузки. Например, возникла необходимость в случае сбоя обработки запроса сервером повторно направлять запрос на другой сервер, снабжая его другим набором HTTP-заголовков.
Вместо архитектуры с разделением запросов по отдельным процессам-обработчикам (worker) в Pingora применена многопоточная модель, которая показала более эффективное распределение ресурсов между ядрами CPU (привязка запросов к процессам в nginx приводила к несбалансированной нагрузке на ядра CPU, в результате чего ресурсоёмкие запросы и блокирующий ввод-вывод замедляли обработку других запросов). Кроме того, привязка пула соединений к процессам-обработчикам не позволяла добиться полноценного повторного использования уже установленных сервером соединений (в nginx повторно используются соединения только в рамках текущего процесса-обработчика, что снижает эффективность работы при большом числе процессов-обработчиков).
NGINX:
![](https://www.opennet.ru/opennews/pics_base/CFD0C5CECEC5D4_1663312302.png)
Pingora:
![](https://www.opennet.ru/opennews/pics_base/CFD0C5CECEC5D4_1663312290.png)
Внедрение Pingora позволило в 160 раз сократить число операций установки новых соединений и повысить долю повторно используемых запросов с 87.1% до 99.92%. Кроме сокращения повторных соединений и более эффективного использования ядер CPU повышению производительности нового прокси также способствовало избавление от используемых с nginx медленных обработчиков на языке Lua.
Язык Rust выбран как позволяющий добиться высокой производительности с сочетании с наличием средств для обеспечения безопасной работы с памятью. Упоминается, что несмотря на высокую квалификацию инженеров Cloudflare и рецензирование кода в написанных на языке Си не удавалось избежать ошибок, приводящих к проблемам с памятью (например, уязвимость в парсере HTML). Что касается нового кода, то рассказано о случаях разбора сбоев в Pingora, которые оказались вызваны не проблемами в приложении, а ошибкой в ядре Linux и аппаратными сбоями.
Дополнительно можно отметить, озвученный на проходящей в эти дни конференции Open-Source Summit Europe комментарий Линуса Торвальдсва насчёт включения поддержки языка Rust в ядро Linux. В ядро 6.0 патчи для разработки драйверов устройств на языке Rust не вошли, но по словам Линуса они скорее всего будут приняты в ядро 6.1, тянуть с интеграцией он не собирается. В качестве мотива для добавления поддержки Rust, кроме положительного влияния на безопасность, Линус называет и возможность повысить интерес к работе над ядром новых участников, что актуально в условиях старения старожил.