Сколько памяти занимает 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 — точка насыщения. Оси логарифмические.



Витрина репозиториев
| Паралл. |
Вызовов/с |
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, то есть худший случай, а не средний.