用户登录功能:说简单也困难

本文分享自华为云社区《​​性能分析之用户登录TPS低以及CPU被打满问题分析​​》,作者:zuozewei 。

用户登录说起来只是一个很普通的功能,不过它的逻辑一点也不简单。因为登录过程要对个人的信息进行对系统响应时间比验证,验证过程中又要调用相应的加密其他和其它的区别算法,而加密算法和解密算法加密算法是对性能要求很高的一种功能。复杂的加密算法安图片识别全性高,但性能就差;不复杂的加密算法性能好,但安全性高,这是一个取舍的问题。

按照测试方案的基准场景的设计步骤,先压测这个接口的基准场景。

问题现象

如上图所示,这现象老明显了。

压测结果中的 TPS 平均才 25平均响应时间达到了 993 ms。

分析过程

从性能分析逻辑上来说,针对响应时间长的问题,首先要做的就是拆分时间。由于这个系统已经部署了 SkyWalking,用它看看时间主要消耗在了哪里。


                                            用户登录功能:说简单也困难

看图中,Tomcat 的 SelfDuration 是最多的,也就是说时间几乎加密算法分为哪两种消耗在服务本身。

全局监控

首先查看下应用服务器屏幕响应时间的资源水题破山寺后禅院位情况:


                                            用户登录功能:说简单也困难

可以看到4C的CPU资源已经被耗光其他业务收入

这里部署的是容器,先看下各容器资源使用情况:


                                            用户登录功能:说简单也困难

可以看到资源主要被服务容器消耗了响应时间高好还是低好

服务定向分析

首先进入服务容器查看下资源消耗情况:


                                            用户登录功能:说简单也困难

在 SkyWaking 中又看不到完整的调用,考虑直接连到服务 Java 进程中看方法的时间消耗。这里用 Arthas 来跟踪一下。

查看当前最忙的前N个线程并打印堆


                                            用户登录功能:说简单也困难

这里为程序的业务代码。

于是 trace attemptAuthentication 这个方法。


                                            用户登录功能:说简单也困难

接着trace authenticate 这个方法。


                                            用户登录功能:说简单也困难

一层层跟踪下去,最终来到了响应时间这里:

                                            用户登录功能:说简单也困难

既然这个 crypt_raw 方法耗时比较长,那就反编译源其他垃圾代码看看这一段是什么东西。


                                            用户登录功能:说简单也困难

可以看到这里是一个加密算法 BCrypt,那么结论就很明加密算法按照密钥是否相同可以分为显了 BCrypt 加密算法虽然安全性高,但性能差。图片搜索图片识别

demo验证

这里使用题破山寺后禅院 SpringBoot 实现 MD5 加密和 BCr安全生产法ypt 加密的实例。


                                            用户登录功能:说简单也困难

JMeter 并发20 MD5 加密结果:

JMeter 并发20 BCrypt 加密结果:


                                            用户登录功能:说简单也困难

建议优化方向

这里解释一下,Bcrypt在加密时,每一次HASH出来的值是不同的,所以特别慢!

具体什么是 Bcrypt 算法,可以参考这篇文章:​​www.jianshu.com/p/2b131bfc2…​​

分析到这里,优化方案其实比较明确躺平是什么意思了,那就是用更快的加密方式,或者去掉这个加密算法。

​​点击关注,第一时间了解华为云新鲜技术~​​