Rustls: Исследование постоянного бенчмаркинга
Everett Pompeii
Что такое 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 позволяет вам обнаруживать и предотвращать регрессии производительности до того, как они попадут в продакшн.
- Запустить: Запустите свои тесты производительности локально или в CI, используя ваши любимые инструменты для этого. CLI
bencher
просто оборачивает ваш существующий аппарат тестирования и сохраняет его результаты. - Отслеживать: Отслеживайте результаты ваших тестов производительности со временем. Мониторите, запрашивайте и строите графики результатов с помощью веб-консоли Bencher на основе ветки исходного кода, испытательного стенда и меры.
- Поймать: Отлавливайте регрессии производительности в CI. Bencher использует инструменты аналитики, работающие по последнему слову техники, чтобы обнаружить регрессии производительности, прежде чем они попадут в продакшн.
По тем же причинам, по которым модульные тесты запускаются в CI, чтобы предотвратить регрессии функций, тесты производительности должны быть запущены в CI с Bencher, чтобы предотвратить регрессии производительности. Ошибки производительности – это тоже ошибки!
Начните отлавливать регрессии производительности в CI — попробуйте Bencher Cloud бесплатно.