Разработчики провели нагрузочные тесты и выявили значительные задержки при записи данных в Kafka, что приводило к накоплению лага.
Я подключился к анализу причин низкой производительности.
Сильно упрощенный флоу:
- приложение пишет в Kafka (кластер на виртуальных машинах);
- Kafka работает в режиме
acks=all
и не поспевает за потоком событий; - на приложении копится очередь на запись.
Прежде чем детально разбираться с Kafka, я бегло проверил сетевые ресурсы и состояние машин. Аномалий выявлено не было.
Окей, пошли к брокеру.
Лаг при асихронных коммитах почти отсутствовал (см. acks=1
выше), поэтому мне в первую очередь было интересно, что ограничивает скорость фолловеров кластера.
Дашборд показывал накопление очередей к network threads
- эти ребята отвечают за обработку входящих/исходящих запросов:
В интернетах советовали увеличить количество тредов, но вопрос медленной записи оставался открытым.
Анализ состояния тредов (см. TSA) не подтвердил гипотезу ожидания — большую часть времени потоки проводили на CPU.
А вот флеймграф использования процессора (спасибо А. Пангин за async-profiler) дал зацепку - до 36% всего CPU уходило на операции с SSL шифрованием:
К оптимизации работы с SSL можно подходить с разных сторон:
- аппаратная поддержка шифрования;
- оптимизация цепочек сертификатов;
- использование сессий и кеширования;
- выбор алгоритмов и библиотек;
- …
Но для начала я провел несколько тестов производительности алгоритма AES (он занимал до 32% времени CPU):
- гипервизор одной из kafka машин:
$ openssl speed -evp aes-256-gcm
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes 16384 bytes
aes-256-gcm 386715.46k 1106963.22k 2161413.00k 3272084.76k 4036008.72k 4165596.14k
- рандомная виртуальная машина:
$ openssl speed -evp aes-256-gcm
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes 16384 bytes
aes-256-gcm 386344.52k 1082957.51k 2009377.84k 3003345.30k 3602678.31k 3649463.55k
- одна из машин кластера Kafka:
openssl speed -evp aes-256-gcm
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes 16384 bytes
aes-256-gcm 107798.70k 133547.52k 138563.93k 139041.45k 137524.57k 137461.76k
Ха, наш подопотный работает на порядок медленее!
Такое отставание можно объяснить только проблемой в аппаратной части.
Так и оказалось – у CPU машин кластера отсутствовали флаги аппаратного шифрования - aes
, pclmulqdq
, sha
.
Проверить их наличие можно утилитой
lscpu
На виртуальных машинах изменили тип процессора с KVM
на host
, и флаги для аппаратного шифрования стали доступны в полном объеме.
Новые нагрузочные тесты были более приветливыми:
Объем SSL операций упал с 36% до 9%
Среднее время коммита в kafka снизилось вдвое
до
после
Достигнутую скорость нельзя назвать идеальной, поэтому работы по оптимизации продолжаются.
To be continued!