在线上环境中我们是采用了tomcat作为Web服务器,它的处理性能直接关系到用户体验,在平时的工作和学习中,归纳出以下七种调优经验。
1. 服务器资源
服务器所能提供CPU、内存、硬盘的性能对处理能力有决定性影响。
(1) 对于高并发情况下会有大量的运算,那么CPU的速度会直接影响到处理速度。
(2) 内存在大量数据处理的情况下,将会有较大的内存容量需求,可以用-Xmx -Xms -XX:MaxPermSize等参数对内存不同功能块进行划分。我们之前就遇到过内存分配不足,导致虚拟机一直处于full GC,从而导致处理能力严重下降。
(3) 硬盘主要问题就是读写性能,当大量文件进行读写时,磁盘极容易成为性能瓶颈。最好的办法还是利用下面提到的缓存。
2. 利用缓存和压缩
对于静态页面最好是能够缓存起来,这样就不必每次从磁盘上读。这里我们采用了Nginx作为缓存服务器,将图片、css、js文件都进行了缓存,有效的减少了后端tomcat的访问。
另外,为了能加快网络传输速度,开启gzip压缩也是必不可少的。但考虑到tomcat已经需要处理很多东西了,所以把这个压缩的工作就交给前端的Nginx来完成。可以参考之前写的《利用nginx加速web访问》。
除了文本可以用gzip压缩,其实很多图片也可以用图像处理工具预先进行压缩,找到一个平衡点可以让画质损失很小而文件可以减小很多。曾经我就见过一个图片从300多kb压缩到几十kb,自己几乎看不出来区别。
3. 采用集群
单个服务器性能总是有限的,最好的办法自然是实现横向扩展,那么组建tomcat集群是有效提升性能的手段。我们还是采用了Nginx来作为请求分流的服务器,后端多个tomcat共享session来协同工作。可以参考之前写的《利用nginx+tomcat+memcached组建web服务器负载均衡》。
4. 优化tomcat参数
这里以tomcat7的参数配置为例,需要修改conf/server.xml文件,主要是优化连接配置,关闭客户端dns查询。
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443" maxThreads="500" minSpareThreads="20" acceptCount="100" disableUploadTimeout="true" enableLookups="false" URIEncoding="UTF-8" />
5. 改用APR库
tomcat默认采用的BIO模型,在几百并发下性能会有很严重的下降。tomcat自带还有NIO的模型,另外也可以调用APR的库来实现操作系统级别控制。
NIO模型是内置的,调用很方便,只需要将上面配置文件中protocol修改成org.apache.coyote.http11.Http11NioProtocol,重启即可生效。上面配置我已经改过了,默认的是HTTP/1.1。
APR则需要安装第三方库,在高并发下会让性能有明显提升。具体安装办法可以参考http://www.cnblogs.com/huangjingzhou/articles/2097241.html。安装完成后重启即可生效。如使用默认protocal就是apr,但最好把将protocol修改成org.apache.coyote.http11.Http11AprProtocol,会更加明确。
在官方找到一个表格详细说明了这三种方式的区别:
Java Blocking Connector Java Nio Blocking Connector APR/native Connector BIO NIO APR Classname AjpProtocol AjpNioProtocol AjpAprProtocol Tomcat Version 3.x onwards 7.x onwards 5.5.x onwards Support Polling NO YES YES Polling Size N/A maxConnections maxConnections Read Request Headers Blocking Sim Blocking Blocking Read Request Body Blocking Sim Blocking Blocking Write Response Blocking Sim Blocking Blocking Wait for next Request Blocking Non Blocking Non Blocking Max Connections maxConnections maxConnections maxConnections
6. 优化网络
Joel也明确提出了优化网卡驱动可以有效提升性能,这个对于集群环境工作的时候尤为重要。由于我们采用了linux服务器,所以优化内核参数也是一个非常重要的工作。给一个参考的优化参数:
1. 修改/etc/sysctl.cnf文件,在最后追加如下内容: net.core.netdev_max_backlog = 32768 net.core.somaxconn = 32768 net.core.wmem_default = 8388608 net.core.rmem_default = 8388608 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.ip_local_port_range = 1024 65000 net.ipv4.route.gc_timeout = 100 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 1200 net.ipv4.tcp_timestamps = 0 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_syn_retries = 2 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_mem = 94500000 915000000 927000000 net.ipv4.tcp_max_orphans = 3276800 net.ipv4.tcp_max_syn_backlog = 65536 2. 保存退出,执行sysctl -p生效
7. 让测试说话
优化系统最忌讳的就是只调优不测试,有时不适当的优化反而会让性能更低。以上所有的优化方法都要在本地进行性能测试过后再不断调整参数,这样最终才能达到最佳的优化效果。
补充Bio、Nio、Apr模式的测试结果:
对于这几种模式,我用ab命令模拟1000并发测试10000词,测试结果比较意外,为了确认结果,我每种方式反复测试了10多次,并且在两个服务器上都测试了一遍。结果发现Bio和Nio性能差别非常微弱,难怪默认居然还是Bio。但是采用apr,连接建立的速度会有50%~100%的提升。直接调用操作系统层果然神速啊,这里强烈推荐apr方式!
详见http://passover.blog.51cto.com/2431658/732629
分享到:
相关推荐
通过深入学习Tomcat 8.0的源码,我们可以理解Web服务器的工作原理,提升对Java Web开发的理解,甚至为自己的项目提供优化方案。以下将对Tomcat 8.0的核心组件和关键流程进行详细的阐述。 一、启动流程 Tomcat的启动...
通过深入学习Tomcat源码,不仅可以提升对Web服务器的理解,还能为开发高性能、高可用的Web应用打下坚实基础。在系统开源的世界里,Tomcat源码分析是一门不可或缺的课程,它将带领我们步入更深层次的技术探索。
针对Tomcat服务器的配置优化也是提升系统性能的关键步骤之一。具体的调优指南请参考《tomcat6性能调优.docx》。 #### 五、Hibernate调参 Hibernate作为常用的ORM框架,在数据库交互过程中起着至关重要的作用。通过...
学习GlusterFS可以了解其架构、卷类型(如条带化、镜像、分布式条带化)、挂载和管理方法,以及如何利用其提高存储性能和可靠性。 总结起来,这个压缩包包含了Linux系统安全、防火墙配置、Web服务部署、负载均衡...
这部分讲解了如何在Eclipse中配置和使用Tomcat服务器,使得开发者能在Eclipse中便捷地调试和部署Java Web应用。 三、SERVLET: Servlet是Java Web开发中的关键部分,用于扩展Web服务器的功能。在这一部分,介绍了...
Java Web开发技术是构建互联网应用程序的关键领域,涵盖了服务器端编程、网页交互以及数据库管理等多个方面。这个名为"Java Web开发技术大全.zip"的压缩包显然包含了一整套的学习资源,旨在帮助开发者深入理解和掌握...
2. Spring Boot:简化Java Web应用的开发,内置Tomcat服务器,易于配置和部署。 3. JWT(JSON Web Tokens):用于用户身份验证,安全传输用户信息。 4. Redis:缓存频繁访问的数据,提升系统性能。 5. RabbitMQ/...
Spring Boot内置了Tomcat服务器,可以快速启动应用,并提供了自动配置功能,极大地提高了开发效率。 七、Spring Cloud Spring Cloud是基于Spring Boot的微服务开发工具集,它提供了服务发现、配置中心、负载均衡、...
负载均衡技术可以分散服务器压力,提升系统可用性。 七、测试与部署 12. 单元测试:JUnit是Java的单元测试框架,用于验证各模块功能正确性。集成测试则确保各模块协同工作。 13. 部署:Tomcat或Jetty等Servlet容器...
在项目中,你需要配置服务器(如Apache Tomcat)以及添加相应的库,比如Servlet和JSP相关的API。 ### 二、JSP基础 JSP是Java Servlet技术的一种视图表现形式,它允许在HTML代码中嵌入Java代码,从而实现动态网页的...
- **优化**: 索引(Indexing)、分表(Splitting)等技术对于提升性能至关重要。 #### 二、数据库基础 - **数据库概念**: 数据库是按照一定结构存储和组织数据的集合,能够有效地管理和检索数据。 - **常用数据库**: ...
- **XML、Tomcat**:了解XML的基本知识,掌握Tomcat服务器的配置和使用。 - **HTTP协议**:理解HTTP请求/响应的工作机制。 - **Servlet API**:熟悉Servlet生命周期及常用API。 - **Filter、Listener**:学习过滤器...
- **Tomcat服务器**:配置与部署。 - **Servlet生命周期**:理解Servlet的工作原理。 - **请求与响应对象**:Request、Response等。 - **会话跟踪技术**:Session、Cookie。 - **JSP页面**:学习JSP指令、脚本...
2. **内嵌式服务器:**支持使用内嵌Tomcat、Jetty或Undertow作为Web容器,极大地简化了部署过程。 3. **独立运行:**SpringBoot应用可以被打包成JAR文件直接运行,无需外部容器支持。 4. **简化配置:**使用默认配置...
- **服务器**:Apache Tomcat,用于部署和运行JSP应用程序。 - **数据库**:SQL Server 2008,通过JDBC连接数据库进行数据交互。 #### 三、系统功能设计 ##### 1. 用户模块 - **注册与登录**:支持学生和管理员两...
部署方面,Java应用程序可以运行在各种服务器环境中,如Tomcat、Jetty等,以支持大量用户的同时访问。 总之,MyMovie项目展示了Java在开发复杂应用程序时的强大能力,结合优秀的软件设计原则和现代技术,为用户打造...