Husky WMS 压力测试环境配置指南

1. 测试环境规划

1.1 硬件配置建议

组件 开发环境配置 测试环境配置 生产环境配置
应用服务器 4核8G 8核16G 16核32G
数据库服务器 8核16G 16核32G 32核64G
JMeter压测机 4核8G 8核16G 16核32G
网络带宽 1Gbps 10Gbps 10Gbps
存储空间 500G SSD 1T SSD 2T SSD

1.2 软件环境

软件 版本要求 下载地址
操作系统 CentOS 7+/Ubuntu 20.04+ Ubuntu
JDK OpenJDK 1.8+ OpenJDK
MySQL 8.0+ MySQL
Redis 6.0+ Redis
JMeter 5.4+ JMeter
Python 3.8+ Python

2. 数据库配置优化

2.1 MySQL配置优化

# /etc/my.cnf
[mysqld]
# 基础配置
port = 3307
socket = /tmp/mysql.sock
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
default-storage-engine = InnoDB

# 内存配置
innodb_buffer_pool_size = 8G  # 物理内存的50-70%
innodb_log_file_size = 2G
innodb_log_buffer_size = 64M
query_cache_type = 0
query_cache_size = 0

# 连接配置
max_connections = 500
max_connect_errors = 100000
wait_timeout = 300
interactive_timeout = 300

# InnoDB配置
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
innodb_thread_concurrency = 0
innodb_concurrency_tickets = 5000
innodb_read_io_threads = 16
innodb_write_io_threads = 8

# 慢查询配置
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1

# 复制配置(如需要)
server-id = 1
log-bin = mysql-bin
binlog_format = ROW
sync_binlog = 0

2.2 连接池配置

# application.yml
spring:
  datasource:
    druid:
      # 基础配置
      url: jdbc:mysql://localhost:3307/husky_wms_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
      username: root
      password: root
      driver-class-name: com.mysql.cj.jdbc.Driver

      # 连接池配置
      initial-size: 20
      min-idle: 20
      max-active: 200
      max-wait: 60000

      # 连接检查配置
      validation-query: SELECT 1
      validation-query-timeout: 3
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false

      # 连接存活配置
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      remove-abandoned: true
      remove-abandoned-timeout: 1800

      # 监控配置
      web-stat-filter:
        enabled: true
        url-pattern: /*
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
        reset-enable: false
        login-username: admin
        login-password: admin
        allow: 127.0.0.1

3. 应用服务器配置

3.1 JVM参数优化

# JVM启动参数
export JAVA_OPTS="-server \
-Xms8g -Xmx8g \
-XX:NewRatio=2 \
-XX:MetaspaceSize=256m \
-XX:MaxMetaspaceSize=512m \
-XX:ParallelGCThreads=8 \
-XX:ConcGCThreads=2 \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:InitiatingHeapOccupancyPercent=35 \
-XX:G1HeapRegionSize=16m \
-XX:+G1UseAdaptiveIHOP \
-XX:+ParallelRefProcEnabled \
-XX:+PerfDisableSharedMem \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/heap-dump.hprof \
-XX:ErrorFile=/var/log/hs_err_pid%p.log \
-verbose:gc \
-Xloggc:/var/log/gc.log \
-XX:+PrintGCDetails \
-XX:+PrintGCDateStamps \
-XX:+PrintTenuringDistribution \
-XX:+PrintGCCause \
-XX:+PrintGCApplicationStoppedTime \
-XX:+PrintPromotionFailure \
-XX:+UseGCLogFileRotation \
-XX:NumberOfGCLogFiles=10 \
-XX:GCLogFileSize=100M"

3.2 Spring Boot配置

# application.yml
server:
  port: 8080
  tomcat:
    max-threads: 800
    min-spare-threads: 100
    accept-count: 1000
    max-connections: 10000
    connection-timeout: 30000

# 线程池配置
thread:
  pool:
    core-pool-size: 20
    max-pool-size: 200
    queue-capacity: 1000
    keep-alive-seconds: 300
    thread-name-prefix: husky-pool-

# Actuator监控
management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics,prometheus
  metrics:
    export:
      prometheus:
        enabled: true

4. JMeter压测配置

4.1 JMeter启动参数

# JMeter启动脚本
export JVM_ARGS="-Xms4g -Xmx4g -XX:MaxMetaspaceSize=256m"
export HEAP="-Xms2g -Xmx2g"

# 启动JMeter
jmeter -t jmeter_pressure_test.jmx \
       -n \
       -l pressure_test_results.jtl \
       -e \
       -o pressure_test_report \
       -JTHREAD_COUNT=50 \
       -JRAMP_UP_TIME=10 \
       -JLOOP_COUNT=100

4.2 分布式压测配置

# 主节点配置
jmeter.properties:
remote_hosts=192.168.1.101,192.168.1.102,192.168.1.103
server_port=1099

# 从节点配置
jmeter.properties:
server_port=1099
server.rmi.localport=1099

# 启动从节点
./jmeter-server -Djava.rmi.server.hostname=192.168.1.101

# 主节点启动分布式测试
jmeter -n -t jmeter_pressure_test.jmx -r -l remote_test_results.jtl

5. 监控配置

5.1 Prometheus监控

# prometheus.yml
global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'spring-boot-app'
    static_configs:
      - targets: ['localhost:8080']
    metrics_path: '/actuator/prometheus'
    scrape_interval: 5s

  - job_name: 'mysql'
    static_configs:
      - targets: ['localhost:3307']
    metrics_path: '/metrics'

  - job_name: 'redis'
    static_configs:
      - targets: ['localhost:6379']
    metrics_path: '/metrics'

5.2 Grafana Dashboard配置

{
  "dashboard": {
    "id": null,
    "title": "Husky WMS压力测试监控",
    "tags": ["压力测试"],
    "panels": [
      {
        "id": 1,
        "title": "应用QPS",
        "type": "graph",
        "targets": [
          {
            "expr": "rate(http_requests_total[5m])",
            "legendFormat": "QPS"
          }
        ]
      },
      {
        "id": 2,
        "title": "响应时间",
        "type": "graph",
        "targets": [
          {
            "expr": "histogram_quantile(0.95, http_request_duration_seconds_bucket)",
            "legendFormat": "95th percentile"
          }
        ]
      },
      {
        "id": 3,
        "title": "CPU使用率",
        "type": "graph",
        "targets": [
          {
            "expr": "100 - (avg by(instance) (irate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100)",
            "legendFormat": "CPU {{instance}}"
          }
        ]
      },
      {
        "id": 4,
        "title": "内存使用率",
        "type": "graph",
        "targets": [
          {
            "expr": "(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100",
            "legendFormat": "Memory {{instance}}"
          }
        ]
      }
    ]
  }
}

6. 压力测试脚本

6.1 一键启动脚本

#!/bin/bash
# pressure_test.sh

# 设置环境变量
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export JMETER_HOME=/opt/jmeter
export PATH=$PATH:$JAVA_HOME/bin:$JMETER_HOME/bin

# 测试配置
THREAD_COUNT=${1:-50}
RAMP_UP_TIME=${2:-10}
DURATION=${3:-300}
LOOP_COUNT=${4:-100}

echo "开始压力测试..."
echo "并发用户数: $THREAD_COUNT"
echo "启动时间: $RAMP_UP_TIME 秒"
echo "测试时长: $DURATION 秒"
echo "循环次数: $LOOP_COUNT"

# 清理旧数据
mysql -u root -p"root" -h localhost -P 3307 husky_wms_db < pressure_test_data_preparation.sql

# 运行Python数据生成
python3 pressure_test_data_generator.py

# 启动JMeter压测
jmeter -t jmeter_pressure_test.jmx \
       -n \
       -l pressure_test_results_$THREAD_COUNT"_"$(date +%Y%m%d_%H%M%S).jtl \
       -e \
       -o pressure_test_report_$THREAD_COUNT"_"$(date +%Y%m%d_%H%M%S) \
       -JTHREAD_COUNT=$THREAD_COUNT \
       -JRAMP_UP_TIME=$RAMP_UP_TIME \
       -JLOOP_COUNT=$LOOP_COUNT

echo "压力测试完成!"
echo "结果文件: pressure_test_results_$THREAD_COUNT"_"$(date +%Y%m%d_%H%M%S).jtl"
echo "报告目录: pressure_test_report_$THREAD_COUNT"_"$(date +%Y%m%d_%H%M%S)"

6.2 监控启动脚本

#!/bin/bash
# start_monitoring.sh

# 启动Prometheus
docker run -d \
  --name prometheus \
  -p 9090:9090 \
  -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \
  prom/prometheus

# 启动Grafana
docker run -d \
  --name grafana \
  -p 3000:3000 \
  grafana/grafana

# 启动MySQL监控
docker run -d \
  --name mysqld-exporter \
  -p 9104:9104 \
  -e DATA_SOURCE_NAME="root:root@(localhost:3307)/husky_wms_db" \
  prom/mysqld-exporter

echo "监控启动完成!"
echo "Prometheus: http://localhost:9090"
echo "Grafana: http://localhost:3000 (admin/admin)"

7. 测试执行步骤

7.1 准备阶段

  1. 环境检查

    # 检查Java版本
    java -version
    
    # 检查MySQL连接
    mysql -u root -p -h localhost -P 3307 -e "SELECT 1"
    
    # 检查JMeter
    jmeter --version
  2. 数据准备

    # 执行数据库脚本
    mysql -u root -p"root" -h localhost -P 3307 husky_wms_db < pressure_test_data_preparation.sql
    
    # 生成测试数据
    python3 pressure_test_data_generator.py
  3. 启动监控

    ./start_monitoring.sh

7.2 执行阶段

  1. 基准测试

    # 10并发用户,持续60秒
    ./pressure_test.sh 10 5 60 10
  2. 负载测试

    # 50并发用户,持续300秒
    ./pressure_test.sh 50 10 300 100
  3. 压力测试

    # 100并发用户,持续300秒
    ./pressure_test.sh 100 20 300 200
  4. 极限测试

    # 200并发用户,持续300秒
    ./pressure_test.sh 200 30 300 300

7.3 分析阶段

  1. 结果分析

    # 生成HTML报告
    jmeter -g pressure_test_results.jtl -o report
    
    # 性能指标分析
    python3 analyze_results.py pressure_test_results.jtl
  2. 优化建议

    # 生成优化报告
    python3 generate_optimization_report.py

8. 常见问题解决

8.1 数据库连接问题

# 检查数据库连接
mysql -u root -p -h localhost -P 3307 -e "SHOW STATUS LIKE 'Threads%'"

# 检查连接池状态
curl http://localhost:8080/druid/stat

8.2 内存溢出问题

# 查看JVM堆内存
jstat -gc <pid> 1s

# 查看内存使用情况
free -h

8.3 网络问题

# 检查网络连接
netstat -an | grep 8080

# 检查带宽使用
iftop

9. 测试报告模板

9.1 压力测试报告结构

# Husky WMS 压力测试报告

## 测试概述
- **测试目标**: 验证系统在高并发下的性能表现
- **测试时间**: 2025-XX-XX XX:XX:XX
- **测试环境**: 测试环境

## 测试配置
- **并发用户数**: XX
- **测试时长**: XX分钟
- **测试场景**: XX

## 性能指标
- **QPS**: XX
- **平均响应时间**: XXms
- **95%响应时间**: XXms
- **错误率**: XX%

## 系统资源
- **CPU使用率**: XX%
- **内存使用率**: XX%
- **数据库连接**: XX/XX

## 问题分析
- **问题1**: XX
- **问题2**: XX

## 优化建议
- **建议1**: XX
- **建议2**: XX

10. 安全注意事项

10.1 数据安全

  • 使用独立的测试数据库
  • 敏感数据脱敏处理
  • 测试完成后清理数据

10.2 系统安全

  • 在隔离的测试环境中执行
  • 监控系统资源使用
  • 准备应急预案

10.3 网络安全

  • 使用内网环境测试
  • 限制外部访问
  • 防火墙配置

注意: 本配置文档为压力测试专用,请勿在生产环境中使用!

作者:聂盼盼  创建时间:2025-11-04 15:12
最后编辑:聂盼盼  更新时间:2025-11-05 15:18