温馨提示×

Ubuntu Tomcat如何进行性能测试

小樊
34
2025-12-15 01:00:44
栏目: 智能运维

Ubuntu 下 Tomcat 性能测试与监控实操指南

一 测试准备与关键指标

  • 准备稳定版本:建议使用 Tomcat 9+JDK 11+,并在测试机上安装 Apache JMeter 5.5+。为减少干扰,测试环境尽量与生产一致(硬件规格、网络、JDK/容器版本、应用版本)。
  • 关键业务指标:吞吐量(req/s)响应时间(平均/95/99分位)错误率
  • 关键资源指标:Tomcat 线程池(当前/最大线程、繁忙线程)JVM 堆与非堆内存GC 次数/停顿CPU/内存/磁盘 I/O/网络
  • 监控方式:开启 JMX 远程监控,结合 JConsole/VisualVM 观察 MBean;必要时补充系统级监控(如 sar/pidstat/ifstat)。
  • 安全提示:压测与监控仅在非生产环境进行,避免对线上造成影响。

二 快速上手 两种常用工具与命令

  • Apache JMeter(功能全面,适合复杂场景与报告)
    • 安装:sudo apt-get install -y openjdk-11-jdk jmeter;GUI 设计测试计划,非 GUI 运行更稳定。
    • 示例(非 GUI,直接对应用接口压测):
      jmeter -n -t benchmark.jmx -Jthreads=100 -Jduration=300 -Jurl=http://localhost:8080/app/api -l results/result_100u.jtl
      
      说明:线程数 100、持续时间 300s,结果写入 JTL 文件便于后续聚合分析。
  • ApacheBench(轻量快速,适合单接口基线)
    • 安装:sudo apt-get install -y apache2-utils
    • 示例(GET):
      ab -n 10000 -c 200 http://localhost:8080/
      
    • 示例(POST JSON):
      ab -n 1000 -c 100 -p data.json -T application/json http://localhost:8080/add
      
    • 关注输出中的 Requests per secondTime per requestFailed requests 等核心项。

三 启用 JMX 监控 Tomcat 与 JVM

  • 方式一(推荐)在 $CATALINA_HOME/bin/setenv.sh 中追加(如文件不存在则新建):
    export CATALINA_OPTS="$CATALINA_OPTS \
      -Dcom.sun.management.jmxremote \
      -Dcom.sun.management.jmxremote.port=1099 \
      -Dcom.sun.management.jmxremote.ssl=false \
      -Dcom.sun.management.jmxremote.authenticate=false \
      -Djava.rmi.server.hostname=127.0.0.1"
    
    重启 Tomcat 后用 JConsole 连接 localhost:1099 查看 MBean。
  • 方式二 直接在 catalina.shJAVA_OPTS 中追加相同参数。
  • 安全建议(压测环境外):为 JMX 配置 SSL用户名/密码,并限制来源 IP。
  • 在 JConsole 中重点查看:
    • MBeans → Catalina → GlobalRequestProcessor → http-nio-8080:观察 requestCount、errorCount、processingTime、maxTime(吞吐、错误、平均/最大响应时间)。
    • 线程内存 面板:观察线程数变化、堆/非堆使用与 GC 行为。

四 监控与结果分析要点

  • 系统资源:使用 top/vmstat/pidstat/sar/ifstat 观察 CPU 利用率、内存占用、I/O 等待、网络吞吐,定位是否为系统层瓶颈。
  • Tomcat 线程池:通过 JMX 的 GlobalRequestProcessorThreadPool MBean 观察 当前线程数、最大线程数、繁忙线程请求排队,判断是否线程不足或连接堆积。
  • JVM:在 JConsole/VisualVM 观察 堆内存曲线、GC 次数/停顿,若 Full GC 频繁或停顿过长,需优化 -Xms/-XmxGC 策略
  • 结果判读:
    • 吞吐(req/s)随并发上升而提高,直至受限于 CPU/内存/网络/数据库
    • 95/99 分位响应时间 比平均值更能反映用户体验;
    • 错误率升高通常伴随 线程池耗尽、连接超时、后端依赖异常
    • 多次迭代测试取稳定区间,避免冷启动影响。

五 自动化脚本与持续化压测

  • 可用 Python/Bash 实现“环境检查 → 启动 JMeter → 采集 JMX/系统指标 → 生成报告”的全流程自动化。
  • 示例 Bash 骨架(要点):
    #!/usr/bin/env bash
    set -euo pipefail
    TOMCAT_URL="http://localhost:8080"
    TEST_DURATION=300
    CONCURRENT_USERS=(50 100 200)
    RESULT_DIR="./results/$(date +%Y%m%d_%H%M%S)"
    mkdir -p "$RESULT_DIR"
    
    check_env() {
      if ! curl -s "$TOMCAT_URL/manager/status" | grep -q "OK"; then
        echo "Tomcat 未就绪"; exit 1
      fi
    }
    
    run_load_test() {
      local users=$1
      jmeter -n -t ./benchmark/template.jmx \
        -Jthreads=$users -Jduration=$TEST_DURATION -Jurl=$TOMCAT_URL \
        -l "$RESULT_DIR/jmeter_${users}u.jtl"
    }
    
    collect_metrics() {
      local users=$1
      # 伪采集示例:线程、会话、空闲内存(实际可用 JMXterm/jmxquery 等)
      echo "{\"threads\":\"$(curl -s "$TOMCAT_URL/manager/status/all" | awk '/Max threads/{print $4}')}\"" \
        > "$RESULT_DIR/metrics_${users}u.json"
    }
    
    main() {
      check_env
      for u in "${CONCURRENT_USERS[@]}"; do
        run_load_test "$u"
        collect_metrics "$u"
      done
      # 可调用 JMeter 报告生成或 Python 聚合脚本
    }
    main
    
  • 建议将 JTL 结果、JMX 指标 JSON、系统监控 CSV 统一归档,使用 Python/pandas + matplotlib 生成图表,便于对比不同版本与配置的差异。

0