在线上环境中我们是采用了tomcat作为Web服务器,它的处理性能直接关系到用户体验,在平时的工作和学习中,归纳出以下七种调优经验。
1. 服务器资源
服务器所能提供CPU、内存、硬盘的性能对处理能力有决定性影响。
(1) 对于高并发情况下会有大量的运算,那么CPU的速度会直接影响到处理速度。
(2) 内存在大量数据处理的情况下,将会有较大的内存容量需求,可以用-Xmx -Xms -XX:MaxPermSize等参数对内存不同功能块进行划分。我们之前就遇到过内存分配不足,导致虚拟机一直处于full GC,从而导致处理能力严重下降。
(3) 硬盘主要问题就是读写性能,当大量文件进行读写时,磁盘极容易成为性能瓶颈。最好的办法还是利用下面提到的缓存。
2. 利用缓存和压缩
对于静态页面最好是能够缓存起来,这样就不必每次从磁盘上读。这里我们采用了Nginx作为缓存服务器,将图片、css、js文件都进行了缓存,有效的减少了后端tomcat的访问。
另外,为了能加快网络传输速度,开启gzip压缩也是必不可少的。但考虑到tomcat已经需要处理很多东西了,所以把这个压缩的工作就交给前端的Nginx来完成。
除了文本可以用gzip压缩,其实很多图片也可以用图像处理工具预先进行压缩,找到一个平衡点可以让画质损失很小而文件可以减小很多。曾经我就见过一个图片从300多kb压缩到几十kb,自己几乎看不出来区别。
3. 采用集群
单个服务器性能总是有限的,最好的办法自然是实现横向扩展,那么组建tomcat集群是有效提升性能的手段。我们还是采用了Nginx来作为请求分流的服务器,后端多个tomcat共享session来协同工作。
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容器...
- **优化**: 索引(Indexing)、分表(Splitting)等技术对于提升性能至关重要。 #### 二、数据库基础 - **数据库概念**: 数据库是按照一定结构存储和组织数据的集合,能够有效地管理和检索数据。 - **常用数据库**: ...
- **XML、Tomcat**:了解XML的基本知识,掌握Tomcat服务器的配置和使用。 - **HTTP协议**:理解HTTP请求/响应的工作机制。 - **Servlet API**:熟悉Servlet生命周期及常用API。 - **Filter、Listener**:学习过滤器...
在项目中,你需要配置服务器(如Apache Tomcat)以及添加相应的库,比如Servlet和JSP相关的API。 ### 二、JSP基础 JSP是Java Servlet技术的一种视图表现形式,它允许在HTML代码中嵌入Java代码,从而实现动态网页的...
2. **内嵌式服务器:**支持使用内嵌Tomcat、Jetty或Undertow作为Web容器,极大地简化了部署过程。 3. **独立运行:**SpringBoot应用可以被打包成JAR文件直接运行,无需外部容器支持。 4. **简化配置:**使用默认配置...
- **Tomcat服务器**:配置与部署。 - **Servlet生命周期**:理解Servlet的工作原理。 - **请求与响应对象**:Request、Response等。 - **会话跟踪技术**:Session、Cookie。 - **JSP页面**:学习JSP指令、脚本...
- **服务器**:Apache Tomcat,用于部署和运行JSP应用程序。 - **数据库**:SQL Server 2008,通过JDBC连接数据库进行数据交互。 #### 三、系统功能设计 ##### 1. 用户模块 - **注册与登录**:支持学生和管理员两...
部署方面,Java应用程序可以运行在各种服务器环境中,如Tomcat、Jetty等,以支持大量用户的同时访问。 总之,MyMovie项目展示了Java在开发复杂应用程序时的强大能力,结合优秀的软件设计原则和现代技术,为用户打造...