一般调优的基本过程
1.明了需要调优的系统架构
2.设定性能调优的目标
3.明了目标当前的性能情况
4.找出目前的性能瓶颈的所在
5.解决引起性能瓶颈的根本问题
6.重复以上过程直到达到设定目标性能为止
性能指标
崩溃点:同时多少并发的时候,服务器Down掉?
吞吐量:多少人一起来,都没问题?
并发数:每秒能处理多少人?
响应时间:每人需要等待的时间多长?
调优点:
硬件配置优化:
虚拟机
物理机
CPU
内存
磁盘IO
网络
操作系统优化
JVM参数优化
-Xms:设置jvm内存的初始大小
-Xmx:设置jvm内存的最大值
-Xmn:设置新域的大小(这个似乎只对 jdk1.4来说是有效的,后来就废弃了)
-Xss:设置每个线程的堆栈大小(也就是说,在相同物理内存下,减小这个值能生成更多的线程)
-XX:NewRatio :设置新域与旧域之比,如-XX:NewRatio = 4就表示新域与旧域之比为1:4
-XX:NewSize:设置新域的初始值
-XX:MaxNewSize :设置新域的最大值
-XX:PermSize:设置永久域的初始值
-XX:MaxPermSize:设置永久域的最大值
-XX:SurvivorRatio=n:设置新域中Eden区与两个Survivor区的比值。(Eden区主要是用来存放新生的对象,而两个 Survivor区则用来存放每次垃圾回收后存活下来的对象)
容器优化
- 线程池
线程池线程资源大小确定了服务器的服务能力
默认大小不一定能满足生产环境
线程分配方式决定了服务器的资源利用效率
固定线程数处理多任务,代表:JDK的ThreadPoolExecutor
以最大线程数为限处理多任务,代表:Jetty自带QueuedThreadPool
maxThreads:表示最多同时处理的连接数。应该将线程数(最大线程数)设置比最大预期负载(同时并发的点击)多25%(经验规则)(低配置用户可通过降低maxThreads并同时增大
acceptCount值来保证系统的稳定)。
acceptCount:当同时连接的人数达到maxThreads时,还可以接收排队的连接。
minSpareThread:指“启动以后,总是保持该数量的线程空闲等待”;设置比预期负载多25%。
maxSpareThread:指“如果超过了minSpareThread,然后总是保持该数量的线程空闲等待”;设置比预期负载多25%。
其中主要修改两个参数maxThreads和acceptCount值。增加maxThreads,减少acceptCount值有利缩短系统的响应时间。但是maxThreads和acceptCount的总和最高值不能超过6000,而且
maxThreads过大会增加CPU和内存消耗,故低配置用户可通过降低maxThreads并同时增大acceptCount值来保证系统的稳定。
connectionTimeout:连接超时,最大超时时间,当响应速度慢的时候,通过调整该参数,来平衡正确率和服务器资源的回收。
- Connectors
选择Connector时,需要考虑应用自身的特点,例如股票、聊天室.
TCP 连接数 Keep-Alive Java BIO Connectors SocketConnector (HTTP)
Ajp13SocketConnector (AJP) SslSocketConnector(SSL)
Java NIO Connectors electChannelConnector(HTTP) SslSelectChannelConnector(SSL)
Acceptors 表示同时在监听read事件的线程数
默认值是 1 典型值范围 1~(处理器内核数+1)
对于NIO 来说,设置为(处理器内核数+1)比较合适
maxIdleTime 表示连接最大空闲时间 默认值是 200000,一般这个值都太大了
典型值 3000 左右足够
对AJP来说一般设置为-1,表示连接需要一直保持
LowResourcesMaxIdleTime 表示线程资源稀少时的maxIdleTime 默认值是 -1,表示没有设置
一般设置值应该<=maxIdleTime
lowResourcesConnections 只有NIO才有这个设置,表示连接空闲时的连接数,大于这个数将被shutdown
默认值是 0,表示该设置没有生效 每个acceptor的连接数=(lowResourcesConnections+acceptors-1)/acceptors
AcceptQueueSize 连接被 accept 前允许等待的连接数即Socket的Backlog ,默认 50
SoLingerTime 具有指定逗留时间(以毫秒为单位) 即socket的setSoLinger,默认关闭
ResolveNames 是否反查 getRemoteHost() 默认false
- Content Cache
动态内容不会被cache 静态内容才会被cache
maxCacheSize 256,000,000
maxCachedFileSize 200,000,000
maxCachedFiles ?2,048
useFileMappedBuffer ?true
可以通过etc/webdefault.xml配置
- 冗余组件去除
去除多余的Connector 去除不需要的构建Handler 例如SessionHandler,ServletHandler
关闭不必要的服务 例如 jmx-console。(JBoss)
代码优化:
在高峰期,减去日志记录的操作,或者把日志暂时先缓存起来,使用异步处理的方式。
减少一些数据库操作。
减少NC 身份证等匹配方式。
数据库优化:
索引
视图
其他:
压缩css,js,图片
使用浏览器缓存
CDN加速
分布式缓存服务器
集群、负载均衡
调优技巧
1.粗狂的扫点与详细的指标相结合,尽量让验证调优的过程更敏捷,让主要的指标稳定下来,在确定指标前,再使用详细的方式去测出各种指标。
2.分轮测试,在测试结果中,找出各个参数的规律。为调优提供指导数据。
3.在程序增加计数器,验证LR的请求次数。
4.在程序每个步骤,增加多一些时间,检查下,到底是卡在哪个步骤,尤其是操作数据库前后。
Ref:
http://www.sxrczx.com/pages/gordon-tech.lofter.com/post/481906_24eb191.html