系统优化是每个IT同行都有的经历,当系统出现性能问题时,提升性能的方式通常有三个方面:提升硬件、系统调优、软件优化,三种方式各有优缺点:
1、提升硬件:实现方式简单,但成本高,一般是后两种优化还满足不了的情况下采用的模式。
2、系统调优:在系统上线开始运行阶段,随着系统访问量增加,通常由运维人员根据实际情况调谐系统参数(包括系统参数、数据库、应用服务器、web服务器等等)来满足。到一定阶段后,这种方式基本就达到极限。
3、软件优化:每个软件系统在实现过程中,都不可能采用性能最优情况来设计实现,一般做法是在功能达到后,随着实际运行需要,不停进行软件优化来满足系统性能要求。
本文主要讲述笔者一次软件优化经历,希望给马上要进行优化的同行一定的参考经验,也期望抛砖引玉,能看到更多好的案例。
优化对象
系统登陆。
目标
特定硬件条件的单服务器情况下,达到如下要求:
1、TPS>300
2、平均响应时间3秒内
3、10分钟10000用户
环境及工具
1、硬件:
Dell poweredge R430型号:Inter® Xeon® CPUE5-2603 v3@1.70GHz,32GRAM。用Citrix虚拟化出应用服务器和数据库服务器。
应用服务器参数:3-5vCPU,20GRAM,
数据库+Redis服务器:4vCPU,6GRAM
同数据库网络收、发带宽实测均为:2.4-2.5Gbps。
2、应用服务用Docker部署
3、性能测试工具:jmeter5.4.1
4、Zabbix3观察服务器CPU、内存、网络、磁盘等情况
5、其它辅助工具:nethogs、iperf3、RedisDesktopManager等
优化步骤
分析优化对象
1、测试对象所在流程,确定优化主要访问服务链接。
2、分析对象涉及类及方法,以便优化过程中随时修订完善。
3、分析可能受影响的功能。
准备环境
搭建需要用的软硬件环境。
验证测试环境全部准备就绪,使用的测试账号能正常登陆。
单账户测试
初始性能
先测试没优化前具备的性能。
如图所见,系统TPS和响应时间离目标较远。
减少数据库读写
首先排除数据库可能问题。优化方式:所有登陆所需信息,除第一次外均不从数据库读。
如图所见,性能稍微有提升,主要原因是登陆时数据库数据库相关查询少,基本没耗时。
减少磁盘耗时
磁盘读写肯定是性能优化重点考虑的一个方面,需找出优化对象所有涉及磁盘读写的地方进行优化,本次优化涉及:关闭所有日志输出(正式上线提升日志级别)、保存日志到数据库、tomcat不记录localhost_access_log等。
如图所见,很明显TPS和平均响应时间得到近1倍的提升,但还是没达到目标。
提高硬件-增加vCPU
性能优化时,其它方式已试过了,需测试硬件变化带来性能改变情况。硬件主要考虑如下几个方面:网络带宽、磁盘、CPU、RAM。当然,无论哪个方面,都是基于测试过程中,哪个方面反映存在压力才做哪个方面的改变,同时也得具备改变硬件条件才能进行。
具体到本次测试中,观察发现CPU Utiliztion的使用率会达到或超出100%,System Load会15分钟平均负载超过3(3个内核,最好在3以下)。网络带宽每秒读写各100M,读写实际网速测试为2.5Gbps。内存一直稳定,几乎无波动。本次登陆测试涉及到密码的加密,是耗CPU的,因此考虑提升到5vcpu,测试结果如下:
CPU情况改善如下:
如图所见,性能略有提升。
优化带宽
根据多方面分析,CPU、内存、磁盘读写都未达到瓶颈。只有带宽的数据比较大。现在最大带宽已固定,没办法提升,因此考虑减少网络传输量。由于固定一个用户,因此返回值改为固定值,测试结果:
如图所见,性能提升非常夸张,且达到目标。
找到问题后,立即分析问题原因及如何优化。详见系统程序优化实战(下)