logo
0
0
WeChat Login
删除RSAKeyPairGeneratorBench的useNative变量.md

实战初阶任务:EC和RSA密钥对生成器性能测试

1. 任务概述

本报告详细介绍了构建Tencent Kona JDK 17的完整过程,以及如何实现用于测试EC和RSA密钥对生成器性能的JMH基准测试程序。该项目的主要目标是:

  1. 构建自定义的Tencent Kona JDK 17环境
  2. 开发并执行高精度的JMH基准测试程序
  3. 准确测量EC和RSA密钥对生成操作的性能
  4. 分析不同密钥大小和曲线参数对性能的影响

2. 环境配置与准备

以下是我的设备和环境的配置信息:

2.1. 系统环境

  • 操作系统: Windows 11 24H2 + WSL2 (Ubuntu 24.04 LTS)
  • 架构: x86_64 (amd64)
  • 内核版本: 5.15.167.4-microsoft-standard-wsl2
  • 编译器: GCC (gcc 13.3.0)
  • 构建工具: GNU Make

2.2. JDK环境信息

  • 目标JDK版本: Tencent Kona 17.0.16
  • Boot JDK: OpenJDK 17.0.15 (Ubuntu 24.04)
  • Boot JDK路径: /usr/lib/jvm/java-17-openjdk-amd64
  • JVM变体: Server VM (64-Bit)
  • 调试级别: Release

2.3. 构建工具环境

  • Java运行时: Ubuntu OpenJDK 17.0.15

2.4. JMH环境

  • JMH版本: 1.37
  • JMH安装路径: /home/xsj/jmh/jars
  • 核心组件:
    • jmh-core-1.37.jar
    • jmh-generator-annprocess-1.37.jar
    • jopt-simple-5.0.4.jar
    • commons-math3-3.2.jar

3. 构建JDK

3.1. 环境验证与准备

3.1.0. 环境检查脚本

在开始构建之前,建议运行以下检查脚本验证您的环境配置:

echo "=== 环境检查报告 ===" echo "=== Java环境 ===" java -version echo "Java路径: $(which java)" echo -e "\n=== JMH组件检查 ===" find ~ -name "*jmh*" -type f 2>/dev/null | head -10 find ~ -name "*.jar" | grep -E "(jmh|jopt|commons)" 2>/dev/null echo -e "\n=== 系统信息 ===" uname -a gcc --version | head -1 make --version | head -1 echo -e "\n=== 构建工具检查 ===" autoconf --version | head -1

3.1. 基础环境准备

3.1.1. WSL2环境设置

# 确认WSL2版本 wsl --version # 进入WSL2环境 wsl.exe

3.1.2. 安装构建依赖

# 安装基础构建工具 sudo apt-get install -y \ make \ build-essential \ autoconf \ wget # 安装JDK构建所需的开发库 sudo apt-get install -y \ libasound2-dev \ libcups2-dev \ libffi-dev libfreetype6-dev \ libx11-dev \ libxext-dev \ libxrender-dev \ libxrandr-dev \ libxtst-dev \ libxt-dev \

3.1.3. 准备Boot JDK

# 确认Boot JDK路径(已验证的实际路径) export BOOT_JDK_PATH="/usr/lib/jvm/java-17-openjdk-amd64" java -version # 验证Boot JDK配置成功

3.2. JMH依赖准备

#在项目根目录下执行以下命令获取JMH依赖: bash make/devkit/createJMHBundle.sh

3.3. JDK配置与构建

3.3.1. 清理之前的构建

完全清理(包括配置)

# 进入Kona JDK源码目录(根据您的实际路径) cd ~/TencentKona-17.0.16 # 完全清理构建目录和配置 rm -rf build/

仅清理编译产物(保留配置)

# 如果只想清理编译产物而保留configure配置 make clean # 或者更彻底的清理(但保留配置) make dist-clean

说明

  • rm -rf build/:完全删除构建目录,需要重新运行configure
  • make clean:只清理编译产物,保留configure生成的配置文件
  • make dist-clean:清理更多临时文件,但仍保留配置

3.3.2. 配置构建参数

简化版本(推荐)

./configure \ --build=x86_64-linux-gnu \ --host=x86_64-linux-gnu \ --target=x86_64-linux-gnu \ --with-toolchain-type=gcc \ --with-jmh=build/jmh/jars

完整版本(显式指定所有参数)

./configure \ --with-debug-level=release \ --with-native-debug-symbols=internal \ --with-jvm-variants=server \ --enable-unlimited-crypto \ --disable-warnings-as-errors \ --with-toolchain-type=gcc \ --with-boot-jdk=/usr/lib/jvm/java-17-openjdk-amd64 \ --with-jmh=build/jmh/jars

参数说明

  • /home/xsj/jmh/jars是我的JMH安装路径,请您更换成自己的
  • 简化版本依赖configure脚本的自动检测和默认值
  • Boot JDK会自动从系统路径中检测
  • 大多数参数会使用适合的默认值
  • 如果自动检测失败,可以使用完整版本显式指定

3.3.3. 执行构建

make make build-microbenchmark

3.3.4. 验证构建结果

# 设置构建后的JDK环境变量 export JAVA_HOME="$PWD/build/linux-x86_64-server-release/images/jdk" export PATH="$JAVA_HOME/bin:$PATH" # 验证JDK版本 java -version

4. 执行JMH基准测试

我写了两个独立的JMH基准测试类:

  1. ECKeyPairGeneratorBench.java - 椭圆曲线密钥对生成性能测试
  2. RSAKeyPairGeneratorBench.java - RSA密钥对生成性能测试

在进行上述环境配置和JDK构建之后,运行如下命令即可执行JMH测试类:

# 运行EC密钥对生成器测试 make test TEST="micro:ECKeyPairGeneratorBench" MICRO="OPTIONS=-prof gc" # 运行RSA密钥对生成器测试 make test TEST="micro:RSAKeyPairGeneratorBench" MICRO="OPTIONS=-prof gc"

5. JMH测试代码

5.1. EC密钥对生成器测试

package org.openjdk.bench.java.security; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Level; import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Param; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; import org.openjdk.jmh.annotations.Warmup; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.spec.ECGenParameterSpec; import java.util.concurrent.TimeUnit; @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.SECONDS) @State(Scope.Thread) @Warmup(iterations = 5, time = 1) @Measurement(iterations = 5, time = 1) @Fork(value = 3) public class ECKeyPairGeneratorBench { @Param({"SunEC"}) private String provider; @Param({"secp256r1", "secp384r1", "secp521r1"}) private String curve; private KeyPairGenerator kpg; private SecureRandom random; @Setup(Level.Trial) public void setup() throws Exception { random = new SecureRandom(); kpg = KeyPairGenerator.getInstance("EC", provider); kpg.initialize(new ECGenParameterSpec(curve), random); } @Benchmark public KeyPair generate() { return kpg.generateKeyPair(); } }

5.2. RSA密钥对生成器测试

package org.openjdk.bench.java.security; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Level; import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Param; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; import org.openjdk.jmh.annotations.Warmup; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.spec.RSAKeyGenParameterSpec; import java.util.concurrent.TimeUnit; @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.SECONDS) @State(Scope.Thread) @Warmup(iterations = 5, time = 1) @Measurement(iterations = 5, time = 1) @Fork(value = 3) public class RSAKeyPairGeneratorBench { @Param({"SunRsaSign"}) private String provider; @Param({"2048", "3072", "4096"}) private int keySize; private KeyPairGenerator kpg; private SecureRandom random; @Setup(Level.Trial) public void setup() throws Exception { random = new SecureRandom(); kpg = KeyPairGenerator.getInstance("RSA", provider); kpg.initialize(new RSAKeyGenParameterSpec(keySize, RSAKeyGenParameterSpec.F4), random); } @Benchmark public KeyPair generate() { return kpg.generateKeyPair(); } }

6. JMH测试结果

EC密钥对生成器测试的结果

RSA密钥对生成器测试的结果