Cloudflare перешёл с NGINX на собственный прокcи Pingora, написанный на языке Rust

Компания Cloudflare сообщила о переводе своей сети доставки контента на использование прокси Pingora, написанного на языке Rust. Новый прокси заменил конфигурацию на базе сервера NGINX с Lua-скриптами, и обрабатывает более триллиона запросов в день. Отмечается, что переход на специализированный прокси позволил не только реализовать новые возможности и увеличить защищённость за счёт безопасной работы с памятью, но и привёл к значительному повышению производительности и экономии ресурсов — решение на базе Pingora не требует использования Lua, поэтому потребляет на 70% меньше ресурсов CPU и на 67% меньше памяти при обработке того же объёма трафика.

Долгое время система для проксирования трафика между пользователями и конечными серверами на базе NGINX и Lua-скпритов удовлетворяла потребности Cloudflare, но с ростом сети и увеличения её сложности универсального решения оказалось недостаточно, как с точки зрения производительности, так и из-за ограничений в расширяемости и реализации новых возможностей для клиентов. В частности, возникли сложности в добавлении функциональности, выходящей за рамки простого шлюза и балансировщика нагрузки. Например, возникла необходимость в случае сбоя обработки запроса сервером повторно направлять запрос на другой сервер, снабжая его другим набором HTTP-заголовков.

Вместо архитектуры с разделением запросов по отдельным процессам-обработчикам (worker) в Pingora применена многопоточная модель, которая в сценариях использования Cloudflare (высокая концентрация трафика с разных сайтов при большом статистическом сдвиге) показала более эффективное распределение ресурсов между ядрами CPU. В частности, привязка несбалансированных запросов к процессам в nginx приводила к несбалансированной нагрузке на ядра CPU, в результате чего ресурсоёмкие запросы и блокирующий ввод-вывод замедляли обработку других запросов. Кроме того, привязка пула соединений к процессам-обработчикам не позволяла повторно использовать уже установленные соединения других процессов-обработчиков, что снижает эффективность работы при большом числе процессов-обработчиков.

NGINX:

Cloudflare перешёл с NGINX на собственный прокcи Pingora, написанный на языке Rust

Pingora:

Cloudflare перешёл с NGINX на собственный прокcи Pingora, написанный на языке Rust

Внедрение 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, кроме положительного влияния на безопасность, Линус называет и возможность повысить интерес к работе над ядром новых участников, что актуально в условиях старения старожилов.

Источник: opennet.ru