云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

虚拟主机_网易免费企业邮箱_返利

小七 141 0

英特尔频率缩放的危险

在我写这篇文章时,我将新的高通服务器芯片Centriq与我们目前的英特尔Skylake Xeon产品进行比较时,我注意到了一个令人不安的现象。在对openssl1.1.1dev进行基准测试时,我发现密码ChaCha20-Poly1305的性能不能很好地伸缩。在单线程上,它的执行速度大约为2.89GB/s,而在24个内核和48个线程上,它的执行速度略高于35gb/s。Blumbroum的CC BY-SA 2.0图像这是一个非常高的数字,但是我希望看到更接近69GB/s的数据。35GB/s只是1.46GB/s/core,或者大约是单核性能的50%。AES-GCM可扩展得更好,达到单核性能的80%,这是可以理解的,因为CPU可以在单核上支持更高频率的turbo,但不是所有核心。为什么ChaCha20-Poly1305的缩放如此之差?了解AVX-512。AVX-512是一个新的英特尔指令集,它添加了许多新的512位宽的SIMD指令,并将大部分现有指令提升到512位。如此宽泛的指令的问题在于它们消耗能量。强大的动力。假设一条指令执行64条常规字节指令,或8条完整的64位指令。为了控制电源,英特尔推出了一种叫做动态频率缩放的技术。每当使用AVX2或AVX-512指令时,它都会降低处理器的基频。这并不是什么新鲜事,自从Haswell三年前推出AVX2以来,它就一直存在。当更多的内核执行AVX-512和使用乘法时,缩放会变得更糟。如果你只运行AVX-512代码,那么一切都很好。频率较低,但你的整体生产力较高,因为每一条指令都要做更多的工作。openssl1.1.1dev实现了ChaCha20-Poly1305的几个变体,包括AVX2和AVX-512变体。BoringSSL实现了ChaCha20-Poly1305的不同AVX2版本。因此,与OpenSSL的2.89GB/s相比,BoringSSL在单核上仅能实现1.6GB/s,这是可以理解的。那么,如果你把AVX-512和你的实际工作量混在一起,这对你有什么影响呢?XeCP2.1GUS采用双频配置,采用银色基频。从我在wikichip上发现的一个数据来看,在这个CPU上运行AVX-512甚至只在一个内核上运行,都会将基频降低到1.8GHz。在所有核心上运行AVX-512将把它降低到1.4GHz。现在假设您使用Apache或NGINX运行一个web服务器。此外,您还有许多其他服务,执行一些真正的,重要的工作。如果您开始使用AVX-512对ChaCha20-Poly1305进行流量加密,会发生什么情况?这是我问自己的问题。我编译了NGINX的两个版本,一个使用OpenSSL1.1.1dev,另一个使用BoringSSL,并用两个Xeon Silver 4116 cpu将其安装在我们的服务器上,总共有24个内核。我将服务器配置为提供一个中等大小的HTML页面,并对其执行一些有意义的工作。我使用LuaJIT删除换行符和多余的空格,并使用brotli压缩文件。然后,我监视在满载情况下每秒服务的请求数。我得到的是:通过在AES-128-GCM上使用ChaCha20-Poly1305,使用OpenSSL的服务器每秒处理的请求减少了10%。这是一个巨大的数字!这相当于白白放弃了两个核心。有人可能会认为这是由于ChaCha20-Poly1305天生就比较慢。但事实并非如此。首先,BoringSSL与AES-GCM和ChaCha20-Poly1305性能相当。其次,即使只有20%的请求使用ChaCha20-Poly1305,服务器吞吐量也会下降7%以上,当10%的请求是ChaCha20-Poly1305时,服务器吞吐量下降了5.5%。作为参考,15%的TLS请求Cloudflare句柄是ChaCha20-Poly1305。最后,根据perf,当所有请求都是ChaCha20-Poly1305时,AVX-512工作负载只消耗2.5%的CPU时间,而对10%的请求执行ChaCha20-Poly1305时,则不到0.3%。不管怎样,CPU都会减速,因为当它看到AVX-512在所有内核上运行时,它会做什么。很难说在任何给定的时间内,每个内核被限制了多少,但是在使用lscpu进行一些采样时,我发现在执行openssl speed-evp chacha20-poly1305-multi 48基准测试时,它显示的CPU MHz:1199.963,对于使用所有AES-GCM连接的OpenSSL,我得到的CPU MHz:2399.926;对于使用所有ChaCha20-Poly1305连接的OpenSSL,CPU MHz:2184.338,显然慢了9%。另一个有趣的区别是,带有AVX2的ChaCha20-Poly1305在OpenSSL中稍慢,但在BoringSSL中是相同的。为什么会这样?这里的原因是BoringSSL代码对Poly1305不使用AVX2乘法指令,而只对ChaCha20使用简单的xor、shift和add操作,这使得它可以在基频下运行。openssl1.1.1dev仍在开发中,因此我怀疑还没有人受到这个问题的影响。几个月前我们改用了BoringSSL,我们的服务器性能不受此问题的影响。未来是什么还不清楚。英特尔为未来一代CPU发布了非常酷的新ISA扩展,有望进一步提高加密性能。这些扩展包括AVX512+VAES、AVX512+VPCLMULQDQ和AVX512IFMA。但是如果频率缩放问题到那时还没有解决,那么将这些用于通用密码库将弊大于利。问题不在于密码库。OpenSSL试图获得最好的性能并没有做错什么,相反,我自己为OpenSSL编写了相当数量的AVX-512代码。观察到的行为是一个可悲的副作用。有许多库使用AVX和AVX2指令,它们可能会在某个时刻更新到AVX-512,用户不太可能知道实现的细节。如果某些特定的高性能任务不需要AVX-512,我建议您禁用服务器或桌面上的AVX-512执行,以避免意外的AVX-512限制。