Бенчмарки Node.js
Node.js 24.18.0 с node-postgres 8.16.3. Машина и методика измерений.
Измерено 14 сентября 2026 года со сборкой расширения 67e5754, бюджетом кэша
384 МиБ и клиентами на macOS через опубликованный Docker-порт SQL.
При 64 ключах на запрос медиана запросов/с для трёх выборок по 10 секунд:
| Соединения | Подготовленный SQL | SQL mget |
|---|---|---|
| 4 | 7,023 | 7,528 |
| 64 | 15,577 | 16,616 |
| 256 | 15,459 | 16,574 |
При 64 соединениях mget использовал 170 мкс CPU сервера на запрос против
286 мкс для SQL. Средняя загрузка CPU сервера составляла 2.80 против 4.43 ядра;
пиковая измеренная память — 215.0 против 205.5 МиБ. CPU клиента — 0.84 против
0.87 ядра.
Для одного ключа при 64 соединениях SQL был быстрее: 55,409 против 53,646 запросов/с. Результат для пакета не распространяется на чтение одного ключа.
Исходные измерения включают процентили задержки, выборки ресурсов и ревизии исходников.
Чтения вперемешку с записями
Запускатель приложения Node.js использует 64 соединения, 50 000 запросов на выборку и три повтора. Чтения циклически проходят по 128 горячим строкам; 5% операций смешанной нагрузки обновляют строки.
| Нагрузка | Ключей/запрос | Запросов/с подготовленного SQL | Запросов/с mget JSON |
|---|---|---|---|
| Прогретые чтения | 1 | 56,104 (52,246–56,364) | 52,842 (52,494–53,399) |
| Прогретые чтения | 16 | 37,391 (36,996–37,938) | 38,425 (38,340–38,617) |
| Прогретые чтения | 64 | 15,178 (15,109–15,488) | 16,294 (16,131–16,368) |
| 5% обновлений | 1 | 55,768 (54,273–56,527) | 52,621 (51,432–53,216) |
| 5% обновлений | 16 | 38,669 (38,429–38,718) | 37,604 (37,481–37,916) |
| 5% обновлений | 64 | 16,049 (16,008–16,063) | 16,814 (16,771–17,229) |
Значения — медиана запросов/с с минимумом–максимумом в скобках. Смешанные
выборки считают чтения и записи вместе. В application_run JSON есть случаи
холодного заполнения и накладных расходов записи. Холодное заполнение при
пакете 64 имеет всего 64 наблюдения задержки — слишком мало для полезной оценки
p99.
Настройка запроса
SELECT array_to_json(local_cache.mget('public.items'::regclass, $1::bigint[])) AS rows;
Соединения и именованные подготовленные операторы переиспользуются. Декодирование JSON и восстановление входных позиций входят во время запроса. См. пример Node.js.
Воспроизведение
Запустите бенчмарк Node.js
Из корня репозитория, с Docker и Node.js 20+:
./examples/benchmark.sh node > node.json
Текущие значения по умолчанию: 4/64/256 соединений, 1/16/64 ключей, три
пятисекундные выборки для каждого случая. Теперь Node.js запускает все три пути:
подготовленный SQL, SQL mget и RESP MGET внутри ВМ Docker. Скрипт создаёт
временный сервер и отдельный контейнер клиента, записывает ресурсы и затем
удаляет оба контейнера.
Необязательные переопределения: CONNECTIONS, BATCHES, REPEATS,
DURATION_SECONDS. Используйте all, чтобы включить Go в ту же матрицу.
Для записанной конфигурации с хостом используйте ревизии из JSON измерений.
Для чтений вперемешку с записями:
BATCHES=1,16,64 ./examples/benchmark.sh node-workload > benchmark.json
python3 scripts/benchmark_report.py benchmark.json
По умолчанию: 64 соединения, 50 000 запросов на выборку и три повтора.
Запускатель сбрасывает демонстрационные таблицы между выборками. Необязательные
переопределения: CLIENTS, REQUESTS, BATCHES и REPEATS.
Обновлено .