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 准备阶段
环境检查
# 检查Java版本 java -version # 检查MySQL连接 mysql -u root -p -h localhost -P 3307 -e "SELECT 1" # 检查JMeter jmeter --version数据准备
# 执行数据库脚本 mysql -u root -p"root" -h localhost -P 3307 husky_wms_db < pressure_test_data_preparation.sql # 生成测试数据 python3 pressure_test_data_generator.py启动监控
./start_monitoring.sh
7.2 执行阶段
基准测试
# 10并发用户,持续60秒 ./pressure_test.sh 10 5 60 10负载测试
# 50并发用户,持续300秒 ./pressure_test.sh 50 10 300 100压力测试
# 100并发用户,持续300秒 ./pressure_test.sh 100 20 300 200极限测试
# 200并发用户,持续300秒 ./pressure_test.sh 200 30 300 300
7.3 分析阶段
结果分析
# 生成HTML报告 jmeter -g pressure_test_results.jtl -o report # 性能指标分析 python3 analyze_results.py pressure_test_results.jtl优化建议
# 生成优化报告 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
最后编辑:聂盼盼 更新时间:2025-11-05 15:18