背景
我们的业务中大量的使用了RSA加密后的数据包,每个数据包大概17-30K不等,因为从php迁移到go,RSA解密业务是无法避免的,之前一直以为迁移后go的解密速度即使没有php快,但也应该相同因此使用了go中x509.ParsePKCS1PrivateKey和rsa.DecryptPKCS1v15实现解密业务。
测试过程
我们使用go版本是1.15.13,实现解密业务后,我们对程序进行解析压测时发现go实现解密比php要慢1倍,这个结果让我们很惊讶,经过review代码和重新验证设置的环境变量后发现确实要慢1倍。
排查
这样的结果是没办法接受的,因此尝试从1.15升级到1.19看看有没有什么变化,以下为开发mac测试结果,m1 16g
go1.15.13 解密花费时间:38-41ms
Go1.19.4 解密花费时间:20ms
从结果上看,1.19版本能提高2倍左右,于是果断升级到1.19后打包上线
上线效果
1.19的tag上线后,解密并没有任何变化,这让人匪夷所思从本地的测试的结果上看确实提升了2倍,于是把tag扔到了cpu为amd的测试机上,跑出来的效果是没升级版本前的效果,这时候有些慌了。
再次排查
于是重新开始梳理,仔细思考了下php为什么会比go快,突然想到php其实直接调用的是c,而在go中我们并没有直接使用cgo,也许就是这个原因吧。重新开始翻查rsa的包,发现1.19比1.15多了boring.go和notboring.go的文件,于是好奇进去看了看,有这么一句话引起了注意,翻译过来就是,如果使用boring必须设置CGO_ENABLED = 1,boringCrypto = 1
于是抱着试一试的心态去进行了环境变量设置,设置方法如下
CGO_ENABLED=1 GOEXPERIMENT=boringcrypto
重新打包后测试,性能提升符合预期,完美解决。
鸣谢
这里要感谢组内的同事,特别是一个97的同事。