半夜ATM机前看书的那位

导航

Jetty服务器架构及调优

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

  1. Jetty服务器架构及调优 淘宝-商品线-清虚 2011-5-1
  2. 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
  6. Jetty@taobao已经在线上运用的 Web 旺旺 TOP正在选型的应用 Detail Buy
  7. Jetty容器做了什么?监听某端口,例 如8080, 8009 ,等待用户连接请求接受用户连接、数据根据协议解析用户请求,例如 HTTP协议 ,AJP协议URL映射到具体上下文,即某个应用转交给Servlet处理器URL映射具体的Servlet执行Servlet返回响应数据
  8. Jetty服务器架构 Server ContextHandlerCollection Connector WebAppContext 请求 SessionHandler ServletHandler Endpoint客 FilterChain ServletHolder户 响应端 Filter Servlet ThreadPool
  9. Jetty使用方式我们有两种方式使用Jetty:•以内嵌容器形式运行 内嵌于其他应用程序,例如eclipse、Jboss 需要应用程序组装Jetty的各大组件 可能需要Jetty的XML解析•以Standalone 形式运行 作为独立服务器运行 需要jetty解析器解析所有etc/jetty-xx.xml文件组装各大组件
  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. 以Standalone 形式运行目录结构:
  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
  14. start.ini语法释义以行为解析单位--help、--stop、--version、--list-modes、--list-options、--list-config、--version、 --exec、--daemon、--secure-D开头的参数作为系统参数- 开头将作为JVM 参数OPTIONS参数,模块参数其他表示容器需要的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
  16. start.config语法释义 $(name) 从系统属性或启动属性中获取值 ${name}从启动属性中获取值 类似[ssl,default]将文件分为两部分,OPTIONS中指定 的模块会在这里匹配 [Server,All,deploy,default] $(jetty.home)/lib/jetty-deploy-$(version).jar
  17. Jetty-xxx.xml语法 将xml语法映射到 java语法 非常类似于Spring的IOC和DI 解析和装配完全由start.config中的MainClass: org.eclipse.jetty.xml .XmlConfiguration完成
  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. Jetty服务器组件的组装
  20. Connector启动 协议支持: ᅳHTTP ᅳAJP IO支持 ᅳBIO (阻塞) ᅳNIO(非阻塞) 注:AJP只有BIO实现
  21. Connector启动过程(NIO):
  22. 连接建立过程(NIO):
  23. 请求处理过程(NIO):
  24. Servlet处理过程:Server.handle()ContextHandlerCollection.handle()URL context mapping 到指定的WebAppContextWebAppContext.handle()ServletHandler.handle()Path Mapping找到相应的Filter、Servlet构建FilterChain,顺序执行Filter.doFilter()最后执行Servlet.service(),并返回响应
  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
  32. Jetty性能调优点-JVMJVM参数调整主要涉及两个方面 堆/栈内存大小调整 •Xmx/xms 最大/最小堆大小 •xmn 新生代大小 •-XX:MaxPermSize 持久代堆大小 垃圾分配回收算法 •考虑暂停时间、吞吐量选择不同算法 •串行/并行/并发收集
  33. Jetty性能调优点-Content cache动态内容不会被cache静态内容才会被cachemaxCacheSize 256,000,000maxCachedFileSize 200,000,000maxCachedFiles 2,048useFileMappedBuffer true可以通过etc/webdefault.xml配置
  34. Jetty性能调优点-冗余组件去除去除多余的Connector去除不需要的构建Handler 例如SessionHandler,ServletHandler
  35. Jetty扩展话题-处理器体系 1. 集合类handler 2. 代理类handler 3. 生成响应类handlerpublic 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
 

posted on 2011-10-26 17:15  zhizhesky  阅读(6402)  评论(0编辑  收藏  举报