登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  linux

openssl speed 怎么公平比较不同算法的吞吐量

来源:17golang原创

时间:2026-11-05 15:33:01 230浏览 收藏

openssl speed 怎么公平比较不同算法的吞吐量

公平比较的关键是固定算法类别、调用路径、数据块大小、计时方式和并行度,再比较同一列。以 SHA-256 和 SHA-512 为例,可以统一使用 EVP 摘要接口、16384 字节缓冲区、5 秒窗口和墙钟计时。得到的是当前机器上该实现处理数据的速度,不能据此认定哪个算法更安全,也不能直接当作业务接口吞吐量。

官方地址:https://docs.openssl.org/3.5/man1/openssl-speed/

本文以 OpenSSL 3.5 的命令语义说明方法,示例没有实际运行,不提供虚构的性能数字。其他版本应按其对应手册选择可用选项。

先准备一份同类算法测试配方

先确认版本和可用摘要,然后只测目标算法。不要直接运行不带算法参数的整套测试,再从不同类型的结果中挑一个最大数。

# 记录构建信息,并确认本机提供的摘要算法
openssl version -a
openssl list -digest-algorithms

# 两条命令使用相同接口、数据块、窗口和计时方式,串行运行
openssl speed -elapsed -seconds 5 -bytes 16384 -evp sha256
openssl speed -elapsed -seconds 5 -bytes 16384 -evp sha512

-evp 让摘要或密码算法通过 EVP 路径接受测试;这里选择两个摘要,便于比较相同任务。不要把摘要的字节吞吐量、公钥签名次数和密钥协商次数放进同一张排名表。命令支持某个名字,只说明当前配置存在相应实现。

把环境条件写成配料表

算法名字相同,实际实现仍可能受到版本、构建、provider、属性查询以及硬件优化路径影响。对照测试需要使用同一个 OpenSSL 可执行文件,并保持配置、CPU 资源和后台负载尽量一致。如果机器处于共享环境,结果应标记为该环境下的测量,不能包装成硬件的固定能力。

条件本例约定改变后的影响
算法任务EVP 摘要换成签名后计量对象不同
缓冲区长度16384 字节小块调用开销与大块处理占比不同
计时elapsed,5 秒窗口CPU 时间与墙钟时间的分母不同
并行方式不传 -multi多进程结果包含更多并行资源
实现配置同版本、同 provider 条件可能切换到不同实现
摘要吞吐量对照中的共同条件与算法变量
只让算法作为对照变量,其余测试条件保持一致。

若使用了 -provider、-provider-path、-propquery 或 -config,应在全部对照命令中采用相同设置,并记录完整命令。不要为一条命令加载额外 provider,却把另一条命令的默认实现结果并入同组。异步作业和缓冲区对齐设置也属于应固定的条件。

计时窗口与数据块分别控制什么

-seconds 5 指定基准测试的时间窗口;当命令涉及多个测试用例时,不应理解为整条命令总共只运行 5 秒。-bytes 16384 指定密码、摘要或随机数相关测试使用的缓冲区大小,并不是让程序总共只处理 16384 字节,也不适用于把 RSA 操作变成该长度的字节吞吐量。

-elapsed 使用墙钟时间,而不是 CPU 用户时间作为除数。在受调度影响的机器上,这两种分母可能得出不同读数。它让本例的口径明确,但并不能消除机器争用、降频或后台活动。因此要固定计时方式,并保留环境备注。

-multi 会并行执行操作。若需要研究多进程整体处理能力,可另建一组固定进程数的测试;不要把它和本例无该选项的结果混用。对于 AEAD 密码,-aead 使用类似 TLS 的记录操作序列,其结果也不能随意并入普通 EVP 密码测试,更不代表 TLS 握手速度。

读结果时先确认列,再换算单位

摘要与对称密码结果关注处理的字节数和时间。默认结果可能含多个缓冲区长度列,应按相同长度对照;本例通过 -bytes 明确指定长度。不同列的最大值不能当作同一条件的算法胜负。

OpenSSL 3.5 的输出源码会对较大的普通吞吐读数除以 1000 并加 k 后缀;这里的 k 是十进制千倍,不能当作 bit/s 或二进制 KiB/s。换算前要结合输出模式和后缀,而不是只凭表头把每一个裸数字都再乘 1000。公钥测试中的 sign/s、verify/s 则属于每秒操作次数,不能套用字节单位。

吞吐量、操作次数与业务速度的含义区分
结果的单位和测试对象共同决定哪些数据可以放在一起比较。

-mr 是机器可读输出选项,并非 JSON 或 CSV。3.5 源码中摘要和密码吞吐字段按未附加 k 后缀的每秒字节数输出;采集时应按对应版本的记录格式解析,保留缓冲区长度与算法关联,不要照搬普通文本显示时的单位处理逻辑。

重复几轮,保存波动而不是只选最好一轮

第一轮和后续轮次可能因环境变化而不同。下面以三轮、两种块大小记录原始输出,奇偶轮交换算法顺序,减少固定先后顺序带来的偏差。它不是消除全部噪声的统计保证;如果三轮差异明显,应增加轮次并先排查负载条件。

# 建立独立记录目录;所有算法串行执行,避免互相争用
mkdir -p speed-results
openssl version -a > speed-results/version.txt

for round in 1 2 3; do
  # 交换先后顺序,并保留每一种块大小的单独结果
  if [ "$round" -eq 2 ]; then
    algorithms="sha512 sha256"
  else
    algorithms="sha256 sha512"
  fi
  for size in 1024 16384; do
    for algo in $algorithms; do
      # 标准输出和错误输出一起保存,失败时停止,不能把失败算成零吞吐
      openssl speed -elapsed -seconds 5 -bytes "$size" -evp "$algo" \
        > "speed-results/${round}-${size}-${algo}.txt" 2>&1 || exit 1
    done
  done
done

汇总时,每个块大小单独列出每轮值、统一单位后的中位数和范围,并注明版本、计时与并行设置。若发生不支持算法、加载失败等错误,应保存错误原因并处理环境问题,不应将失败项填为 0,或删除失败轮后声称数据稳定。

算法缓冲区每轮吞吐汇总
sha2561024 字节待实测填写中位数及范围待填
sha5121024 字节待实测填写中位数及范围待填
sha256 / sha51216384 字节分别记录只在同长度内比较

几个容易混淆的问题

大块领先,小块落后,哪个算法更快?应分别报告对应块大小的结果,再选择贴近实际消息长度的口径。不能用大块数据替代大量小消息场景。

跑分更高就该替换业务算法吗?不能。测试没有覆盖协议约束、兼容性、数据结构与具体安全要求;本文只比较实现处理速度,不给出生产密钥或算法替换结论。

为什么本机结果和别人不同?先比较版本、provider、CPU、块长度、elapsed 与并行度。条件不同,数值不同不一定意味着哪一方测错。

可以直接当成接口 QPS 吗?不能。speed 测试的库内处理不包含业务请求、网络、存储和完整协议流程。保留“该机器、该实现、该块大小、该计时口径”的限定,结论才有可比性。

参考:OpenSSL 3.5 speed 官方手册;OpenSSL 3.5 speed 输出实现。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>