我开发了一个简单的 C++ 程序来对 OpenSSL AES/GCM 调用 EVP 接口的性能进行基准测试。它的作用是获取 1024 字节的字符串,使用密钥对其进行加密,然后使用相同的密钥对结果进行加密,如此反复。我正在使用增量 4 字节初始化向量。
当我在 Macbook Pro(Intel i7)上测试它时,结果非常令人印象深刻:在单个内核上运行上述过程的 1048576 次迭代只用了整整一秒钟。这就是 1 GB/s 的加密速度。如果我们同时使用所有核心,则为 8 GB/s(或多或少)。
现在,我在 Raspberry PI 2 上移植了相同的基准测试。然而,当我运行它时,需要 0.16 秒才能完成 1024 次迭代。单核上的速度大约为 6 MB/s。
现在,我显然明白现代、昂贵的 i7 处理器和在 Raspberry 上运行的小型 ARM 处理器之间存在巨大的差异,但速度仍然快了 170 倍。因此,在假设 Raspberry PI 2 真的那么糟糕之前,我想检查一下这些参数是否合理。
有人对此做过某种基准测试吗? 6 MB/s 的加密速度在 Raspberry 上合理吗?还是我做错了什么?
(我通过 Macbook USB 为其供电:会不会因为没有接收到足够的电量而这么慢?这听起来绝对不合理。它根本无法开机,对吧?或者可能有降频机制吗?为了省电?)
更新 1:我在 Macbook 和 Raspberry 上都做了
openssl speed -evp aes-256-cbc
。
在 Macbook 上:
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes
aes-256-cbc 534591.95k 564057.62k 566522.81k 570717.87k 574876.33k
在覆盆子上:
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes
aes-256-cbc 14288.53k 16653.74k 17165.31k 17298.43k 17337.00k
这仍然是 33 倍,但英特尔处理器可以利用硬件加速 AES 调用。不过,据我所知,GCM 模式应该比 CBC 快得多。我不知道为什么,但看起来没有适合 GCM 的 openssl 基准测试,但即使假设它们的性能相同,我也缺少因子 3。
更新2检查此页面:http://elinux.org/RPi_Performance#OpenSSL。看起来我还少了 10 MB/s。总计:使用 AES/CBC 时为 27 MB/s(应该是这样),而使用 AES/GCM 时为 6 MB/s(实际上是这样)。
您的 Intel CPU 有使用 AESNI 扩展的专用硬件支持。 如果不使用它进行编译,您将获得大约 250MB/s 这种性能差异听起来很合理。 (任何 CPU 有多少 GHz 都无法告诉您任何有关性能的信息,除非它是完全相同的 CPU 类型,只是时钟不同)
如果您还没有考虑到这一点,为什么 3 的系数不能用大约 3 倍的处理能力差异来解释?
Raspberry Pi 2 具有 900Mhz 处理器,典型的 i7 处理器具有 2.8Ghz,这导致 Pi 具有大约三分之一的处理能力。
另外,我不知道你从哪里得出这样的结论:在这种情况下 GCM 应该比 CBC 更快。 CBC 不提供身份验证,因此仅此一项就会使 GCM 明显变慢(尽管可能不是您看到的 4 倍)。
当然,当您引入多个核心时,这种情况就会消失,因为 CBC 无法并行化,而 GCM 可以。