Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Jetty服务器架构及调优.v2 2011-5

13,765 views

Published on

Jetty服务器架构以及调优

Published in: Design, Technology

Jetty服务器架构及调优.v2 2011-5

  1. 1. Jetty服务器架构及调优 淘宝-商品线-清虚 2011-5-1
  2. 2. Agenda Jetty 简介 Jetty 体系结构 Jetty 使用&配置语法 Jetty 容器启动过程 Jetty 请求处理过程 Jetty 性能调优 Jetty 扩展话题
  3. 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. 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. 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
  6. 6. Jetty@taobao已经在线上运用的 Web 旺旺 TOP正在选型的应用 Detail Buy
  7. 7. Jetty容器做了什么?监听某端口,例 如8080, 8009 ,等待用户连接请求接受用户连接、数据根据协议解析用户请求,例如 HTTP协议 ,AJP协议URL映射到具体上下文,即某个应用转交给Servlet处理器URL映射具体的Servlet执行Servlet返回响应数据
  8. 8. Jetty服务器架构 Server ContextHandlerCollection Connector WebAppContext 请求 SessionHandler ServletHandler Endpoint客 FilterChain ServletHolder户 响应端 Filter Servlet ThreadPool
  9. 9. Jetty使用方式我们有两种方式使用Jetty:•以内嵌容器形式运行 内嵌于其他应用程序,例如eclipse、Jboss 需要应用程序组装Jetty的各大组件 可能需要Jetty的XML解析•以Standalone 形式运行 作为独立服务器运行 需要jetty解析器解析所有etc/jetty-xx.xml文件组装各大组件
  10. 10. 以内嵌容器方式运行范例Server server = new Server(); //入口点Connector connector = new SelectChannelConnector(); //选择Connectorconnector.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();
  11. 11. 以Standalone 形式运行目录结构:
  12. 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. 13. 命令行解析&模块加载 start.ini start.config jetty-xxx.xml
  14. 14. start.ini语法释义以行为解析单位--help、--stop、--version、--list-modes、--list-options、--list-config、--version、 --exec、--daemon、--secure-D开头的参数作为系统参数- 开头将作为JVM 参数OPTIONS参数,模块参数其他表示容器需要的jetty-xxx.xml
  15. 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
  16. 16. start.config语法释义 $(name) 从系统属性或启动属性中获取值 ${name}从启动属性中获取值 类似[ssl,default]将文件分为两部分,OPTIONS中指定 的模块会在这里匹配 [Server,All,deploy,default] $(jetty.home)/lib/jetty-deploy-$(version).jar
  17. 17. Jetty-xxx.xml语法 将xml语法映射到 java语法 非常类似于Spring的IOC和DI 解析和装配完全由start.config中的MainClass: org.eclipse.jetty.xml .XmlConfiguration完成
  18. 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 = neworg.eclipse.jetty.util.thread.QueuedThreadPool(); threadPool.setMinThreads(10);threadPool.setMaxThreads(1000);server.setThreadPool(threadPool);
  19. 19. Jetty服务器组件的组装
  20. 20. Connector启动 协议支持: ᅳHTTP ᅳAJP IO支持 ᅳBIO (阻塞) ᅳNIO(非阻塞) 注:AJP只有BIO实现
  21. 21. Connector启动过程(NIO):
  22. 22. 连接建立过程(NIO):
  23. 23. 请求处理过程(NIO):
  24. 24. Servlet处理过程:Server.handle()ContextHandlerCollection.handle()URL context mapping 到指定的WebAppContextWebAppContext.handle()ServletHandler.handle()Path Mapping找到相应的Filter、Servlet构建FilterChain,顺序执行Filter.doFilter()最后执行Servlet.service(),并返回响应
  25. 25. Jetty 性能调优 一般调优的基本过程 明了需要调优的系统架构 设定性能调优的目标 明了目标当前的性能情况 找出目前的性能瓶颈的所在 解决引起性能瓶颈的根本问题 重复以上过程直到达到设定目标性能为止
  26. 26. Jetty 性能调优点 线程池 Connectors JVM Content Cache 冗余组件去除
  27. 27. Jetty性能调优点-线程池 线程池线程资源大小确定了服务器的服务能力 默认大小不一定能满足生产环境 线程分配方式决定了服务器的资源利用效率 固定线程数处理多任务,代表:JDK的ThreadPoolExecutor 以最大线程数为限处理多任务,代表:Jetty自带QueuedThreadPool Work-stealing 分配,Jetty目前没有这个实现 Jetty中配置实例:
  28. 28. Jetty性能调优点-Connectors选择Connector时,需要考虑 应用自身的特点,例如股票、聊天室 TCP 连接数 Keep-AliveJava BIO Connectors SocketConnector (HTTP) Ajp13SocketConnector (AJP) SslSocketConnector(SSL)Java NIO Connectors SelectChannelConnector(HTTP) SslSelectChannelConnector(SSL)
  29. 29. Jetty性能调优点-ConnectorsAcceptors •表示同时在监听read事件的线程数 •默认值是 1 •典型值范围 1~(处理器内核数+1) •对于NIO 来说,设置为(处理器内核数+1)比较合适maxIdleTime •表示连接最大空闲时间 •默认值是 200000,一般这个值都太大了 •典型值 3000 左右足够 •对AJP来说一般设置为-1,表示连接需要一直保持
  30. 30. Jetty性能调优点-ConnectorsLowResourcesMaxIdleTime •表示线程资源稀少时的maxIdleTime •默认值是 -1,表示没有设置 •一般设置值应该<=maxIdleTimelowResourcesConnections •只有NIO才有这个设置,表示连接空闲时的连接数,大于这个数将被shutdown •默认值是 0,表示该设置没有生效 •每个acceptor的连接数=(lowResourcesConnections+acceptors-1)/acceptors
  31. 31. Jetty性能调优点-ConnectorsAcceptQueueSize •连接被 accept 前允许等待的连接数 •即Socket的Backlog ,默认 50SoLingerTime •具有指定逗留时间(以毫秒为单位) •即socket的setSoLinger,默认关闭ResolveNames •是否反查 getRemoteHost() •默认false
  32. 32. Jetty性能调优点-JVMJVM参数调整主要涉及两个方面 堆/栈内存大小调整 •Xmx/xms 最大/最小堆大小 •xmn 新生代大小 •-XX:MaxPermSize 持久代堆大小 垃圾分配回收算法 •考虑暂停时间、吞吐量选择不同算法 •串行/并行/并发收集
  33. 33. Jetty性能调优点-Content cache动态内容不会被cache静态内容才会被cachemaxCacheSize 256,000,000maxCachedFileSize 200,000,000maxCachedFiles 2,048useFileMappedBuffer true可以通过etc/webdefault.xml配置
  34. 34. Jetty性能调优点-冗余组件去除去除多余的Connector去除不需要的构建Handler 例如SessionHandler,ServletHandler
  35. 35. Jetty扩展话题-处理器体系 1. 集合类handler 2. 代理类handler 3. 生成响应类handlerpublic void handle( String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response ) throws IOException, ServletException;
  36. 36. Jetty扩展话题-类加载类加载器原则: •双亲委托优先 •全盘负责Jetty自定义的classloader •JETTY_HOME/libWebApp自定义类加载器 •WEB-INF/lib •WEB-INF/classes •可以设定parent优先
  37. 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
  38. 38. Q&A

×