使用成熟的日志库(如Winston、Pino或Bunyan)替代原生console,开启debug或trace级别日志,确保捕获足够的上下文信息。需记录的内容包括:
ECONNREFUSED、TimeoutError)、触发错误的请求参数。通过日志时间戳梳理请求的时间线,重点关注以下模式:
fs.readFileSync)导致;使用Ubuntu系统工具(如top、htop、vmstat、iostat)实时监控服务器资源使用情况:
rss值不断攀升),可能存在内存泄漏(如未释放的全局变量、缓存未设置过期时间);await time过高(如iowait值超过20%),可能是频繁的文件读写或数据库查询未使用索引;rx_bytes/tx_bytes激增),可能是高并发下的请求/响应量过大。借助以下工具深入分析应用的性能热点:
node --inspect启动应用,使用Chrome DevTools的“Performance” tab录制时间线,查看事件循环延迟、函数调用栈;clinic.js(如clinic doctor)生成火焰图,直观展示CPU、内存的使用分布;使用strace工具跟踪Node.js进程的系统调用,获取底层操作的细节:
strace -p <PID> -v -s 2048 -T -e trace=open,read,write,connect,accept
-p <PID>:指定Node.js进程ID(可通过ps aux | grep node获取);-T:显示每个系统调用的耗时;-e trace=open,read,write:过滤关注的调用(如文件打开、读写)。read操作耗时过长),可定位I/O瓶颈(如慢磁盘、网络延迟)。使用负载测试工具(如Artillery、K6)模拟高并发场景,复现日志中的异常:
artillery quick --count 100 --rate 10 http://localhost:3000/api/endpoint
--count 100:模拟100个并发用户;--rate 10:每秒发起10个请求。根据排查结果针对性优化:
async库的互斥锁(mutex)或Promise链保护共享资源(如计数器、缓存);mutex1再获取mutex2,释放时反之);fs.closeSync)、数据库连接(connection.release)、内存缓存(设置TTL);fs.readFile替代fs.readFileSync)、使用缓存(Redis)减少数据库查询、优化SQL语句(添加索引)。通过以上步骤,可系统性地排查Ubuntu Node.js日志中的并发问题,从根源解决性能瓶颈或异常,提升应用的稳定性。