Tomcat并发文件上载的最大数量

Tomcat并发文件上载的最大数量,tomcat,file-upload,scalability,servlets,Tomcat,File Upload,Scalability,Servlets,我有一个具有250个连接线程的Tomcat服务器。当我模拟30个文件(每个100 MB)的并发文件上载时,服务器机器的CPU和RAM内存将达到峰值,即95%的使用率 我使用以下代码块从HTTPPOST读取文件数据 // request is instance of HTTPServletRequest int nDataLength = request.getContentLength(); byte dataBytes[] = new byte[nDataLength]; int byte

我有一个具有250个连接线程的Tomcat服务器。当我模拟30个文件(每个100 MB)的并发文件上载时,服务器机器的CPU和RAM内存将达到峰值,即95%的使用率

我使用以下代码块从HTTPPOST读取文件数据

// request is instance of HTTPServletRequest
int nDataLength = request.getContentLength();

byte dataBytes[] = new byte[nDataLength];

int bytesRead = 0;
int totalBytesRead = 0;
int bytesLimit = 1024;

InputStream in = new InputStream(request.getInputStream());
try
{
    while(totalBytesRead < nDataLength)
    {
        bytesRead = in.read(dataBytes, totalBytesRead, bytesLimit);
        totalBytesRead  += bytesRead;
    }
}
catch(Exception ex)
{
    throw ex;
}
finally
{
    in.close();
}
//请求是HTTPServletRequest的实例
int-ndalength=request.getContentLength();
字节数据字节[]=新字节[n数据长度];
int字节读取=0;
int totalBytesRead=0;
int字节数限制=1024;
InputStream in=新的InputStream(request.getInputStream());
尝试
{
while(总字节读取<数据长度)
{
bytesRead=in.read(数据字节、totalBytesRead、bytesLimit);
totalBytesRead+=字节读取;
}
}
捕获(例外情况除外)
{
掷骰子;
}
最后
{
in.close();
}
我的疑问是:

  • Tomcat服务器可以处理的最大并发文件上载数(每个100MB文件)是多少
  • 我的代码中是否需要任何优化来使用所有250个连接线程
  • 引入
    睡眠
    可能会导致长时间上传。如何编写高效的代码
提前谢谢

问候,, 金斯利鲁本J


注意:我无法使用第三方应用程序来解决此问题

您应该将接收到的数据写入一个临时文件(以较小的块,例如8KB),因为30*100MB=3GB,并且可能您的机器开始分页内存。吞吐量受到接口适配器的限制。

原始解决方案的内存不足,因此stacker的建议(将数据存储在文件中)应该有效。通过http将文件上传到tomcat对于批量上传来说并不理想


您可以尝试使用更简单的服务器/更高效的协议(如ftp)或配置应用程序服务器和应用程序,以查看瓶颈所在。我想到的一件事是,HTTP上传必须进行MIME解码。

很难给出一个明确的答案。这取决于许多因素:您的机器(CPU、RAM)提供的电源、此任务旁边的负载、您希望如何处理上载的文件(存储或其他处理),可用的bandwith…服务器计算机除了接收和存储文件外,没有任何其他进程。此外,该计算机有8 GB RAM,带有双核处理器。不要手动执行此操作,请使用适当的库,如Commons FileUpload()。没有错误,可适当扩展。读取数据后,我尝试将区块数据存储到磁盘。RAM使用率已大幅降低。但CPU使用率仍然很高。@Kingsley Reuben遵循skaffmans的建议,使用可扩展库。或者,如果你想让你的手弄脏进程,找出谁是作恶者