QPS
一、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: "成功!" };
});
-
使用
setInterval
每秒钟计算一次QPS
,并且清空计数器。这样做的好处是减少了每个请求的计算压力,不会频繁计算和更新QPS
。 -
每秒一次的定时计算使得
requestCount
可以作为局部计数器进行更新,避免了每个请求都进行QPS
计算的性能开销。 -
每秒的
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: "成功!" };
});
-
使用
setInterval
每秒钟计算一次QPS
,并且清空计数器。这样做的好处是减少了每个请求的计算压力,不会频繁计算和更新QPS
。 -
每秒一次的定时计算使得
requestCount
可以作为局部计数器进行更新,避免了每个请求都进行QPS
计算的性能开销。 -
只有成功的请求(状态码在
200-299
之间)才会计入QPS
,对于错误请求会跳过计数。 -
每秒的
QPS
计算是单独进行的,并不会受到高并发影响,因为每个请求计数的操作是非阻塞的。我们将计数和计算逻辑分开,避免了由于高并发时的共享状态导致的竞态条件。