На глаза попалась не особо позитивное сравнение 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 запускался на том же компьютере и активно "отъедал процессорное время".
GET с прямым доступом к PostgreSQL SSD (при каждом запросе идет чтение БД)
| Concurrency Level | Requests per second | Time per req. | 99% percentile |
|---|---|---|---|
| 1 | 713.82 [#/sec] (mean) | 1.401 [ms] (mean) | 2 [ms] |
| 2 | 1914.61 [#/sec] (mean) | 1.045 [ms] (mean) | 2 [ms] |
| 4 | 3326.52 [#/sec] (mean) | 1.202 [ms] (mean) | 2 [ms] |
| 8 | 4599.95 [#/sec] (mean) | 1.739 [ms] (mean) | 4 [ms] |
| 16 | 4599.80 [#/sec] (mean) | 3.478 [ms] (mean) | 9 [ms] |
| 128 | 5243.76 [#/sec] (mean) | 24.410 [ms] (mean) | 102 [ms] |
| 512 | 5354.35 [#/sec] (mean) | 95.623 [ms] (mean) | 506 [ms] |
| 2048 | 5285.83 [#/sec] (mean) | 387.451 [ms] (mean) | 2871 [ms] |
GET с кэширование в BOLT DB (JSON предварительно сохранен в BOLT DB)
| Concurrency Level | Requests per second | Time per req. | 99% percentile |
|---|---|---|---|
| 1 | 3411.07 [#/sec] (mean) | 0.293 [ms] (mean) | 1 [ms] |
| 2 | 7468.21 [#/sec] (mean) | 0.268 [ms] (mean) | 1 [ms] |
| 4 | 9501.15 [#/sec] (mean) | 0.421 [ms] (mean) | 2 [ms] |
| 8 | 10481.68 [#/sec] (mean) | 0.763 [ms] (mean) | 3 [ms] |
| 16 | 10052.14 [#/sec] (mean) | 1.592 [ms] (mean) | 5 [ms] |
| 128 | 10754.02 [#/sec] (mean) | 11.903 [ms] (mean) | 20 [ms] |
| 512 | 11030.61 [#/sec] (mean) | 46.416 [ms] (mean) | 66 [ms] |
| 2048 | 10634.72 [#/sec] (mean) | 192.577 [ms] (mean) | 362 [ms] |
| 4096 | 10659.04 [#/sec] (mean) | 384.275 [ms] (mean) | 720 [ms] |
GET с кэшированием структуры в памяти
| Concurrency Level | Requests per second | Time per req. | 99% percentile |
|---|---|---|---|
| 1 | 9178.22 [#/sec] (mean) | 0.109 [ms] (mean) | 1 [ms] |
| 2 | 22580.40 [#/sec] (mean) | 0.089 [ms] (mean) | 1 [ms] |
| 4 | 36163.33 [#/sec] (mean) | 0.111 [ms] (mean) | 1 [ms] |
| 8 | 56109.17 [#/sec] (mean) | 0.143 [ms] (mean) | 1 [ms] |
| 16 | 43942.75 [#/sec] (mean) | 0.364 [ms] (mean) | 2 [ms] |
| 128 | 55005.53 [#/sec] (mean) | 2.327 [ms] (mean) | 6 [ms] |
| 512 | 35338.01 [#/sec] (mean) | 14.489 [ms] (mean) | 25 [ms] |
| 2048 | 38090.35 [#/sec] (mean) | 53.767 [ms] (mean) | 228 [ms] |
| 4096 | 30196.47 [#/sec] (mean) | 135.645 [ms] (mean) | 609 [ms] |
ссылка на оригинал статьи https://habr.com/ru/post/488948/
Добавить комментарий