这个坑值得记一笔。用 GoAccess 1.9 分析 access.log,仪表盘上最大并发一直是 1,可那几个时段带宽明明打满。源站 stub_status 显示活跃连接 600,两边数字完全对不上,值班的同事一度以为日志被截断。
刚开始盯着「启动参数带了 --date-spec=hr,报表按小时汇总把峰值抹平」,折腾了半个多小时,排掉了。
原因不止一个,得分开看。工具默认按时间戳逐条累加,秒级精度还原不了同一秒内的并发;日志格式没声明 %T 或 %D,只能按秒聚合,看着像串行访问;combined 格式里没有 request_time,慢请求和并发的关系看不出来。
动手时先确认日志格式声明和实际字段一致
goaccess access.log --log-format=COMBINED --date-spec=min -o report.html
接着换用带耗时的自定义格式
log_format perf '$remote_addr $time_iso8601 "$request" $status $body_bytes_sent $request_time';
从 stub_status 取真实并发做对照
curl -s http://127.0.0.1/nginx_status
末了按分钟统计峰值而不是看总量
awk '{print substr($4,2,17)}' access.log | uniq -c | sort -rn | head
怎么算真的好了,看的是同一批现象。按分钟切分的峰值和 stub_status 的活跃连接数接近,抓取高峰能和带宽曲线对上,报表里的并发不再恒为 1。
提醒一点。日志是事后记录,天然不适合还原瞬时并发,判断压力优先看服务端指标,日志只用来找来源。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
