高性能Tomcat:漫谈行走在sendfile之上的Tomcat

标签: 基础技术 sendfile Tomcat | 发表时间:2015-08-07 10:37 | 作者:importnewzz
出处:http://www.importnew.com

Tomcat常用的三种IO模式

提起高性能JAVA IO大家一定会想到NIO,AIO等等,然而我们的Tomcat是java写的一个优秀的开源的web服务,它与NIO有什么关系呢?我们的tomcat应用是不是早就跑在nio之上了呢?

答案是Tomcat是支持NIO的,到Tomcat7为止,默认的Tomcat包里面的配置并没有开启NIO连接器。下面我先简单介绍一下Tomcat的三种IO策略:BIO,NIO,APR。

BIO:大家是否记得我们初学网络编程的时候,我们写的第一个服务器程序……,BIO是Tomcat默认开启的IO模式,性能灰常底下,没有经过任何的优化处理。

NIO:利用JAVA的非阻塞IO技术,开启这个模式非常简单,只需要把tomcat子目录conf下面的server.xml修改一下即可,找到下面,将protocol改为org.apache.coyote.http11.Http11NioProtocol即可。

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
上面是默认的配置,我们改成下面这个样子:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
               connectionTimeout="20000"
               redirectPort="8443" />

这样重启你的tomcat就好,有没有被easy到?

APR:这种模式使用起来最优门槛,除非要将上面的配置改成下面这样:

<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
               connectionTimeout="20000"
               redirectPort="8443" />

还需要下载APR模式需要的库,因为这种模式是基于JNI的,即JAVA调用本地库的方式来进行IO。

Tomcat对静态资源的处理

大家都知道,Tomcat为我们提供了一个专门用来处理静态资源的Servler,它叫DefaultServlet,看看这个Servlet的源代码,其中对资源处理方法的实现里面有下面这样一段:

if (ostream != null) {
                    if (!checkSendfile(request, response, cacheEntry, contentLength, null))
                        copy(cacheEntry, renderResult, ostream);
                } else {
                    copy(cacheEntry, renderResult, writer);
                }

作者的意思是这里判断如果没有满足使用sendfile条件的情况下我们就直接将静态资源数据读取,写入response的输出流,那么如果满足使用sendfile条件,这里是不做处理的,这里会把资源文件的大小即名称放在request的属性集合里面带给底层,让底层来处理。

Tomcat定义了三种类型的Endpoint,他们分别是BIO,NIO及APR三种模式下底层网络处理的具体实现,比如NioEndpoint里面调用了FileChannel的transferTo方法,transferTo会利用操作系统的sendfile系统调用来将磁盘文件输出到网络。同样AprEndpoint最为哦APR方式的实现会调用Native来实现IO。

send和sendfile

Tomcat中的NIO模式和APR模式对静态文件处理的高效根源在于地从对不同的系统调用,和普通的文件传输不同的是NIO和APR方式都使用的操作系统的sendfile系统调用来对文件进行IO,而普通的方式是使用了read和write系统调用。name这两种类型有什么不同呢,这是本文的关键点:

文件读取以发送至网络流程图

先看看上面这张图,使用read和write方式的时候,将文件输出到网络的流程是这样的:

1,read操作先将线程从用户态切换到内核态,将文件从磁盘读到内核缓冲器。

2,read将文件从内核缓冲区读到用户地址空间,同时线程从内核态切换到用户态。

3,read返回。

4,对文件进行处理

5,write将线程从用户态切换到内核态,将文件写到操作系统内核网络部分的缓冲区。

6,write将线程切换到用户态并返回。

上面的的过程涉及到四次操作系统内核态与用户态的切换,代价是昂贵的。由于事实上我们并不需要对静态文件进行处理这个步骤,为什么要绕一个圈子呢从内核copy到用户态又copy到内核态呢,因此sendfile来了。

我们再来看看sendfile的处理流程:

1,将文件读到操作系统的内核缓冲区。

2,将文件copy到操作系统跟网络相关的内核缓冲区。

上面不会涉及到内核态到用户态以及用户态到内核态的切换,sendfile是linux2+version提供的系统调用,而且在linux2.4+version版本之后提供能zero-copy特性,上面这些说明了sendfile为我们的程序提高了问静态文件处理的能力和性能。

相关文章

相关 [性能 tomcat 行走] 推荐:

高性能Tomcat:漫谈行走在sendfile之上的Tomcat

- - ImportNew
Tomcat常用的三种IO模式. 提起高性能JAVA IO大家一定会想到NIO,AIO等等,然而我们的Tomcat是java写的一个优秀的开源的web服务,它与NIO有什么关系呢. 我们的tomcat应用是不是早就跑在nio之上了呢. 答案是Tomcat是支持NIO的,到Tomcat7为止,默认的Tomcat包里面的配置并没有开启NIO连接器.

Tomcat性能优化

- - 操作系统 - ITeye博客
Tomcat容器内的优化. 前面我们对Tomcat启动时的命令进行了优化,增加了系统的JVM可使用数、垃圾回收效率与线程阻塞情况、增加了系统响应效率等还有一个很重要的指标,我们没有去做优化,就是吞吐量. 还记得我们在第三天的学习中说的,这个系统本身可以处理1000,你没有优化和配置导致它默认只能处理25.

Tomcat 生产服务器性能优化

- - ITeye博客
增加JVM堆(heap). 线程池(thread pool)的设置. Tomcat原生库(native library). 第一步  – 提高JVM栈内存Increase JVM heap memory. 要更改文件(catalina.sh) 位于"\tomcat server folder\bin\catalina.sh",下面,给出这个文件的配置信息,.

(转载)Tomcat性能调优方案

- - 开源软件 - ITeye博客
对于操作系统优化来说,是尽可能的增大可使用的内存容量、提高CPU的频率,保证文件系统的读写速率等. 经过压力测试验证,在并发连接很多的情况下,CPU的处理能力越强,系统运行速度越快. 应该选择SUN的JVM,在满足项目需要的前提下,尽量选用版本较高的JVM,一般来说高版本产品在速度和效率上比低版本会有改进.

使用JMeter对Tomcat进行压力测试与Tomcat性能调优

- - ITeye博客
      1、安装JDK1.6或1.6版本以后的,并配置环境变量. 这个exception的原因是 apache-jmeter-2.12_src.zip中的bin目录中,缺少了ApacheJemeter.jar.所以要下载binary版本的.      3、在Apache的官网上下载Tomcat,本文中以Tomcat7.0.42为例.

Tomcat 7优化前及优化后的性能对比

- - 企业架构 - ITeye博客
Tomcat 7在我们日常开发、测试、生产环境都会使用到,但对于大部分开发人员来说,对其性能还是没有多大了解. 本文就对它做一次性能测试,对比优化前后的性能区别. 内存:4G,装的是32位win7,只认出3G,没有花时间去整ramdisk之类的东西;. 操作系统:win7 32位;. 大家不要笑,公司电脑,就给配这样的,慢的要死,悲剧.

Mysql Tomcat C3p0 系统性能调优个人总结

- - CSDN博客数据库推荐文章
应用逻辑 就是用c3p0 到数据库查询数据并http返回Json数据. 1 调优前的最初的测试结果   JMeter test result. 这个数据是从程序的log 中打印出的 数据库select语句 中得出的结果(正确与否后面会有讨论). 2 经过IOD系统打印 SQL query 的执行时间 和 tomcat 每个request 的 响应时间,找出 系统瓶颈 是因为一个 select语句 使用了 in:.

如何对应用服务性能问题诊断(Tomcat、Weblogic中间件) - luihengk

- - 博客园_首页
在我们web项目中,我们常见的web应用服务器有Tomcat、Weblogic、WebSphere. 它们是互联网应用系统的基础架构软件,也叫“中间件”,负责处理动态在页面请求,并为应用提供了名字、事务、安全、消息、数据访问等,此外,它们还是提供应该构建的开发、部署、运行及管理功能. 当我们对项目做性能测试时,我们如何更好地监控它们,并诊断出性能问题呢.

tomcat调优

- - 开源软件 - ITeye博客
1          概述. 本文档主要介绍了Tomcat的性能调优的原理和方法. 可作为公司技术人员为客户Tomcat系统调优的技术指南,也可以提供给客户的技术人员作为他们性能调优的指导手册. 2          调优分类. 由于Tomcat的运行依赖于JVM,从虚拟机的角度我们把Tomcat的调整分为外部环境调优和自身调优两类来描述.

Tomcat 优化

- - 编程语言 - ITeye博客
tomcat默认参数是为开发环境制定,而非适合生产环境,尤其是内存和线程的配置,默认都很低,容易成为性能瓶颈. linux修改TOMCAT_HOME/bin/catalina.sh,在前面加入. windows修改TOMCAT_HOME/bin/catalina.bat,在前面加入. 最大堆内存是1024m,对于现在的硬件还是偏低,实施时,还是按照机器具体硬件配置优化.