2010-12-14 200 views
1

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

我使用以下代码块从HTTP Post中读取文件数据。

// 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(); 
} 

我的疑惑是:

  • 什么可能是一个Tomcat服务器能够处理的并发文件上传的最大数量(每100个MB的文件)?
  • 在我的代码中是否需要使用所有250个连接线程进行优化?
  • 介绍sleep会导致长时间上传。如何编写高效的代码?

在此先感谢。

问候, 金斯利吕便·杰

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

+0

很难给出明确的答案。这取决于很多因素:“你的机器(CPU,RAM)带来的功耗,除此任务外的负载,你想要对上传的文件(存储或其他处理)做什么,可用带宽... – 2010-12-14 13:44:00

+0

The服务器机器除了接收文件和存储它们之外没有任何其他的进程,而且机器有8GB RAM和双核处理器 – 2010-12-14 14:17:04

+1

不要手动执行此操作,请使用像Commons FileUpload(http:///commons.apache.org/fileupload/)。没有错误,并且可以正确扩展。 – skaffman 2010-12-14 14:52:59

回答

0

您的原始解决方案内存不足,因此堆栈器的建议(将数据存储在文件中)应该可以工作。通过http上传文件到tomcat对于大规模上传并不理想。

您可以尝试使用更简单的服务器/更高效的协议(例如ftp)或配置您的应用服务器&应用程序以查看您的瓶颈位置。想到的一点是HTTP上传必须经过MIME解码。

0

你应该写接收到的数据到临时文件(在更小的块,说8KB )由于30 * 100MB = 3GB,并且可能机器开始分配内存。吞吐量受到接口适配器的限制。

+0

读取数据后,我尝试将块数据存储到磁盘。RAM的使用量大大减少,但CPU使用率仍然很高。 – 2010-12-14 14:21:32

+1

@ Kingsley Reuben遵循skaffmans的建议并使用可扩展的图书馆,或者如果你想让自己的手变得肮脏,剖析过程并找出邪恶的行为者是谁 – stacker 2010-12-14 22:34:14