Перейти к содержимому
GitRiverGitRiver
EN
Навигация

Нагрузочный замер GitRiver

Сколько памяти занимает GitRiver, какую нагрузку держит один узел и где наступает насыщение — числа получены прогоном на выделенной машине

Каждое число здесь получено прогоном на указанном ниже железе, а не оценкой: стенд поднимает установку, засевает её данными, перечисленными ниже, и гонит сценарии до насыщения.

Обстановка замера

Параметр Значение
Версия GitRiver 1.1.0
Дата прогона 2026-09-17
Процессор Intel(R) Xeon(R) CPU E5-2667 v4 @ 3.20GHz (16 потоков)
Оперативная память 94 ГБ
Носитель NVMe SSD, btrfs
Ядро Linux 7.2.4
PostgreSQL 18.6
Профиль сборки release
Условия прогона машина выделена под замер: посторонняя нагрузка остановлена
Размер бинарника сервера 57.2 МБ

Засев:

Сущность Количество
Пользователи 1 000
Репозитории 10 000
Задачи 100 000
Записи ленты 100 000
Запросы на слияние 100 000
Рецензии 200 000
Запросы рецензий 100 000
Назначенные в запросах 100 000
Каталог репозиториев (на диске) 1.45 ГБ
База данных 247.2 МБ

Клиент нагрузки и сервер работают на одной машине: сеть из замера исключена, но процессорное время они делят. Предел частоты запросов на время прогона снят — иначе на пишущих сценариях меряется не сервер, а счётчик ограничителя.

Память при простое

Сервер запущен с засеянной базой, фоновые задачи работают, запросов нет. После старта выждано 30 с, затем 60 с замера; в таблицу идёт максимум за окно, а не удачное мгновение.

Показатель Значение
Резидентная память при простое 45.8 МБ
Размер бинарника 57.2 МБ

Сводка по сценариям

Для каждого сценария взята точка лестницы с наибольшей пропускной способностью среди прогонов без единого отказа — то есть режим до срыва, а не после него. Полные лестницы — ниже.

Сценарий Вызов Паралл. Вызовов/с p50, мс p95, мс p99, мс Ошибок Память, макс
Витрина репозиториев GET /api/v1/explore 128 9821.75 12.87 16.76 18.9 0 71.1 МБ
Карточка репозитория GET /api/v1/repos/{owner}/{name} 128 17554.9 7.23 10.18 11.86 0 71.5 МБ
Список задач GET /api/v1/repos/{owner}/{name}/issues 64 12657.5 4.91 7.54 9.31 0 67.2 МБ
Список запросов репозитория GET /api/v1/repos/{owner}/{name}/pull_requests 64 7602.8 8.29 10.51 11.93 0 280.9 МБ
Лента активности GET /api/v1/activity 16 654.7 24.15 27.59 29.75 0 202.7 МБ
Сводка рабочего стола GET /api/v1/dashboard/stats 64 6719.45 9.42 11.26 12.33 0 300.4 МБ
Мои запросы GET /api/v1/dashboard/prs 64 5876.8 10.68 14.24 16.2 0 261.1 МБ
Запросы на рецензию GET /api/v1/dashboard/review-prs 64 2664.35 23.64 30.17 33.9 0 225.2 МБ
Поиск по коду GET /api/v1/search/code 8 54.2 145.16 177.7 195.68 0 187.4 МБ
Создание задачи POST /api/v1/repos/{owner}/{name}/issues 64 3136.55 16.2 59.41 105.9 0 318.9 МБ
Клонирование (git clone) git clone http://…/{owner}/{name} 16 123.85 129.08 146.56 156.25 0 51.0 МБ
Отправка (git push) git push http://…/{owner}/{name} 16 120.35 131.72 164.75 180.27 0 208.1 МБ

Отклик при одном клиенте

Нижняя точка каждой лестницы: один клиент, очереди нет. Это цена самого вызова — столько ждёт человек, открывший страницу на незанятом узле.

Перед лестницей каждого сценария идёт отдельный разогревочный проход, результат которого выбрасывается: иначе нижняя точка мерила бы первое чтение с диска, а не сервер.

Сценарий p50, мс p95, мс p99, мс Вызовов/с
Витрина репозиториев 2.48 2.68 3.09 418.55
Карточка репозитория 1.22 1.4 1.51 838.2
Список задач 1.86 2.24 2.37 546.55
Список запросов репозитория 2.79 3.16 3.36 366.5
Лента активности 22.05 24.28 25.28 45.4
Сводка рабочего стола 2.43 2.8 2.97 422.55
Мои запросы 3.61 3.91 4.46 287.9
Запросы на рецензию 5.95 7.33 8 169.4
Поиск по коду 25.58 27.56 28.97 38.95
Создание задачи 2.79 4.12 4.81 319.35
Клонирование (git clone) 43.16 47.58 50.5 23.35
Отправка (git push) 58.56 95.36 105.07 13.85

Поведение при насыщении

Каждый сценарий прогнан на нескольких уровнях параллельности. Пока пропускная способность растёт, сервер не насыщен; излом кривой и одновременный рост p99 — точка насыщения. Оси логарифмические.

Пропускная способность

Задержка p99

Память под нагрузкой

Витрина репозиториев

Паралл. Вызовов/с p50, мс p95, мс p99, мс макс, мс Ошибок ЦП, % ядра Память, макс
1 418.55 2.48 2.68 3.09 5 0 39.7 43.0 МБ
4 1431.9 2.81 3.69 4.13 10.54 0 145.95 46.7 МБ
16 8391.4 1.84 2.69 3.14 10.13 0 480.55 58.0 МБ
64 9812.5 6.34 9.86 11.74 21 0 580.4 64.6 МБ
128 9821.75 12.87 16.76 18.9 29.73 0 587.55 71.1 МБ

Карточка репозитория

Паралл. Вызовов/с p50, мс p95, мс p99, мс макс, мс Ошибок ЦП, % ядра Память, макс
1 838.2 1.22 1.4 1.51 4.88 0 58.9 44.8 МБ
4 2745.35 1.45 1.97 2.2 7.16 0 230.95 47.2 МБ
16 14554.65 1.06 1.53 1.84 5.63 0 695.8 61.1 МБ
64 17247.5 3.65 5.44 6.42 14.7 0 870.9 66.7 МБ
128 17554.9 7.23 10.18 11.86 22.66 0 899.7 71.5 МБ

Список задач

Паралл. Вызовов/с p50, мс p95, мс p99, мс макс, мс Ошибок ЦП, % ядра Память, макс
1 546.55 1.86 2.24 2.37 4.22 0 57 45.2 МБ
4 1909.85 2.09 2.83 3.2 13.95 0 215.95 47.4 МБ
16 11096.6 1.39 1.98 2.37 9.03 0 672.4 61.4 МБ
64 12657.5 4.91 7.54 9.31 18.43 0 808.9 67.2 МБ
128 12408.8 9.93 15.2 19.46 27.94 0 808.7 73.4 МБ

Список запросов репозитория

Паралл. Вызовов/с p50, мс p95, мс p99, мс макс, мс Ошибок ЦП, % ядра Память, макс
1 366.5 2.79 3.16 3.36 9.71 0 63.1 45.9 МБ
4 1457.05 2.78 3.6 3.97 7.18 0 241.8 104.4 МБ
16 6916.15 2.26 3.02 3.46 6.78 0 563.65 205.6 МБ
64 7602.8 8.29 10.51 11.93 19.29 0 660.3 280.9 МБ
128 7503.45 16.75 20.53 23.93 35.38 0 661.95 303.0 МБ

Лента активности

Паралл. Вызовов/с p50, мс p95, мс p99, мс макс, мс Ошибок ЦП, % ядра Память, макс
1 45.4 22.05 24.28 25.28 26.42 0 14.05 44.9 МБ
4 248.2 16.07 17.22 17.73 19.38 0 44.1 66.9 МБ
16 654.7 24.15 27.59 29.75 38.53 0 148.75 202.7 МБ
64 620.4 103.22 130.94 143.66 171.09 0 158.9 228.6 МБ
128 617.55 208.46 264.79 287.71 335.49 0 167.55 264.8 МБ

Сводка рабочего стола

Паралл. Вызовов/с p50, мс p95, мс p99, мс макс, мс Ошибок ЦП, % ядра Память, макс
1 422.55 2.43 2.8 2.97 7.3 0 60 44.8 МБ
4 2316.1 1.66 2.4 2.76 4.23 0 230.75 104.6 МБ
16 6438.4 2.43 3.32 3.84 8.34 0 428.4 222.5 МБ
64 6719.45 9.42 11.26 12.33 16.88 0 467.6 300.4 МБ
128 6636.15 19.16 21.36 22.71 28.45 0 471.4 264.8 МБ

Мои запросы

Паралл. Вызовов/с p50, мс p95, мс p99, мс макс, мс Ошибок ЦП, % ядра Память, макс
1 287.9 3.61 3.91 4.46 15.88 0 45.25 44.7 МБ
4 996.75 4.06 5.28 5.86 7.45 0 163.6 103.1 МБ
16 5311.2 2.9 4.23 4.96 23.87 0 432.85 204.3 МБ
64 5876.8 10.68 14.24 16.2 24.55 0 497.7 261.1 МБ
128 5779.9 21.85 26.16 28.98 40.43 0 498.45 283.8 МБ

Запросы на рецензию

Паралл. Вызовов/с p50, мс p95, мс p99, мс макс, мс Ошибок ЦП, % ядра Память, макс
1 169.4 5.95 7.33 8 19.11 0 34.2 44.6 МБ
4 752.95 5.25 7.6 8.63 14.24 0 129.85 103.8 МБ
16 2525.05 6.15 9.06 10.6 20.43 0 257.25 204.6 МБ
64 2664.35 23.64 30.17 33.9 44.15 0 283.7 225.2 МБ
128 2640.3 47.87 57.09 62.89 79.92 0 285.15 300.1 МБ

Поиск по коду

Паралл. Вызовов/с p50, мс p95, мс p99, мс макс, мс Ошибок ЦП, % ядра Память, макс
1 38.95 25.58 27.56 28.97 30.3 0 51.3 57.3 МБ
2 48.65 41.14 44.1 45.89 48.8 0 65 58.9 МБ
4 53.25 74.86 83.79 88.77 94.01 0 71.7 78.5 МБ
8 54.2 145.16 177.7 195.68 234.33 0 71.6 187.4 МБ

Создание задачи

Паралл. Вызовов/с p50, мс p95, мс p99, мс макс, мс Ошибок ЦП, % ядра Память, макс
1 319.35 2.79 4.12 4.81 224.48 0 56.7 49.2 МБ
4 726.05 2.97 5.73 41.32 1263.54 0 102.75 112.8 МБ
16 1504.6 5.01 39.07 48.51 1501.04 0 214 223.9 МБ
64 3136.55 16.2 59.41 105.9 217.87 0 372.3 318.9 МБ
128 902.4 132.84 236.31 1143.34 1232.26 0 172.25 319.5 МБ

Клонирование (git clone)

Паралл. Вызовов/с p50, мс p95, мс p99, мс макс, мс Ошибок ЦП, % ядра Память, макс
1 23.35 43.16 47.58 50.5 76.39 0 4.1 44.4 МБ
4 116.6 34.16 36.15 37.71 47.55 0 14.05 46.5 МБ
16 123.85 129.08 146.56 156.25 177.53 0 17.05 51.0 МБ

Отправка (git push)

Паралл. Вызовов/с p50, мс p95, мс p99, мс макс, мс Ошибок ЦП, % ядра Память, макс
1 13.85 58.56 95.36 105.07 1606.45 0 9.15 48.4 МБ
4 73.15 47.86 74.64 397.85 604.15 0 45.5 107.9 МБ
16 120.35 131.72 164.75 180.27 209.09 0 112.7 208.1 МБ

Что из этого следует

Заявление Замер Итог
Память при простое — менее 50 МБ 45.8 МБ подтверждено
Размер бинарника — менее 60 МБ 57.2 МБ подтверждено

Под нагрузкой память доходит до 320 МБ — это потолок по всем сценариям лестницы, включая поиск по коду и приём push, то есть худший случай, а не средний.