You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何记录Azure上Node服务器因繁忙无法响应新请求的时间?

好的,针对你在Azure上的Node.js服务器需要追踪过载情况的需求,我整理了几个实用方案,帮你精准记录服务器无法及时响应新请求的时刻与频率:

一、利用Node.js内置能力追踪核心指标

Node.js本身提供了事件循环和连接相关的原生API,能直接帮你判断服务器是否过载:

1. 监控事件循环延迟

Node.js是单线程事件驱动模型,事件循环延迟是判断服务器是否忙不过来的核心指标。如果延迟超过你设定的阈值(比如200ms),说明当前请求堆积,服务器无法及时处理新连接。

示例代码:

const http = require('http');
const server = http.createServer((req, res) => {
  // 你的请求处理逻辑
});

// 定时检测事件循环延迟
let lastLoopTimestamp = process.hrtime();
setInterval(() => {
  const loopDelta = process.hrtime(lastLoopTimestamp);
  const delayMs = (loopDelta[0] * 1000) + (loopDelta[1] / 1000000);
  
  if (delayMs > 200) { // 可根据你的业务调整阈值
    console.error(`[${new Date().toISOString()}] 事件循环延迟过高: ${delayMs.toFixed(2)}ms`);
  }
  lastLoopTimestamp = process.hrtime();
}, 100);

// 监听当前连接数
server.on('connection', (socket) => {
  server.getConnections((err, count) => {
    if (!err && count > 1000) { // 对应你预期的峰值请求数
      console.warn(`[${new Date().toISOString()}] 当前连接数已达阈值: ${count}`);
    }
  });
});

server.listen(3000);

2. 捕获连接超时与客户端错误

当服务器过载时,经常会出现连接超时或客户端连接失败的情况,监听这些事件可以直接记录过载时刻:

// 设置连接超时时间(比如30秒)
server.timeout = 30000;

server.on('timeout', (socket) => {
  console.error(`[${new Date().toISOString()}] 连接超时: 来自${socket.remoteAddress}`);
  socket.end('HTTP/1.1 503 Service Unavailable\r\n\r\n');
});

server.on('clientError', (err, socket) => {
  console.error(`[${new Date().toISOString()}] 客户端连接错误: ${err.message}`);
  socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
});
二、用中间件追踪请求响应延迟

如果用Express等框架,可以添加全局中间件,记录每个请求的处理时长,当请求耗时超过阈值时标记为"慢请求"——慢请求的集中出现就是服务器过载的信号。

示例(Express):

const express = require('express');
const app = express();

// 全局请求耗时监控中间件
app.use((req, res, next) => {
  const startTime = Date.now();
  res.on('finish', () => {
    const duration = Date.now() - startTime;
    if (duration > 1000) { // 1秒以上的请求标记为慢请求
      console.warn(`[${new Date().toISOString()}] 慢请求: ${req.method} ${req.url} 耗时${duration}ms`);
    }
  });
  next();
});

// 你的路由和静态资源托管逻辑
app.use(express.static('public'));
三、借助Azure原生监控工具

既然服务器部署在Azure上,直接用Azure的监控工具能更全面地追踪状态:

  • Application Insights:启用后可以自动收集请求响应时间、失败请求数、服务器CPU/内存负载等指标,还能设置警报规则——比如当请求响应时间超过500ms或失败率超过5%时,自动触发通知,同时它会留存所有过载时刻的详细日志,方便你统计频率。
  • Azure Monitor:可以收集服务器底层的系统指标(CPU使用率、网络吞吐量等),结合请求日志关联分析,比如当CPU持续100%且请求响应时间飙升时,就是明确的过载信号。
额外提醒

你计划把静态文件存到内存里优化IO是个不错的思路,但要注意内存占用上限——5个视频文件最大10MB+150KB图片,总占用不大,但如果后续扩展资源,要避免内存溢出问题。另外,当监控到过载频率变高时,就可以考虑Azure的负载均衡器+多实例扩展了。

内容的提问来源于stack exchange,提问作者Curious101

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:12:36