起因
之前项目都是基于python+flask开发,由于业务需要,有部分业务需要使用golang进行重构(小白刚接触golang一个月
),在重构之后的测试过程中,发现重构之后的性能反倒没有提升,竟然下滑了....
问题表现
所有源码地址:BugDocs/src/goEncrypt
在做登录接口测试时,发现接口响应居然很慢,我这里放出一张移除业务的代码测试结果:
测试环境:
shellGo 1.19 Python 3.9.13 werkzeug 2.2.3 循环迭代次数 1024
上图中,左右两个框是golang编译前后的执行耗时,中间的是Python的执行耗时,golang用时92s左右,Python用时70s左右,相差20几秒???纳尼,什么情况???
问题排查
由于是Web项目,使用go提供的pprof进行排查。在server启动中导入CPU占用分析工具
import _ "net/http/pprof"
, 开始对server进行性能测试,测试过程中使用go tool pprof http://127.0.0.1:8080/debug/pprof/profile
在命令行中获取当前cpu执行情况,通过top 10
及top cum 10
查看cpu占用及过去cpu占用情况,得到的结果如下:shellShowing top 10 nodes out of 35 flat flat% sum% cum cum% 295.63s 62.87% 62.87% 295.64s 62.88% crypto/sha256.block 29.22s 6.21% 69.09% 453.22s 96.39% golang.org/x/crypto/pbkdf2.Key 22.54s 4.79% 73.88% 328.80s 69.93% crypto/sha256.(*digest).Write 19.77s 4.20% 78.09% 341.29s 72.59% crypto/sha256.(*digest).checkSum 18s 3.83% 81.92% 18s 3.83% runtime.memmove 16.01s 3.41% 85.32% 17.08s 3.63% runtime.(*itabTableType).find 13.21s 2.81% 88.13% 13.24s 2.82% crypto/sha256.consumeUint32 6.66s 1.42% 89.55% 27.11s 5.77% crypto/sha256.(*digest).UnmarshalBinary 6.45s 1.37% 90.92% 390.41s 83.03% crypto/hmac.(*hmac).Sum 6.30s 1.34% 92.26% 355s 75.50% crypto/sha256.(*digest).Sum (pprof) top -cum 10 Showing nodes accounting for 42.15s, 8.96% of 470.19s total Dropped 561 nodes (cum <= 2.35s) Showing top 10 nodes out of 35 flat flat% sum% cum cum% 0.05s 0.011% 0.011% 464.12s 98.71% net/http.(*conn).serve 0.01s 0.0021% 0.013% 460.42s 97.92% net/http.(*ServeMux).ServeHTTP 0 0% 0.013% 460.42s 97.92% net/http.serverHandler.ServeHTTP 0.03s 0.0064% 0.019% 460.39s 97.92% net/http.HandlerFunc.ServeHTTP 0.08s 0.017% 0.036% 460.35s 97.91% goweb/views.Login 0 0% 0.036% 453.26s 96.40% goweb/utils.CheckPasswordHash 0.01s 0.0021% 0.038% 453.25s 96.40% goweb/utils.hashInternal 29.22s 6.21% 6.25% 453.22s 96.39% golang.org/x/crypto/pbkdf2.Key 6.45s 1.37% 7.62% 390.41s 83.03% crypto/hmac.(*hmac).Sum 6.30s 1.34% 8.96% 355s 75.50% crypto/sha256.(*digest).Sum
解决过程
baidu....,得到一篇帖子crypto/sha256: optimize sha256 implementation #34037
尝试修改,修改代码如下:
goimport ( // "crypto/sha256" // 不用这个包了 "github.com/minio/sha256-simd" // 改用这个 )
继续测试,测试结果如下,测试环境同上:
此时,时间来到了55s左右
解决方案
尝试修改,修改代码如下:
goimport ( // "crypto/sha256" // 不用这个包了 "github.com/minio/sha256-simd" // 改用这个 )