More Related Content Similar to Jetty服务器架构及调优.v2 2011-5 (20) More from lovingprince58 (12) Jetty服务器架构及调优.v2 2011-52. Agenda
Jetty 简介
Jetty 体系结构
Jetty 使用&配置语法
Jetty 容器启动过程
Jetty 请求处理过程
Jetty 性能调优
Jetty 扩展话题
3. Jetty 是什么
HTTP服务器和Servlet/JSP容器
HTTP/1.0、HTTP/1.1
Servlet Specification >= 2.5
提供的诸多支持和特性
OSGI,JNDI,JMX,JASPI,AJP support
Asynchronous HTTP(Continuation)
Flexible and extensible
Small footprint
项目开始于1995年
4. Version Home Java HTTP Servlet JSP Status
HTTP/1.1
8.x Eclipse,codehaus 1.6 3.0 2.1 Experimental
RFC2616
HTTP/1.1
7.x Eclipse,codehaus 1.5,J2ME 2.5 2.1 Stable
RFC2616
HTTP/1.1
6.x codehaus 1.4-1.5 2.5 2.0 Mature
RFC2616
HTTP/1.1
5.x Sourceforge 1.2-1.5 2.4 2.0 Deprecated
RFC2616
HTTP/1.1
4.x Sourceforge 1.2,J2ME 2.3 1.2 Ancient
RFC2616
HTTP/1.1
3.x Sourceforge 1.2 2.2 1.1 Fossilized
RFC2068
HTTP/1.0
2.x Mortbay 1.1 2.1 1.0 Legendary
RFC1945
HTTP/1.0
1.x Mortbay 1.0 Mythical
RFC1945
5. 谁在玩Jetty
Large clusters, such as the Yahoo Hadoop Cluster
Cloud computing, such as the Google AppEngine
SaaS, such as Yahoo! Zimbra
Application Servers, such as Apache Geronimo
Frameworks, such as GWT
Tools, such as the Eclipse IDE
Devices, such as phones
8. Jetty服务器架构
Server
ContextHandlerCollection
Connector
WebAppContext
请求 SessionHandler
ServletHandler
Endpoint
客 FilterChain ServletHolder
户 响应
端 Filter Servlet
ThreadPool
10. 以内嵌容器方式运行范例
Server server = new Server(); //入口点
Connector connector = new SelectChannelConnector(); //选择Connector
connector.setPort(8080); //设定监听端口
server.setConnectors(new Connector[] { connector });
WebAppContext webapp = new WebAppContext(); //设定web 上下文信息
webapp.setContextPath(“/”);
webapp.setWar(“./target/detail.war”);
server.setHandler(webapp); //加入到主控类中
server.start(); //启动服务器
server.join();
12. Jetty 启动方式
•直接快速启动
java –jar $JETTY_HOME/start.jar
温馨提示:默认调用org.eclipse.jetty.start.Main类的main方法
•bash启动
$JETTY_HOME/bin/jetty.sh start
温馨提示:Jetty.sh设定一些启动参数,最后通过start.jar启动服务器
13. 命令行解析&模块加载
start.ini
start.config
jetty-xxx.xml
15. start.config语法释义
SUBJECT [ [!] CONDITION [AND|OR] ]*
SUBJECT:
.class结尾表示要运行的Main类
.xml结尾表示加到命令行后的配置文件
/、/*、/**结尾的表示加入目录中的jar包
包含=表示设置系统属性
包含~=表示设置启动属性
包含/=表示设置规范路径到启动属性
其他的都被当做文件放到classpath中
CONDITION
Always
Never
available classname 在classpath中返回true
property name 启动属性设置了namefan回true
system name
exists file
18. Jetty-xxx.xml语法
<Configure id="server" class="org.eclipse.jetty.server.Server">
<Set name="threadPool">
<New class="org.eclipse.jetty.util.thread.QueuedThreadPool">
<Set name="minThreads">10</Set>
<Set name="maxThreads">1000</Set>
</New>
</Set>
</Configure>
org.eclipse.jetty.server.Server server = new org.eclipse.jetty.server.Server();
org.eclipse.jetty.util.thread.QueuedThreadPool threadPool = new
org.eclipse.jetty.util.thread.QueuedThreadPool(); threadPool.setMinThreads(10);
threadPool.setMaxThreads(1000);
server.setThreadPool(threadPool);
25. Jetty 性能调优
一般调优的基本过程
明了需要调优的系统架构
设定性能调优的目标
明了目标当前的性能情况
找出目前的性能瓶颈的所在
解决引起性能瓶颈的根本问题
重复以上过程直到达到设定目标性能为止
26. Jetty 性能调优点
线程池
Connectors
JVM
Content Cache
冗余组件去除
27. Jetty性能调优点-线程池
线程池线程资源大小确定了服务器的服务能力
默认大小不一定能满足生产环境
线程分配方式决定了服务器的资源利用效率
固定线程数处理多任务,代表:JDK的ThreadPoolExecutor
以最大线程数为限处理多任务,代表:Jetty自带QueuedThreadPool
Work-stealing 分配,Jetty目前没有这个实现
Jetty中配置实例:
28. Jetty性能调优点-Connectors
选择Connector时,需要考虑
应用自身的特点,例如股票、聊天室
TCP 连接数
Keep-Alive
Java BIO Connectors
SocketConnector (HTTP)
Ajp13SocketConnector (AJP)
SslSocketConnector(SSL)
Java NIO Connectors
SelectChannelConnector(HTTP)
SslSelectChannelConnector(SSL)
29. Jetty性能调优点-Connectors
Acceptors
•表示同时在监听read事件的线程数
•默认值是 1
•典型值范围 1~(处理器内核数+1)
•对于NIO 来说,设置为(处理器内核数+1)比较合适
maxIdleTime
•表示连接最大空闲时间
•默认值是 200000,一般这个值都太大了
•典型值 3000 左右足够
•对AJP来说一般设置为-1,表示连接需要一直保持
30. Jetty性能调优点-Connectors
LowResourcesMaxIdleTime
•表示线程资源稀少时的maxIdleTime
•默认值是 -1,表示没有设置
•一般设置值应该<=maxIdleTime
lowResourcesConnections
•只有NIO才有这个设置,表示连接空闲时的连接数,大于这个数将被shutdown
•默认值是 0,表示该设置没有生效
•每个acceptor的连接数=(lowResourcesConnections+acceptors-1)/acceptors
31. Jetty性能调优点-Connectors
AcceptQueueSize
•连接被 accept 前允许等待的连接数
•即Socket的Backlog ,默认 50
SoLingerTime
•具有指定逗留时间(以毫秒为单位)
•即socket的setSoLinger,默认关闭
ResolveNames
•是否反查 getRemoteHost()
•默认false
35. Jetty扩展话题-处理器体系
1. 集合类handler
2. 代理类handler
3. 生成响应类handler
public void handle( String target,
Request baseRequest,
HttpServletRequest request,
HttpServletResponse response )
throws IOException, ServletException;
36. Jetty扩展话题-类加载
类加载器原则:
•双亲委托优先
•全盘负责
Jetty自定义的classloader
•JETTY_HOME/lib
WebApp自定义类加载器
•WEB-INF/lib
•WEB-INF/classes
•可以设定parent优先
37. 参考
• http://eclipse.org/jetty/
• http://www.webtide.com/choose/jetty.jsp
• http://performancewiki.com/home.html
• http://blogs.sun.com/watt/resource/jvm-options-list.html
• http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf