跳到主要内容

QPS

2024年12月25日
柏拉文
越努力,越幸运

一、nodejs_qps


1.1 认识

每秒 QPS(Queries Per Second) nodejs_qps 是衡量系统每秒处理的请求数量的指标,通常用于衡量一个 Web 应用或服务的吞吐量。在 Node.js 中,QPS 代表每秒钟 HTTP 请求的数量。这个指标对于监控系统性能、分析应用负载、预测资源需求和调优服务器性能非常有用。了解高负载时的 QPS,可以帮助我们提前进行容量规划,避免系统崩溃。可以根据设定的阈值,监控 QPS 指标来触发警报,及时发现系统故障或瓶颈。

每秒 QPS:计算的是每秒处理的请求数,不区分请求类型和状态,所有请求都会计入。更多地用于吞吐量、系统负载的监控,帮助了解系统在特定时间段内的处理能。

1.2 计算

通过使用 setInterval 来每隔一秒定期计算 QPS,并且避免在每个请求中都进行计算,优化了性能和并发情况。同时,通过 labels 对请求进行区分,使得 Prometheus 指标可以更细粒度地展示请求的 QPS

let requestCount = 0;
const QPS_RESET_INTERVAL = 1000;

async function qpsMiddleware(ctx, next) {
try{
await next();
requestCount++;
}catch(error){
ctx.status = 500;
}
}

function updateQps() {
console.log("QPS", requestCount);
requestCount = 0;
}

setInterval(updateQps, QPS_RESET_INTERVAL);

router.get("/", qpsMiddleware, (ctx) => {
list.push(new Array(1000).fill("柏拉文"));
ctx.body = { code: 200, message: "成功!" };
});
  1. 使用 setInterval 每秒钟计算一次 QPS,并且清空计数器。这样做的好处是减少了每个请求的计算压力,不会频繁计算和更新 QPS

  2. 每秒一次的定时计算使得 requestCount 可以作为局部计数器进行更新,避免了每个请求都进行 QPS 计算的性能开销。

  3. 每秒的 QPS 计算是单独进行的,并不会受到高并发影响,因为每个请求计数的操作是非阻塞的。我们将计数和计算逻辑分开,避免了由于高并发时的共享状态导致的竞态条件。

二、nodejs_real_qps


2.1 认识

nodejs_real_qps QPS (Queries per Second) 是衡量系统处理能力的一个重要指标,通常用于表示系统在每秒钟能够处理多少个请求。真实 QPS 是一种专注于计算真实、有效请求的 QPS 指标,区别于那些可能被错误请求、健康检查、静态资源请求等所影响的总 QPS。也就是说,真实 QPS 更关注的是应用层实际处理的请求,通常用来反映应用的实际负载。真实 QPS 能够帮助评估实际业务请求的流量,帮助开发人员和运维团队进行容量规划。

真实 QPS 计算的是每秒处理的有效请求数,通常会排除掉错误请求、无效请求、超时请求等。更多地关注系统健康状况和正常请求的处理能力,排除掉可能对应用健康产生负面影响的请求。

2.2 计算

通过使用 setInterval 来每隔一秒定期计算 QPS,并且避免在每个请求中都进行计算,优化了性能和并发情况。同时,通过 labels 对请求进行区分,使得 Prometheus 指标可以更细粒度地展示请求的 QPS

let requestCount = 0;
const QPS_RESET_INTERVAL = 1000;

async function realQpsMiddleware(ctx, next) {
try{
await next();

if (ctx.status >= 200 && ctx.status < 300) {
requestCount++;
}

}catch(error){
ctx.status = 500;
}
}

function updateQps() {
console.log("QPS", requestCount);
requestCount = 0;
}

setInterval(updateQps, QPS_RESET_INTERVAL);

router.get("/", realQpsMiddleware, (ctx) => {
list.push(new Array(1000).fill("柏拉文"));
ctx.body = { code: 200, message: "成功!" };
});
  1. 使用 setInterval 每秒钟计算一次 QPS,并且清空计数器。这样做的好处是减少了每个请求的计算压力,不会频繁计算和更新 QPS

  2. 每秒一次的定时计算使得 requestCount 可以作为局部计数器进行更新,避免了每个请求都进行 QPS 计算的性能开销。

  3. 只有成功的请求(状态码在 200-299 之间)才会计入 QPS,对于错误请求会跳过计数。

  4. 每秒的 QPS 计算是单独进行的,并不会受到高并发影响,因为每个请求计数的操作是非阻塞的。我们将计数和计算逻辑分开,避免了由于高并发时的共享状态导致的竞态条件。