nginx - 我们可以比 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 提供静态内容并没有很好的解决方案来解决这个要求。欢迎提出建议和替代解决方案。
解决方案
推荐阅读
- node.js - 在 heroku 中部署 angular/Nodejs 应用程序
- jersey - 使用 Keycloak 4.3.0.Final 和 dropwizard 1.3.1
- c# - 你调用的对象是空的。- 抱歉,我无法理解其他发布类似内容的人
- python - 为什么在 python 中非常大的浮点值之间的比较会失败?
- sql - 计算每个类别中的员工(两个表)
- android - 截取屏幕截图,然后存储在外部存储中,然后共享
- javascript - 在jade/pug视图中从mysql中拆分数据
- javascript - 完整日历未显示动态生成的事件
- python - 如何在 Scarpy 中使用 Xpath 选择器选择整个内容
- vim - vim + ESLint:用项目特定的文件覆盖默认的 .eslint 文件