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