首页 > 解决方案 > 我们可以比 NginX/Apache 更快地从 Tomcat 提供静态文件吗?

问题描述

以下数据来自在本地主机上我自己的 Windows 机器(SSD)上的测试。当我从 Nginx 下载静态内容时,我得到了高达 120-140 MBps(我相信它可以进一步优化。Nginx 实际上声称它可以达到高达 0.98 Gbps 的吞吐量)。这正在完成,cpu/内存消耗的增加几乎可以忽略不计。我尝试在 tomcat 中做同样的事情,下载文件时的最大速度高达 25 Mbps。此外,根据任务管理器,这会消耗 15-25% 的 cpu 使用率。我的机器有一个 SSD,所以不,文件读取不需要时间或增加 CPU 使用率。

文件服务部分可以改进吗?IE 以更少的 CPU 消耗提供更快的下载速度。

<Connector port="29022" protocol="org.apache.coyote.http11.Http11Nio2Protocol" useSendfile="true" connectionTimeout="300000"/>

我正在使用 Nio2 连接器。我应该调整更多的连接器设置,还是使用 Nio/apr 连接器?

所有文件下载请求都使用异步 servlet 调用委托给线程池:request.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true);

来自线程池的线程(线程池大小为 2)将在循环中以循环方式为每个请求提供服务。在每次循环迭代中,执行以下代码以发送大约 8 KB(8192 字节)。

if(bytesSent < toBeServedFileSize){
    if(!buffer.hasRemaining()){
        buffer.clear();
        fileChannel.read(buffer,bytesSent);
        buffer.flip();
    }
    int bytesToWrite = Math.min(buffer.remaining(), streamPacketSize);
    byte[] byteAr = new byte[bytesToWrite];
    for (int i = 0 ; i < bytesToWrite ; i++){byteAr[i] = buffer.get();}
    //I'm guessing below is the most cpu intensive line
    os.write(byteAr);
    //I am guessing above is the most cpu intensive line
    bytesSent += bytesToWrite;
}

本练习的全部目的是对文件下载请求进行身份验证和授权。我认为从 apache/NginX 提供静态内容并没有很好的解决方案来解决这个要求。欢迎提出建议和替代解决方案。

标签: nginxtomcat

解决方案


推荐阅读