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

Pingora:

Внедряването на Pingora намали броя на операциите за инсталиране на нови връзки 160 пъти и увеличи процента на повторно използвани заявки от 87.1% до 99.92%. Освен намалението на повторните връзки и по-ефективното използване на CPU ядрата, основно за повишаване на производителността на новия прокси допринесе премахването на бавните обработчици на Lua, използвани с nginx.
Езикът Rust е избран за постигане на висока производителност в съчетание с наличието на средства за сигурно управление на паметта. Споменава се, че въпреки високата квалификация на инженерите на Cloudflare и ревюирането на кода, написан на език C, не е било възможно да се избегнат грешки, довели до проблеми с паметта (например, уязвимост в парсера на HTML). Що се отнася до новия код, разказва се за случаи на разбивки в Pingora, които се оказаха причинени не от проблеми в приложението, а от грешка в ядро Linux и хардуерни неизправности.
Допълнително може да се отбележи коментарът на Линус Торвалдс относно включването на поддръжка на езика Rust в ядрото на Linux, произнесен на текущата конференция Open-Source Summit Europe. В ядрото 6.0 патчовете за разработка на драйвери на език Rust не бяха включени, но по думите на Линус те вероятно ще бъдат приети в ядрото 6.1, тъй като не възнамерява да забавя интеграцията. Като мотивация за добавяне на поддръжка на Rust, освен положителното влияние върху сигурността, Линус посочва и възможността да повиши интереса на новите участници в работата по ядрото, което е актуално в контекста на остаряването на старите участници.
Източник: opennet.ru
