Тестирование REST API на Golang. 56000 [#/sec] не предел?
На глаза попалась не особо позитивное сравнение Java vs GO. Тестирование большим числом пользователей.
Решил сам проверить, действительно ли так все не радужно с Go.
Забегая вперед скажу, что при кэшировании в памяти и формировании JSON «на лету» удалось получить до 56000 [#/sec] на 4 физических ядра.
И не одного Failed requests вплоть до 4096 одновременных подключений.
Базовый сценарий GET запроса:
- Если данные найдены в in memory кэше и они валидные, то формируем JSON из структуры
- Если данных в кэше нет, то ищем их в Bolt DB, если находим, то считываем готовый JSON
- Если данных нет в Bolt DB, то запрашиваем их из БД, сохраняем их в in memory кэше
- Данные в in memory кэше накапливаются в буферном канале, после накопления около 10000 элементов они сбрасываются единым save в Bolt DB
- Если данные в БД менялись (update / insert) то через pg_notify передавается уведомление и данные в кэше помечались как невалидные и при следующем обращении они считывались заново из БД
Под катом результаты тестирования, так же доступные по ссылке
Кому интересен код тестового стенда — добро пожаловать на GitHub.
Кода много около 4000 строк, но ни чего супер интересного использовано не было.
Единственно, разве что кастомный JSON encoder/decode — это ускорило формирование JSON примерно в 2 раза.
Результаты тестирования
Параметры стенда для тестирования:
- БД PostgreSQL 11 под Windows 10
- Два таблицы — мастер до 10 000 000 строк, подчиненная таблица 100 000 000 строк
- Размер JSON сообщения 1500 байт, формируется из 1 мастер строки и 10 подчиненных строк
- компьютер — core i7 — 4 core (8 thread), 16 Гбайт оперативка, HDD / SSD диск
- Тестирование велось через ApacheBench, concurrency level от 1 до 4096, 1 000 000 запросов со случайными образом
В ходе тестирования проверялись следующие граничные случаи:
- GET с прямым доступом к PostgreSQL (при каждом запросе идет чтение БД, JSON формируется из структуры)
- GET с кэширование в BOLT DB (JSON предварительно сохранен в BOLT DB)
- GET с кэшированием структуры в памяти (JSON формируется из структуры)
Падение показателей при росте Concurrency Level связано с тем, что ApacheBench запускался на том же компьютере и активно «отъедал процессорное время».
