以下数据来自我在本地主机上的Windows计算机(SSD)上的测试。 当我从Nginx下载静态内容时,我可以达到120-140 MBps(我敢肯定它可以进一步优化。Nginx实际上声称它可以达到0.98 Gbps的吞吐量)。而且,CPU /内存消耗的增长几乎可以忽略不计。 我已经尝试在tomcat中执行相同的操作,并且下载文件时的最大速度高达25 Mbps。此外,根据任务管理器,这会消耗15-25%的CPU使用率。 我的机器有SSD,所以没有,文件读取不会花费时间或增加CPU使用率。
可以改善文件服务部分吗? I.E提供更快的下载速度,并减少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提供静态内容并没有很好的解决方案来满足这一要求。欢迎提出建议和替代解决方案。