2010-12-14 205 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