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