Rustls: Исследование постоянного бенчмаркинга


Что такое Rustls?

Rustls - это современная библиотека Transport Layer Security (TLS), написанная на Rust, с целью замены альтернатив, не обеспечивающих безопасность памяти, таких как OpenSSL. Протокол TLS используется для обеспечения безопасного обмена данными, обычно между веб-сервером и клиентом. TLS ранее назывался Secure Socket Layer (SSL). Он гарантирует, что передаваемые между двумя сторонами данные зашифрованы и защищены от перехвата или подделки. Поэтому важно, чтобы библиотека TLS, такая как Rustls, была быстра и безопасна.

🐰 Буква s в https означает, что вы используете TLS для просмотра этой страницы!

Бенчмаркинг Rustls

Первый коммит в проекте Rustls был сделан его создателем Джозефом Бирр-Пикстоном 02 мая 2016 года. Прежде чем первое успешное TLS соединение было установлено, прошло до 27го числа того же месяца. К сентябрю он уже проводил бенчмаркинг Rustls. Существенно улучшив производительность, он провел сравнительный анализ производительности Rustls и OpenSSL в июле 2019 года.

Результаты этого сравнения были следующими:

  • Rustls быстрее отправлял данные на 15%.
  • Rustls быстрее принимал данные на 5%.
  • Rustls на 20-40% быстрее настраивал клиентское соединение.
  • Rustls на 10% быстрее настраивал серверное соединение.
  • Rustls на 30-70% быстрее возобновлял клиентское соединение.
  • Rustls на 10-20% быстрее возобновлял серверное соединение.
  • Rustls использовал в два раза меньше памяти, чем OpenSSL.

В 2023 году Internet Security Research Group финансировала бенчмаркинг производительности проекта Rustls, что привело к обновленному сравнительному анализу производительности Rustls и OpenSSL. Хотя эти обновленные результаты были полезны для проекта Rustls и в отношении сильных сторон, и в отношении того, что нужно улучшить, самым большим вопросом производительности теперь является гарантия того, что новый код не приведет к снижению производительности.

Непрерывное тестирование производительности для Rustls

С целью выявления и устранения проблем производительности до их релиза, проект Rustls решил внедрить непрерывное тестирование производительности.

Непрерывное тестирование производительности - это практика разработки программного обеспечения, когда каждый член команды регулярно проводит тесты, обычно каждый член команды проводит такие тесты как минимум ежедневно, что приводит к проведению нескольких тестов в день. Каждое тестирование проверяется автоматизированной сборкой для обнаружения проблем производительности как можно быстрее. Многие команды обнаруживают, что этот подход значительно сокращает количество проблем с производительностью и позволяет команде быстрее разрабатывать производительное программное обеспечение.

Решение проекта Rustls для непрерывного тестирование производительности состоит из двух основных компонентов:

  • CI Bench: Специально разработанное тестовое оборудование для проведения бенчмарков в CI
  • Bench Runner: Кастомный сервер для непрерывного тестирования производительности с минимальной конфигурацией и сопутствующее GitHub приложение

Бенчмарк Rustls CI

CI Bench - это передовой инструмент для непрерывного бенчмаркинга. Он запускает один и тот же бенчмарк в двух разных режимах: режиме подсчета инструкций и режиме реального времени. Это достигается с помощью гениальной пользовательской асинхронной среды выполнения. В режиме подсчета инструкций ввод/вывод все еще блокируется. Под капотом задачи просто завершаются за одну итерацию. Затем, в режиме реального времени, ввод/вывод действительно неблокирующий. Это позволяет симулировать общие буферы в памяти. Сервер и клиент опрашиваются по очереди. Это позволяет CI Bench устранить шум и недетерминированность асинхронной среды выполнения в их бенчмарках.

Rustls решил отслеживать инструкции процессора с использованием cachegrind. Это решение было смоделировано на основе решения для непрерывного бенчмаркинга компилятора Rust. Подсчеты инструкций предоставляют очень последовательный способ сравнения двух версий одного и того же программного обеспечения. Это делает его идеальным для непрерывного бенчмаркинга. Однако, невозможно вывести реальные затраты времени выполнения от увеличения количества инструкций. Увеличение инструкций на 10% не обязательно приводит к увеличению производительности на 10%. Но значительное увеличение инструкций, скорее всего, означает, что есть некоторое увеличение производительности. По этой причине, CI Bench также измеряет время выполнения.

Время выполнения - это то, что действительно важно для проекта Rustls. Измерение количества инструкций - это просто полезный промежуточный этап. Бенчмаркинг, основанный на подсчете инструкций, не может различить изменения, которые используют одинаковое количество инструкций, но приводят к совершенно разной производительности в реальном времени. Например, новый алгоритм может иметь точно такое же количество инструкций, но работать в два раза медленнее.

Rustls Bench Runner

Rustls Bench Runner - это специальный сервер для непрерывного бенчмаркинга. Он предназначен для работы на хосте с «голым металлом», и получает события от сопутствующего приложения GitHub через веб-хуки. При каждой загрузке в главную ветку main, Bench Runner запускает бенчмаркинги для подсчета инструкций и времени на стене. Результаты сохраняются локально и отправляются в проект Rustls на Bencher с использованием API Bencher.

Когда одобряется запрос на слияние или когда один из разработчиков Rustls оставляет комментарий, содержащий @rustls-benchmarking bench, запускается набор тестов на производительность. Bench Runner получает веб-хук от GitHub, загружает код для запроса на слияние, запускает тесты на подсчет инструкций, запускает тесты на время работы, сравнивает результаты запроса на слияние с результатами целевой ветки main, и затем публикует результаты в виде комментария к запросу на слияние. Bench Runner использует модель Delta Interquartile Range в качестве статистического порога для определения наличия регрессии производительности. Результаты, превышающие этот порог, выделяются в комментарии к запросу на слияние.

Сервер Bare Metal

Для получения разрешения 1% в своих бенчмарках по времени работы на стене, проект Rustls инвестировал в специально настроенный сервер bare metal для непрерывного бенчмарка. В отличие от большинства современных CI-раннеров, этот сервер не является эфемерным. То есть, для каждого запуска используется одно и то же основное оборудование сервера и операционная система. Виртуализация отсутствует.

Сервер bare metal был специально настроен для создания наиболее стабильных результатов. Масштабирование частоты (TurboBoost от Intel) и одновременная многопоточность (Hyper-Threading от Intel) оба были отключены в BIOS. Масштабирование CPU установлено на performance. Случайное расположение в пространстве адресов (ASLR) и сторожевой таймер неотключаемого прерывания (NMI) оба отключены установкой kernel.randomize_va_space=0 и kernel.nmi_watchdog=0 в sysctl.conf, соответственно. Сервер bare metal размещен в OHVcloud.

Витрина Трофеев

  • PR #1640: Одно из первых применений интеграции с непрерывным бенчмаркингом Rustls для оценки перехода от write_vectored к write. Это изменение улучшило бенчмарки передачи в направлении отправки Rustls почти на 20% в некоторых случаях.
  • PR #1730: Обнаружены регрессии производительности при случайном изменении порядка расширений TLS ClientHello. Это привело к еще одной итерации разработки и использованию более эффективного подхода.
  • PR #1834: Помог быстро подтвердить, что критическое исправление безопасности не вызвало регрессии производительности. Это позволило команде сосредоточиться на быстром выпуске нескольких версий с исправлением безопасности.

Заключение

Основываясь на основе, заложенной создателем проекта, Адольфо Очагавиа разработал впечатляющее решение для непрерывного бенчмаркинга проекта Rustls. Это включает в себя специализированный инструмент для бенчмарка, который выполняет как бенчмаркинг по числу инструкций, так и по времени стены для одного и того же теста, специализированный запускатель бенчмарка, специализированное приложение GitHub и специализированный, выделенный сервер. Это одно из наиболее впечатляющих специфических для проекта решений для непрерывного бенчмаркинга. Если у вашего проекта есть время и ресурсы для создания и поддержки собственного решения для непрерывного бенчмаркинга, проект Rustls устанавливает высокую планку для целей.

Очень специальное благодарство Адольфо Очагавиа за проверку этого кейса. Его блог посты о непрерывном бенчмаркинге для Rustls и производительность Rustls были основой для его содержания.

Bencher: Непрерывное тестирование производительности

🐰 Bencher

Bencher - это набор инструментов для непрерывного тестирования производительности. Когда-нибудь регрессия производительности влияла на ваших пользователей? Bencher мог бы предотвратить это. Bencher позволяет вам обнаруживать и предотвращать регрессии производительности до того, как они попадут в продакшн.

  • Запустить: Запустите свои тесты производительности локально или в CI, используя ваши любимые инструменты для этого. CLI bencher просто оборачивает ваш существующий аппарат тестирования и сохраняет его результаты.
  • Отслеживать: Отслеживайте результаты ваших тестов производительности со временем. Мониторите, запрашивайте и строите графики результатов с помощью веб-консоли Bencher на основе ветки исходного кода, испытательного стенда и меры.
  • Поймать: Отлавливайте регрессии производительности в CI. Bencher использует инструменты аналитики, работающие по последнему слову техники, чтобы обнаружить регрессии производительности, прежде чем они попадут в продакшн.

По тем же причинам, по которым модульные тесты запускаются в CI, чтобы предотвратить регрессии функций, тесты производительности должны быть запущены в CI с Bencher, чтобы предотвратить регрессии производительности. Ошибки производительности – это тоже ошибки!

Начните отлавливать регрессии производительности в CI — попробуйте Bencher Cloud бесплатно.

🤖 Этот документ был автоматически создан OpenAI GPT-4. Оно может быть неточным и содержать ошибки. Если вы обнаружите какие-либо ошибки, откройте проблему на GitHub.