Ближайшая конференция — C++ Russia 2025, 20—21 марта, Москва + online. Подробности и билеты:
— — Скачать презентацию с сайта C++ Russia —
Повышение производительности сервера обычно включает достижение следующих целей: снижение задержки (latency), увеличение количества запросов в секунду (RPS) и снижение нагрузки на CPU и память. Этих целей можно достичь путем архитектурных изменений, таких как уменьшение количества походов по сети, горизонтальное и вертикальное масштабирование и т. д. Однако этот доклад о другом — о коде. Владислав классифицировал основные источники деградации производительности кода на три группы: 1. Конкуренция потоков. Например, перегретые мьютексы, чрезмерно строгий порядок (memory order) в lock-free операциях, false sharing. 2. Чрезмерная нагрузка на кучу (heap). Потери возникают из-за частого выделения и освобождения больших объектов и отсутствия встроенных (intrusive) контейнеров. 3. Сетевой ввод-вывод. Чтение и запись в сокеты дороги, так как это системные вызовы (system calls). Кроме того, они могут блокировать поток на длительное время, что приводит к приемам вроде добавления десятков или сотен дополнительных потоков. Такие меры усиливают конкуренцию (concurrency), а также нагрузку на CPU и память, при этом игнорируя основную проблему. Спикер представил серию кратких и простых низкоуровневых рецептов того, как достичь производительности за счет оптимизации кода. Несмотря на то, что для этого обычно требуются совсем точечные изменения, они могут ускорить код в N раз. Предложения направлены на устранение проблем мест из списка выше. Предлагаемые оптимизации могут сделать архитектурные изменения ненужными или даже позволить упростить всю систему, если существующие серверы начнут легко справляться с нагрузкой. Кроме того, изменения могут сделать код более чистым и выявить больше узких мест для дальнейшего исследования.