用 Ubuntu 上的 Tomcat 日志做负载测试的可行路径
总体思路
步骤一 准备可观测性
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="access_log" suffix=".log"
pattern="%h %l %u %t "%r" %s %b %D" />
其中 %D 输出请求处理毫秒数,便于计算 p95/p99。tail -f catalina.out 实时观察异常与 GC 线索。-Xlog:gc*,gc+heap=debug:file=/opt/tomcat/logs/gc.log:time,tags:filecount=5,filesize=50M
top/htop/vmstat/iostat 观察 CPU/内存/IO;通过 JMX 获取更细的线程、内存与类加载信息,辅助解释日志现象。步骤二 生成负载
wrk -t12 -c100 -d30s http://<Tomcat_IP>:8080/app/test
含义:12 线程、100 并发连接、持续 30 秒。步骤三 用日志计算关键指标
# 以 1 分钟窗口计算
awk -F' ' '{ts=$4; gsub(/\[|\]/,"",ts); if(ts>=start && ts<end) count++; }
END { print "RPS=" count/60 }' access_log
awk -F' ' '{t=$NF} END { n=asort(t); print "p95="t[int(n*0.95)], "ms"; print "p99="t[int(n*0.99)], "ms" }' access_log
awk '$9 ~ /^[4-5][0-9][0-9]$/ {err++; total++} END { print "Errors=" err, "Total=" total, "ErrorRate=" err/total*100 "%" }' access_log
awk -F' ' '{
gsub(/\[|\]/,"",$4); split($4, a, ":"); t=a[2]*3600+a[3]*60+a[4];
start[t]++; end[t+$NF/1000]++
}
END {
cur=0; peak=0;
for(i in start) { cur+=start[i]-end[i]; if(cur>peak) peak=cur }
print "PeakConc(approx)=" peak
}' access_log
grep -i "ERROR\|Exception" catalina.out;grep -i "OutOfMemory\|GC overhead" catalina.out;tail -f catalina.out 观察运行期异常与 Full GC 迹象。步骤四 可视化与瓶颈定位