Debian环境下 JavaScript 日志常见性能指标
一 应用层请求与响应
- 响应时间/请求处理时间:从请求进入到响应完成的总耗时,关注平均、P95、P99分位以识别长尾。
- 首字节时间 TTFP/TTFB:从发起请求到收到首字节的时间,反映后端处理与网络链路。
- 请求耗时分解:如DNS 解析、TCP 建连、TLS 握手、上游服务、数据库/缓存、序列化/反序列化等分段耗时。
- HTTP 状态码与错误率:如2xx/3xx/4xx/5xx分布,错误率=错误数/总请求数。
- 吞吐量与并发:每秒请求数(RPS/QPS)、并发连接数/排队请求数。
- 路由/接口/方法维度:按URL、HTTP 方法、业务路由聚合,定位热点接口。
- 用户与地域:按用户ID、会话、UA、IP 地理位置分析体验差异。
以上指标通常来自Node.js的HTTP日志(如morgan)或自定义日志(如winston),并在ELK/Graylog中做聚合与可视化。
二 运行时与系统资源
- 事件循环延迟 Event Loop Lag:两次 Tick 之间的延迟,反映 JS 执行与 I/O 阻塞情况。
- 垃圾回收 GC 指标:如GC 次数、GC 总耗时、GC 暂停时间,定位内存回收抖动。
- 堆内存与驻留集 RSS:如heapUsed、heapTotal、rss,观察内存增长与泄漏趋势。
- 进程 CPU 使用率:Node 进程占用的CPU 百分比与负载。
- 系统级资源:CPU 负载(1/5/15 分钟)、可用内存、磁盘 I/O、网络 I/O。
- 常驻集与资源限制:容器/进程的内存/CPU 限额与 OOM/限流事件。
这些指标可通过Node.js performance hooks、V8 Profiler/Heapdump以及**os.loadavg()/os.totalmem()/os.freemem()**等方式采集,并与日志一起上报分析。
三 前端页面与资源加载
- 页面加载时间:如DOMContentLoaded、Load事件时间。
- 首屏时间 FCP、最大内容绘制 LCP、首次输入延迟 FID、累积布局偏移 CLS:衡量用户感知性能的核心 Web 指标。
- 资源时序:DNS/TCP/TLS/请求/响应各阶段耗时与大小(利用Resource Timing)。
- 长任务 Long Tasks:超过50ms的任务,提示主线程阻塞风险。
- 渲染与回流重绘:频繁访问会触发回流/重绘的属性(如offsetHeight/clientHeight/scrollHeight)导致的性能问题。
可通过Performance API、PerformanceObserver在浏览器端埋点与日志化,用于定位前端瓶颈。
四 日志采集与计算方式
- 打点与计时:使用console.time/console.timeEnd或performance.now()记录关键路径耗时;在 Node 端使用performance hooks;前端用PerformanceObserver监听mark/measure事件。
- 日志库与输出:使用winston/morgan等结构化日志,输出JSON便于检索与聚合;服务器端可结合ELK/Graylog做可视化与告警。
- 系统指标采集:在 Node 中调用os.loadavg()、os.totalmem()、os.freemem()等获取CPU 负载、内存使用、系统运行时间并写入日志。
- 计算示例:
- 平均响应时间 = 总响应时间 / 请求数;
- 错误率 = 错误请求数 / 总请求数;
- P95/P99 = 将响应时间排序后取第95/99个值;
- 吞吐量与并发 = 单位时间请求数、同时处理请求数。
上述方法覆盖从应用、运行时到前端的埋点与计算,适合在Debian上长期落地观测。
五 日志开销与采样建议
- 日志级别与格式:避免在生产环境输出debug/大量堆栈与调用位置信息,减少字符串拼接,优先占位符与结构化输出。
- 同步 vs 异步:同步写磁盘会阻塞 I/O,尽量使用异步或批量/缓冲写入,权衡丢失风险与性能。
- 采样与降级:高流量时对debug/trace级别与性能埋点进行采样,异常时临时提升采样率。
- 库与实现选择:选择轻量、异步友好的日志库,减少性能影响。
这些措施有助于在获得可观测性的同时控制日志对性能的影响。