勿忘初心

个人签名

530篇博客

测试人员如何提前发现系统性能问题

勿忘初心2018-10-19 18:43


此文已由作者吴桐授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。



前言:


作为的测试人员,希望能够深度参与到系统的详细设计中去,本文以测试人员的角度来讨论一下如何参与到系统的性能优化,将系统可能会存在的性能问题及时反馈给开发人员,这对无论对个人技术成长还是发现更多系统问题都有很大的帮助。


影响性能的因素


影响系统性能的因素一般有以下三个方面:


  • 存在影响性能的代码

  • 未使用常见的优化策略

  • 不合理的参数设置


接下来就分别从几个方面来讨论。


存在影响性能的代码


测试人员平时应该多走读核心功能代码,及时向开发人员反映不合理的代码段。下面列出了几种常见的影响性能的点:


字符串拼接


需要频繁的拼接String的时候,使用\'+\'拼接会影响性能,应该用StringBuilder或者StringBuffer的append反方法来拼接,从执行速度上来讲:StringBuilder > StringBuffer > String,StringBuilder是非线程安全的,StringBuffer是线程安全的。


循环体中做无用操作 


循环体中不要做一些无用或者危险的操作,这样可能会影响系统整体的吞吐量,甚至可能会引起内存泄露。
例如下面这些代码:


// 在循环体内打印了一些无用的日志for(int i = 0; i < len; i++) {
    logger.info('循环第几次了')
}// 在循环中new对象for(int i = 0; i < len; i++) {
    Object o = new Object()
}// 在循环体内try-catchfor (int i = 0; i < size; i++) {   
    try {   
            sum += i;   
        } catch (exception e) {
            dosomething()
        }
}

采用位运算效率更高


需要进行简单计算时应优先考虑使用逻辑运算符,这样对cpu的使用是最高效的。
例如下面这些常见的例子:


// 一个数乘以2x*4  -->  x << 2// 一个数除以2y/2  -->  y >> 1// 判断一个数是否是偶数z%2 != 0 --> (z&1)!=0

无用的判断条件 


有些代码经过好几拨人来维护,有些if判断语句里面充满了各种不知做什么用的判断条件,应该将那些没有用的判断条件去掉,这对系统来说也是一部分开销。例如:springMVC框架里面对一些请求参类型的判断应该用Filter来统一处理,而不应该放在代码层面做判断。


未使用常见的优化策略


测试人员虽然不需要懂太高深的设计模式或者优化方案,但是一些常见的优化策略还是要了解一些的,当开发人员没有使用这些优化策略时,应该及时给出建议。下面列出了一些场景的优化手段。


使用连接池 


连接池是解决连接复用的问题,当系统需要发起网络连接或者数据库连接的时候,应当尽量使用连接池。
举个例子:
后台系统模块常常存在依赖关系,现在常见的依赖调用方式有两种,一种就是通过RPC(如dubbo)调用,另外一种就是通过http调用,java里面应该优先使用支持连接池的httpclient来发起http调用。


sql加索引


当发现某些SQL语句出现满查询时,有可能是SQL语句写得不合理,或者数据库表应该加索引,此时应该及时向开发同学反馈,避免系统上线后引起事故。
PS:定位SQL语句执行效率的手段有explain SQL或者Profile,另外也可以借助哨兵系统强大的SQL监控来辅助排查。


使用缓存 


后台系统有用户常用的数据,例如用户的个人信息、session等,这些信息应该存放在缓存中,而不是每次请求都从数据库中取。常用的缓存服务有memcache、redis等。如果开发已经使用了缓存,应该关注缓存数据有没设置过期,会不会存在缓存击穿的情况等。


采用异步 


同步任务会长时间hold住一个线程资源,会影响系统整体的吞吐量,所以有些处理时间比较长的请求应该用异步来处理,异步可以借助于消息中间件或者本地有界队列等方式来实现。


不合理的参数设置


合理的设置后台系统的一些参数配置,也是提升性、能避免事故的重要手段。常见的参数设置有下面这些。


超时时间 


超时时间是最常见也是最重要的参数,设置不合理,在网络不佳的情况下,会影响系统的吞吐量,甚至会出现请求堆积把服务\"拖死\"的情况。下面列出了一下常见的超时时间设置的经验值,这些值只是供参考,具体服务还是要具体对待。


服务 超时时间
http调用 1000ms
缓存访问 50ms
数据库 2000ms
RPC调用 1000ms


其中RPC调用最好关闭重试机制,时间设定精确到refence method级别。此外,这些只是建议值,具体的业务还得具体对待。


连接池大小 


连接池大小的设置要根据系统的负载能力和时间的请求量来综合评估,设置过大会占用过多的机器资源,过小也不利于系统的整体吞吐量。具体设置多大应该结合具体的业务来反复测试。


jvm参数 


JVM虚拟机影响系统性能主要体现在这三个方面:


  • Stop world 时间过长 

  • FullGC频繁 

  • Cpu/IO 负载高 通过合理合理设置JVM的参数可以有效的解决这三个问题。


网易云免费体验馆,0成本体验20+款云产品! 

更多网易技术、产品、运营经验分享请点击


相关文章:
【推荐】 react技术栈实践(2)
【推荐】 浅谈容器监控和网易云计算基础服务实践