Бенчмарки Node.js

Обзор · Node.js · Go и RESP

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.

Обновлено .