Golang Go语言可以支持 tls 硬件加速吗

发布于 1周前 作者 sinazl 来自 Go语言

如 qat 或者 cpu multi buffer


Golang Go语言可以支持 tls 硬件加速吗
11 回复

我看 crypto 包下的源码,一般都是用的汇编封装好函数,go 再调用

更多关于Golang Go语言可以支持 tls 硬件加速吗的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


cgo 直接调用 c 函数就行了

有,用的汇编指令

可以跑 crypto/cipher/benchmark_test.go 的 bench 看一下



<br>cpu: Intel(R) Core(TM) i5-9400F CPU 2.90GHz<br>BenchmarkAESGCM/Open-128-64-6 13946174 85.62 ns/op 747.52 MB/s 0 B/op 0 allocs/op<br>BenchmarkAESGCM/Seal-128-64-6 11389120 104.6 ns/op 611.97 MB/s 0 B/op 0 allocs/op<br>BenchmarkAESGCM/Open-256-64-6 12128635 98.54 ns/op 649.48 MB/s 0 B/op 0 allocs/op<br>BenchmarkAESGCM/Seal-256-64-6 10137523 116.3 ns/op 550.22 MB/s 0 B/op 0 allocs/op<br>BenchmarkAESGCM/Open-128-1350-6 3813538 312.5 ns/op 4320.03 MB/s 0 B/op 0 allocs/op<br>BenchmarkAESGCM/Seal-128-1350-6 3184155 375.1 ns/op 3599.46 MB/s 0 B/op 0 allocs/op<br>BenchmarkAESGCM/Open-256-1350-6 2947183 409.8 ns/op 3294.57 MB/s 0 B/op 0 allocs/op<br>BenchmarkAESGCM/Seal-256-1350-6 2575678 463.2 ns/op 2914.70 MB/s 0 B/op 0 allocs/op<br>BenchmarkAESGCM/Open-128-8192-6 857240 1379 ns/op 5940.85 MB/s 0 B/op 0 allocs/op<br>BenchmarkAESGCM/Seal-128-8192-6 705914 1695 ns/op 4833.48 MB/s 0 B/op 0 allocs/op<br>BenchmarkAESGCM/Open-256-8192-6 630681 1906 ns/op 4298.59 MB/s 0 B/op 0 allocs/op<br>BenchmarkAESGCM/Seal-256-8192-6 546186 2160 ns/op 3793.24 MB/s 0 B/op 0 allocs/op<br>BenchmarkAESCFBEncrypt1K-6 798397 1497 ns/op 680.68 MB/s<br>BenchmarkAESCFBDecrypt1K-6 921312 1260 ns/op 808.48 MB/s<br>BenchmarkAESCFBDecrypt8K-6 118597 9964 ns/op 821.68 MB/s<br>BenchmarkAESOFB1K-6 1331312 894.8 ns/op 1138.78 MB/s<br>BenchmarkAESCTR1K-6 1000000 1130 ns/op 901.82 MB/s<br>BenchmarkAESCTR8K-6 136078 8650 ns/op 946.43 MB/s<br>BenchmarkAESCBCEncrypt1K-6 1232721 970.3 ns/op 1055.38 MB/s<br>BenchmarkAESCBCDecrypt1K-6 1311703 911.8 ns/op 1123.09 MB/s<br>PASS<br>

咋理解

默认应该不支持吧,不然 binary 扔 amd 不就炸了。感觉这事得问 intel ,用它的库。

BenchmarkAESGCM/Open-128-1350-6 3813538 312.5 ns/op 4320.03 MB/s 0 B/op 0 allocs/op
为例:

这是 AES 加密的 gcm 模式的解密,密钥为 128 位的,解密数据块大小位 1350 字节,跑这个 Bench 总共跑了 3813538 次,平均每次 300ns, 解密速度达到 4GB/s ,每次操作分配了 0 字节内存,分配了 0 次内存

表示用了硬件加速了嘛比如 IntelCPU 的 aes 啥的

肯定有的,没有那岂不太弱鸡了

Go 是直接面向 CPU 架构编译的,特定架构是肯定会包含一些关键指令集的。特殊加速指令集就不知道了,就算不能直接用加速代码一般也会有纯算法实现的替代。

Go1.18 的时候出了架构细分,可以指定架构等级

https://github.com/golang/go/wiki/MinimumRequirements#amd64
Go 1.18 introduced 4 architectural levels for AMD64. Each level differs in the set of x86 instructions that the compiler can include in the generated binaries:

GOAMD64=v1 (default): The baseline. Exclusively generates instructions that all 64-bit x86 processors can execute.
GOAMD64=v2: all v1 instructions, plus CMPXCHG16B, LAHF, SAHF, POPCNT, SSE3, SSE4.1, SSE4.2, SSSE3.
GOAMD64=v3: all v2 instructions, plus AVX, AVX2, BMI1, BMI2, F16C, FMA, LZCNT, MOVBE, OSXSAVE.
GOAMD64=v4: all v3 instructions, plus AVX512F, AVX512BW, AVX512CD, AVX512DQ, AVX512VL.

作为IT营GO语言方面的专家,对于Golang是否支持TLS硬件加速的问题,我可以给出以下回答:

Golang确实可以支持TLS硬件加速。在较新的Go语言版本中,对TLS 1.3的支持已经相当成熟,而TLS 1.3本身在加密算法和密钥协商机制上进行了优化,有助于提升TLS连接的性能。此外,Go语言在运行时会根据系统的硬件特性进行优化,包括在可能的情况下利用硬件加速来提高TLS处理的效率。

具体来说,在支持AES硬件加速的CPU上,Go语言的TLS实现会优先选择AES-XXX-GCM系列的加密算法,以充分利用硬件加速带来的性能提升。同时,Go语言也提供了灵活的配置选项,允许开发者根据实际需求选择适合的TLS版本和加密算法。

除了Go语言自身的优化外,还可以通过使用支持硬件加速的TLS库或工具来进一步提升TLS处理的性能。此外,对于需要处理大量TLS连接的应用场景,还可以考虑采用多线程/多goroutine并发处理机制,以充分利用多核处理器的性能优势。

综上所述,Golang支持TLS硬件加速,并且开发者可以通过多种方式来优化TLS处理的性能。

回到顶部