jetty性能优化思路整理

  • Post author:
  • Post category:其他


原博客地址:

http://www.sxrczx.com/pages/gordon-tech.lofter.com/post/481906_24eb191.html

转载过来只是为了收藏,望原博主见谅


一、一般调优的基本过程

1.明了需要调优的系统架构

2.设定性能调优的目标

3.明了目标当前的性能情况

4.找出目前的性能瓶颈的所在

5.解决引起性能瓶颈的根本问题

6.重复以上过程直到达到设定目标性能为止



二、性能指标:

崩溃点:同时多少并发的时候,服务器Down掉?

吞吐量:多少人一起来,都没问题?

并发数:每秒能处理多少人?

响应时间:每人需要等待的时间多长?



三、调优点:

1.硬件配置优化:

虚拟机

物理机

CPU 内存


2、系统优化(Linux)

已经根据门户的方式去优化。


3.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区则用来存放每次垃圾回收后存活下来的对象)

监控内存 CPU

常见的错误 :

java.lang.OutOfMemoryError相信很多开发人员都用到过,这个主要就是JVM参数没有配好引起的,但是这种错误又分两种:java.lang.OutOfMemoryError: Java heap space和

java.lang.OutOfMemoryError: PermGen space,其中前者是有关堆内存的内存溢出,可以同过配置-Xms和-Xmx参数来设置,而后者是有关永久域的内存溢出,可以通过配置-XX:MaxPermSize来设置。


4.容器优化:

a.线程池

<jetty>

线程池线程资源大小确定了服务器的服务能力

默认大小不一定能满足生产环境

线程分配方式决定了服务器的资源利用效率

固定线程数处理多任务,代表:JDK的ThreadPoolExecutor

以最大线程数为限处理多任务,代表:Jetty自带QueuedThreadPool

Work-stealing 分配,Jetty目前没有这个实现 Jetty中配置实例:


<tomcat>

maxThreads:表示最多同时处理的连接数。应该将线程数(最大线程数)设置比最大预期负载(同时并发的点击)多25%(经验规则)(低配置用户可通过降低maxThreads并同时增大

acceptCount值来保证系统的稳定)。

acceptCount:当同时连接的人数达到maxThreads时,还可以接收排队的连接。

minSpareThread:指“启动以后,总是保持该数量的线程空闲等待”;设置比预期负载多25%。

maxSpareThread:指“如果超过了minSpareThread,然后总是保持该数量的线程空闲等待”;设置比预期负载多25%。

其中主要修改两个参数maxThreads和acceptCount值。增加maxThreads,减少acceptCount值有利缩短系统的响应时间。但是maxThreads和acceptCount的总和最高值不能超过6000,而且

maxThreads过大会增加CPU和内存消耗,故低配置用户可通过降低maxThreads并同时增大acceptCount值来保证系统的稳定。

connectionTimeout:连接超时,最大超时时间,当响应速度慢的时候,通过调整该参数,来平衡正确率和服务器资源的回收。


b.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


c.JVM

Jetty性能调优点-JVM

JVM参数调整主要涉及两个方面

堆/栈内存大小调整

Xmx/xms 最大/最小堆大小

xmn 新生代大小

-XX:MaxPermSize 持久代堆大小

垃圾分配回收算法考虑暂停时间、吞吐量选择不同算法

串行/并行/并发收集


d.Content Cache

动态内容不会被cache 静态内容才会被cache

maxCacheSize 256,000,000

maxCachedFileSize 200,000,000

maxCachedFiles ?2,048

useFileMappedBuffer ?true

可以通过etc/webdefault.xml配置


e.冗余组件去除

去除多余的Connector 去除不需要的构建Handler 例如SessionHandler,ServletHandler

关闭不必要的服务 例如 jmx-console。(JBoss)


5.代码优化:

在高峰期,减去日志记录的操作,或者把日志暂时先缓存起来,使用异步处理的方式。

减少一些数据库操作。

减少NC 身份证等匹配方式。


6.数据库优化:

索引

视图


7.其他:

压缩css,js,图片

使用浏览器缓存

CDN加速

分布式缓存服务器

集群、负载均衡



三.调优策略:

a.关键点,找到瓶颈,给瓶颈分配更多的资源,或者减轻其工作量。



四、调优原则

a.每台服务器,所能承载的参数,都会有差异,尤其是内存 CPU的配置不一致。

b.每种服务所需的计算资源各不相同,要根据服务的偏向不同,而去把最好的资源,分配到最需要的地方

c.性能优化,是永恒的话题,没有永久最优解,只能查出目前最优解,是一个不断优化的过程。



五、调优技巧

1.粗狂的扫点与详细的指标相结合,尽量让验证调优的过程更敏捷,让主要的指标稳定下来,在确定指标前,再使用详细的方式去测出各种指标。

2.分轮测试,在测试结果中,找出各个参数的规律。为调优提供指导数据。

3.在程序增加计数器,验证LR的请求次数。

4.在程序每个步骤,增加多一些时间,检查下,到底是卡在哪个步骤,尤其是操作数据库前后。



六、测试的协作经验

1.产品人员,对调优的各个参数,不是很懂,只有在不断的尝试中,去理解和学习各个参数的含义,这样就会产生比较多测试任务。

2.产品人员,没有安排详细的测试计划,使得测试人员,有些迷茫,甚至两边的人员的思路,不是很统一。

3.产品人员,有时比较忙,没顾得及响应,测试人员的问题,沟通也不到位。

2.不是理解这种测试思路?测试的过程中,只是别人说测就测,产品人员给其讲调优思路,调优参数,测试人员,听不懂或者不想去懂,所以就感觉很多个环境,在进行,做了很多次重复工作

3.在产品和测试中,配合中,缺少一种,共同把事情干好的思想,缺少主动去探讨一些问题,缺少主动建议一些问题,更多的是争论一些问题,是对还是错的,当然里面涉及到一些面子因素和一些主动做事的心态。

4.测试的过程不够敏捷,跑一次测试,需要的时间太长,开发人员需要不断得去尝试去理解,对各种参数的理解。开发人员,在调整参数的时候,不需要很清晰得知道,在这种情况下的各种指标是如何,各重要的是,去理解这个参数带来的影响如何。

5.使用正式环境做压力测试,严重影响项目的其他进度的正常使用。是否考虑使用备用机器,做性能测试。(城建)



七、参考资料:

网站性能优化思路

http://blog.sina.com.cn/s/blog_6cbe69e30101e54o.html

Jboss部署及性能调优

http://blog.sina.com.cn/s/blog_7c1092a90101iwhs.html

Jetty和Tomcat的使用及性能测试

http://www.verydemo.com/demo_c199_i12761.html

jetty服务器性能调整过程分析

http://download.csdn.net/detail/wujuan321/4458261

jetty7.5 调 优 文 档(非常好的实例)

http://wenku.baidu.com/link?url=ljZS54Yf4fPE3jbcwr8csKqiBhJJ_YmRlGf8jlCOVWRYNPjFksLRrEQ7e_zD3qjbKAUm4mfAc6iI5VuvqE2PrJvKfaBcCA6s1Ywcn807aCC

Jetty服务器架构及调优(讲得有点多)

http://www.cnblogs.com/zhizhesky/articles/2225460.html