Skip to content

fix(benchmark):修复日志提取正则表达式以正确获取性能指标 #31

fix(benchmark):修复日志提取正则表达式以正确获取性能指标

fix(benchmark):修复日志提取正则表达式以正确获取性能指标 #31

Workflow file for this run

name: 性能测试
on:
workflow_dispatch:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
benchmark-1:
runs-on: ubuntu-latest
services:
redis:
image: redis:latest
ports:
- 6379:6379
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- name: 检出代码
uses: actions/checkout@v4
- name: 设置 Java 环境
uses: actions/setup-java@v4
with:
java-version: '8'
distribution: 'temurin'
cache: 'maven'
- name: 编译项目
run: mvn compile
- name: 运行性能测试 (客户端数量 1)
run: |
echo "Running benchmark tests with 1 clients..."
# 定义测试参数
clients=("Redisun" "Redisson" "Jedis" "Lettuce")
methods=("asyncSet" "asyncGet" "concurrentSet" "concurrentGet")
# 循环执行所有测试
for client in "${clients[@]}"; do
for method in "${methods[@]}"; do
echo "Running ${client} ${method} test..."
mvn test -Dtest=${client}Benchmark#${method} -Dclient.count=1 > ${client,,}_${method}_1.log 2>&1 || true
done
done
# 上传单个测试结果作为工件
- name: 上传单个测试结果
uses: actions/upload-artifact@v4
with:
name: benchmark-results-1
path: "*.log"
benchmark-8:
runs-on: ubuntu-latest
services:
redis:
image: redis:latest
ports:
- 6379:6379
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- name: 检出代码
uses: actions/checkout@v4
- name: 设置 Java 环境
uses: actions/setup-java@v4
with:
java-version: '8'
distribution: 'temurin'
cache: 'maven'
- name: 编译项目
run: mvn compile
- name: 运行性能测试 (客户端数量 8)
run: |
echo "Running benchmark tests with 8 clients..."
# 定义测试参数
clients=("Redisun" "Redisson" "Jedis" "Lettuce")
methods=("asyncSet" "asyncGet" "concurrentSet" "concurrentGet")
# 循环执行所有测试
for client in "${clients[@]}"; do
for method in "${methods[@]}"; do
echo "Running ${client} ${method} test..."
mvn test -Dtest=${client}Benchmark#${method} -Dclient.count=8 > ${client,,}_${method}_8.log 2>&1 || true
done
done
# 上传单个测试结果作为工件
- name: 上传单个测试结果
uses: actions/upload-artifact@v4
with:
name: benchmark-results-8
path: "*.log"
benchmark-128:
runs-on: ubuntu-latest
services:
redis:
image: redis:latest
ports:
- 6379:6379
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- name: 检出代码
uses: actions/checkout@v4
- name: 设置 Java 环境
uses: actions/setup-java@v4
with:
java-version: '8'
distribution: 'temurin'
cache: 'maven'
- name: 编译项目
run: mvn compile
- name: 运行性能测试 (客户端数量 128)
run: |
echo "Running benchmark tests with 128 clients..."
# 定义测试参数
clients=("Redisun" "Redisson" "Jedis" "Lettuce")
methods=("asyncSet" "asyncGet" "concurrentSet" "concurrentGet")
# 循环执行所有测试
for client in "${clients[@]}"; do
for method in "${methods[@]}"; do
echo "Running ${client} ${method} test..."
mvn test -Dtest=${client}Benchmark#${method} -Dclient.count=128 > ${client,,}_${method}_128.log 2>&1 || true
done
done
# 上传单个测试结果作为工件
- name: 上传单个测试结果
uses: actions/upload-artifact@v4
with:
name: benchmark-results-128
path: "*.log"
benchmark-1024:
runs-on: ubuntu-latest
services:
redis:
image: redis:latest
ports:
- 6379:6379
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- name: 检出代码
uses: actions/checkout@v4
- name: 设置 Java 环境
uses: actions/setup-java@v4
with:
java-version: '8'
distribution: 'temurin'
cache: 'maven'
- name: 编译项目
run: mvn compile
- name: 运行性能测试 (客户端数量 1024)
run: |
echo "Running benchmark tests with 1024 clients..."
# 定义测试参数
clients=("Redisun" "Redisson" "Jedis" "Lettuce")
methods=("asyncSet" "asyncGet" "concurrentSet" "concurrentGet")
# 循环执行所有测试
for client in "${clients[@]}"; do
for method in "${methods[@]}"; do
echo "Running ${client} ${method} test..."
mvn test -Dtest=${client}Benchmark#${method} -Dclient.count=1024 > ${client,,}_${method}_1024.log 2>&1 || true
done
done
# 上传单个测试结果作为工件
- name: 上传单个测试结果
uses: actions/upload-artifact@v4
with:
name: benchmark-results-1024
path: "*.log"
# 新增一个job来整合所有结果
merge-reports:
needs: [benchmark-1, benchmark-8, benchmark-128, benchmark-1024]
runs-on: ubuntu-latest
steps:
- name: 检出代码
uses: actions/checkout@v4
# 下载所有测试结果
- name: 下载所有测试结果
uses: actions/download-artifact@v4
with:
path: ./artifacts
# 整合报告
- name: 整合测试报告
run: |
echo "# Redis客户端性能测试报告" > benchmark-report.md
echo "测试时间: $(date)" >> benchmark-report.md
echo "" >> benchmark-report.md
echo "## 测试环境" >> benchmark-report.md
echo "- 操作系统: Ubuntu 20.04" >> benchmark-report.md
echo "- Java 版本: JDK 8" >> benchmark-report.md
echo "- Redis 版本: latest" >> benchmark-report.md
echo "- 测试键数量: 50000" >> benchmark-report.md
echo "" >> benchmark-report.md
# 创建通用函数提取数据
extract_data() {
local client_name=$1
local method=$2
local client_count=$3
local log_file="./artifacts/benchmark-results-${client_count}/${client_name}_${method}_${client_count}.log"
if [ -f "$log_file" ]; then
# 提取时间 (cost)
local time=$(grep " cost:" "$log_file" | awk '{print $5}' | sed 's/ms$//' | sed 's/[^0-9\-]*//g' | head -1)
if [ -z "$time" ]; then
time="-"
fi
# 提取OPS
local ops=$(grep " ops/s:" "$log_file" | awk '{print $5}' | sed 's/[^0-9\-]*//g' | head -1)
if [ -z "$ops" ]; then
ops="-"
fi
echo "$time/$ops"
else
echo "-/-"
fi
}
# 定义测试类型和表头
test_types=("concurrent_set" "async_set" "concurrent_get" "async_get")
type_names=("同步SET性能对比" "异步SET性能对比" "同步GET性能对比" "异步GET性能对比")
# 为每种测试类型生成表格
for i in "${!test_types[@]}"; do
test_type=${test_types[$i]}
type_name=${type_names[$i]}
echo "## $type_name" >> benchmark-report.md
echo "| 客户端数量 | 耗时(Redisun/Redisson/Jedis/Lettuce) | OPS(Redisun/Redisson/Jedis/Lettuce) |" >> benchmark-report.md
echo "|------------|------------------------|-----------------------|" >> benchmark-report.md
for client_count in 1 8 128 1024; do
# 根据测试类型设置方法名
case "${test_type}" in
"concurrent_set")
method="concurrentSet"
;;
"async_set")
method="asyncSet"
;;
"concurrent_get")
method="concurrentGet"
;;
"async_get")
method="asyncGet"
;;
esac
# 提取各客户端的数据
redisun_data=$(extract_data "redisun" "${method}" "$client_count")
redisson_data=$(extract_data "redisson" "${method}" "$client_count")
jedis_data=$(extract_data "jedis" "${method}" "$client_count")
lettuce_data=$(extract_data "lettuce" "${method}" "$client_count")
redisun_time=$(echo $redisun_data | cut -d'/' -f1)
redisun_ops=$(echo $redisun_data | cut -d'/' -f2)
redisson_time=$(echo $redisson_data | cut -d'/' -f1)
redisson_ops=$(echo $redisson_data | cut -d'/' -f2)
jedis_time=$(echo $jedis_data | cut -d'/' -f1)
jedis_ops=$(echo $jedis_data | cut -d'/' -f2)
lettuce_time=$(echo $lettuce_data | cut -d'/' -f1)
lettuce_ops=$(echo $lettuce_data | cut -d'/' -f2)
echo "| ${client_count} | ${redisun_time}/${redisson_time}/${jedis_time}/${lettuce_time} | ${redisun_ops}/${redisson_ops}/${jedis_ops}/${lettuce_ops} |" >> benchmark-report.md
done
echo "" >> benchmark-report.md
done
echo "> 注意:由于 GitHub Actions 环境限制,测试结果可能不如本地环境准确。" >> benchmark-report.md
echo "" >> benchmark-report.md
# 显示报告内容
cat benchmark-report.md
# 上传整合后的测试报告
- name: 上传整合后的测试报告
uses: actions/upload-artifact@v4
with:
name: benchmark-report
path: benchmark-report.md