Компанія 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 підвищення продуктивності нового проксі, головним чином, сприяло звільнення від повільних обробників, що використовуються з nginx, мовою Lua.
Мова Rust обрана як дозволяє досягти високої продуктивності з поєднанням з наявністю засобів для забезпечення безпечної роботи з пам'яттю. Згадується, що незважаючи на високу кваліфікацію інженерів Cloudflare та рецензування коду в написаних мовою Сі не вдавалося уникнути помилок, що призводять до проблем із пам'яттю (наприклад, уразливість у парсері HTML). Що стосується нового коду, то розказано про випадки розбору збоїв у Pingora, які виявилися не проблемами в додатку, а помилкою в ядрі Linux і апаратними збоями.
Додатково можна відзначити, озвучений на конференції Open-Source Summit Europe, що проходить у ці дні, коментар Лінуса Торвальдса щодо включення підтримки мови Rust в ядро Linux. У ядро 6.0 патчі для розробки драйверів пристроїв на мові Rust не увійшли, але за словами Лінуса вони швидше за все будуть прийняті в ядро 6.1, тягти з інтеграцією він не збирається. Як мотив для додавання підтримки Rust, крім позитивного впливу на безпеку, Лінус називає можливість підвищити інтерес до роботи над ядром нових учасників, що актуально в умовах старіння старожилів.
Джерело: opennet.ru