Я делаю нагрузочное тестирование на сервере Redis.Я хотел протестировать операцию INCR
в Redis, где я инициализирую счетчик на 1
(установив ключ с именем total-Call), а затем для каждого входящего запроса я увеличиваю счетчик на 1. Итак, после 3000 запросов,счетчик должен быть 3000, после 8000 запросов счетчик должен быть 8000.
Для этого я создал простой NodeJS
скрипт, выполняющий express, и простое промежуточное ПО, увеличивающее счетчик.Я использовал loadtest для нагрузочного тестирования.Все работает нормально, когда нет параллелизма, но результаты расходятся на 1
, 3
или 5
, когда я увеличиваю параллелизм.Я не могу понять причину этого.
Так что для входного теста, где параллелизм равен 1, а количество запросов равно 3000:
loadtest -n 3000 -c 1 http://localhost:3000
команда redis get total-calls
дает ожидаемый результатиз 3000
.
Но если увеличить параллелизм до 5 и запустить ту же команду после удаления предыдущего ключа из redis, я получу общее число 300. Почему это происходит?
loadtest -n 3000 -c 5 http://localhost:3000
и при дальнейшем увеличении количества запросов до 8000 общее количество становится 8003. Я не могу понять причину этого.
Код, который попадает под нагрузку:
const express = require('express');
const app = express();
const Redis = require("./redis-wrapper");
const client = new Redis();
const maxCallsAllowed = 50000
const requestCounter = async (req, resp, next) => {
// Increment the request counter
const redis = client.redis;
if(await redis.exists("total-calls") === 1) {
// Key already exists
// Increment the key
await redis.incr("total-calls")
}else {
// Key does not exist
// Set the key
await redis.set("total-calls", 1)
}
next();
}
app.get('/', requestCounter, (req, resp, next) => {
resp.json({
status: 'ok'
})
});
app.listen(3000);
Что-то мне не хватает?Почему количество больше, чем количество запросов?Я также проверил это с locust.io , но заметил то же самое поведение.