配置优化的关键词:JVM,连接池,线程池,缓存机制,CDN等优化手段,这些优化提高了资源利用率,有大限度的压榨服务器性能。
一.JVM配置优化:
合理的分配堆和非堆堆内存,配置适合堆内存回收算法,提高系统服务的能力
二.连接池:
数据库连接池可以节省建立连接和关闭连接的资源消耗
三.线程池:
通过缓存线程的状态来减少新建线程与关闭线程的开销,一般是在中间件中进行配置,比如在Tomcat的server.xml文件中进行配置
这个配置通常在开发项目的类似application-common.properties这种文件里,
最大线程数:server.tomcat.max-threads=256
那么就引入了一个问题:max-threads并不是越大越好,为什么呢?
分两种情况:第一种极端纯计算型,那么系统相应时间的主要限制就是cpu的运算能力,降低同一时间内争抢cpu的线程个数可以提高计算效率,提高系统的整体处理能力
第二种情况:如果是纯粹的IO或数据库,那么响应时间的主要限制就变为等待外部资源,此时maxthreads应该尽量设置的大,这样才能同时处理请求的个数,从而提高系统整体的处理能力,此情况下因为tomcat同时处理的请求数比较大,还要关注tomcat的虚拟机内存设置和linux的openfile限制
四.缓存机制:
通过数据的缓存来减少磁盘的读写压力,缩小存储与CPU的效率差
==========================================================================================
鉴于第二点连接池引申出
2.1 数据库连接池优化
数据库连接池存在的意义是让连接复用,通过建立一个数据库连接池(缓冲区)以及一套连接使用,分配,管理策略,使得连接池中的连接可以高效,安全的复用,避免了数据库连接频繁建立,关闭的开销。
测试中需要关注:1.连接池的配置参数 2.连接池配置多少连接合适 3.监控连接池
原则:按续分配,够用就好,比如以单位是阿金的业务量或者并发数为单位,监控使用了多少连接数,再以此放大,一般来讲,数据库连接池的数量要小于中间件线程池的连接数量
鉴于第三点引申出
3.1 线程优化
系统性能差一般有以下两种表现
第一种是CPU使用率不高,用户感觉交易响应时间很长;
第二种是CPU使用率很高,用户感觉交易响应时间很长。
对于第一种情况,可能是由于系统的某一小部分造成了瓶颈,导致了所有的请求都在等待。比如,线程池的数量开的太小,导致所有的请求都在排队等待进入线程池,因为没有用的线程使用,所以这个交易请求一直在排队,导致交易响应时间很长
对于第二种情况,比较复杂。可能是硬件资源不够,也可能是应用系统中产生了较多大对象,还可能是程序算法等问题。
服务端最佳的线程数量 = ((线程等待时间+线程cpu时间)/线程cpu时间)*cpu数量 单位ms
鉴于第四点引申出
4.1 db优化
通常使用数据库有3个要求,性能好、数据一致性有保障、数据安全可靠;数据库优化的前提也是这3个要求。有一句玩笑话叫着少做少犯错,不做不犯错。DB优化的思路就是少做,减少请求次数,减少数据传输量,减少运算量(查询、排序、统计)。以Oracle为例
大体从下面几个方向进行优化。
(1)优化物理结构,数据库逻辑设计与物理设计要科学高效,比如分区、索引建立、字段类型及长短、冗余设计等。
(2)共享SQL、绑定变量、降低高水位。
(3)查询器优化,特殊情况调整执行计划。指定的执行计划加快查找速度。比如连接查询时指定驱动表,减少表的扫描次数。
(4)单条SQL优化,对单条SQL进行优化分析,比如查询条件选择索引列。
(5)并行SQL,对数据量巨大的表的数据遍历,用多个线程分块处理任务。
(6)减少资源争用(锁、闩锁、缓存),可以提高10效率减小响应时间从而提高吞吐量来缓解争用,比如用缓存;可以物理拆分把热点数据分布在不同表空间。
(7)优化内存、减少物理io访问
SGA (缓存高频访问数据),比如我们把客户信息载到内存中。
PGA (排序、散列)。
AMM (自动内存管理)人工干预。
(8)优化io,进度条带化,读写分离,减少热点。