作者小司机
编辑椰蓉
系统性能关注的不是系统是否能够完成特定的功能,而是在完成该功能时展示出来的及时性。但由于系统很复杂、体系结构和实现的策略多样,因此很难采用统一的标准去评测所有的系统。今天,笔者整理了自己的互金系统开发和检测经验,给大家分享一些比较通用的性能调优策略。
系统性能测试
首先保证应用服务器和数据库服务器的硬件配置合理,然后使用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逐步加压运行一定时间,观察吞吐率的稳定值是否有提升,直到在相同硬件条件下吞吐率稳定值无法再次提升,说明本次性能调优基本完成。
领取专属 10元无门槛券
私享最新 技术干货