质检老司机带路,手把手教你进行互金系统性能调优!

作者小司机

编辑椰蓉

系统性能关注的不是系统是否能够完成特定的功能,而是在完成该功能时展示出来的及时性。但由于系统很复杂、体系结构和实现的策略多样,因此很难采用统一的标准去评测所有的系统。今天,笔者整理了自己的互金系统开发和检测经验,给大家分享一些比较通用的性能调优策略。

系统性能测试

首先保证应用服务器和数据库服务器的硬件配置合理,然后使用JMeter逐步加压运行一定时间,使用nmon监控应用服务器和数据库服务器的CPU、内存、磁盘IO、网络带宽使用,并观察请求的平均响应时间和吞吐率变化,直到某个压力下吞吐率稳定值开始减小,此时系统性能达到拐点,性能开始下降。

定位性能瓶颈

了解性能优化的朋友都知道,性能优化的关键并不在于怎么进行优化,而在于怎么找到当前系统的性能瓶颈。通常,定位性能瓶颈采用以下几个步骤:

若应用服务器的CPU不高,磁盘IO很高,吞吐率也上不去,则有可能是打印的日志过多导致,需要修改tomcat日志级别。

若数据库服务器的CPU很高,磁盘IO不高,吞吐率也上不去,则有可能是sql语句执行效率过低,需要优化sql语句或建立索引。

若压力下降一段时间后,占用的内存没能恢复到原来的水平,则有可能存在内存泄露的风险。

若CPU、内存、磁盘IO、网络带宽使用均不高,吞吐率也上不去,则可能是系统程序、网络带宽或者配置有问题,需要优化代码、提高网络带宽或优化配置。

常见的性能调优

第一

Tomcat调优

tomcat默认参数是为开发环境制定的,而非生产环境,尤其是内存和线程的配置,默认都很低,容易成为性能瓶颈,生产环境的日志级别一般配置成error或warn,只有开发环境才会配置成info或debug。

Tomcat内存优化

配置TOMCAT_HOME/bin/catalina.sh中的参数:

-Xmx:可以使用的最大内存,设置为内存的一半即可,

-Xms:初始化内存大小,设置为Xmx的一半即可。

Tomcat线程优化

配置TOMCAT_HOME/conf/server.xml中的参数:

maxThreads:最大线程数,决定了服务器可以同时响应请求的最大数量,值不是越大越好,设置略大于最大并发请求数即可(请求操作为磁盘IO或者数据库时该值尽量设大,请求操作为计算时该值尽量设小)。

acceptCount:最大等待线程数,当所有可以使用的处理请求的线程都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,返回connection refused错误,设置和maxThreads一样即可。

minSpareThreads:最小备用线程,初始化时创建的线程数,一般设置为200即可。

maxSpareThreads:最大备用线程,一旦创建的线程超过这个值,tomcat就会关闭不再需要的socket线程,一般设置为300即可。

connectionTimeout:网络连接超时,单位毫秒,通常可设置为20000毫秒。

enableLookups:是否反查域名,为了提高处理能力,应设置为false。

修改日志级别

配置WEB-INF/classes/log4j.properties中的日志级别为error或warn。

第二

数据库调优

性能测试中最常见的问题基本那都是在sql语句低效或缺少索引上,优化sql语句和建立索引是数据库调优最常见的方法。

设置合适的数据库最大连接数

MySQL可以通过配置max_connections参数,Oracle可以通过配置processes和sessions参数。

定位执行效率低的SQL语句

MySQL可以通过慢查询日志查询处理时间超过设置阀值的sql语句,Oracle可以通过内置的AWR记录某段时间内所有操作的sql语句及其处理时间等性能指标。

优化SQL语句

查询时尽量避免全表扫描,建议建立索引;

尽量减少访问数据库的次数;

尽量避免使用*,避免返回无用字段;

where后的字段尽量避免进行null值判断,或者尽量不要插入null的数据;

where后的字段尽量避免使用!=、、in、not in、like(类似'123%'这样的前置查询除外,可以使用到索引);

where后的字段尽量避免使用or来连接;

where后的字段尽量避免使用参数;

where后的字段尽量避免进行函数操作;

where后的=左边尽量避免进行函数运算、算术运算或其他表达式运算

若连接查询中的表数据量均较大,建议改为单表查询,或者改为先分页再join;

尽量使用数字型字段;

尽量使用varchar代替char;

将查询频繁、语句复杂、对应表数据量较大的sql语句查询结果数据放入缓存中或新表中,例如互金系统的平台信息披露。

建立索引原则

主键的字段一定要建立索引;

有外键的字段一定要建立索引;

频繁查询且对应表数据量较大(大于300条记录)的字段最好建立索引,包括where后的字段;

经常在order by、group by、distinct后的字段最好建立索引;

重复值较多的字段不要建立索引,例如性别;

定义为text、image、bit数据类型的字段不要建立索引;

频繁更新的字段不要建立索引;

同一张表中建立的索引不能太多,建议不要超过3个,否则会影响插入、更新数据的速度;

按照字段在查询条件中出现的频率建立复合索引,将出现频度高的字段放置在复合索引的前面。

性能调优完成

每次调优后使用JMeter逐步加压运行一定时间,观察吞吐率的稳定值是否有提升,直到在相同硬件条件下吞吐率稳定值无法再次提升,说明本次性能调优基本完成。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180125G0G4NW00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券