2010-12-14 22 views
1

私は250の接続スレッドを持つTomcatサーバーを持っています。 30ファイル(100MBごと)の同時ファイルアップロードをシミュレートすると、サーバーマシンの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メガバイトのファイル)の最大数何ができますか?
  • すべての250の接続スレッドを使用するために、自分のコードに最適化が必要ですか?
  • sleepが導入されると、アップロードが長くなる可能性があります。効率的なコードを書くには?

ありがとうございます。

に関して、 キングスレールーベンJ

注:私はこの問題を解決するためにサードパーティ製のアプリケーションを使用できるように文句を言わない

+0

決定的な回答者を与えるのは難しいです。それは多くの要因によって異なります:あなたのマシン(CPU、RAM)、このタスクの横にある負荷、アップロードしたファイル(ストレージまたは別の処理)で何をしたいか、使用可能な帯域幅などによって決まります... –

+0

サーバマシンにファイルを受信して​​保存する以外に、デュアルコアプロセッサを搭載した8GBのRAMがあります –

+1

これを手動で行うのではなく、Commons FileUpload(http: /commons.apache.org/fileupload/)バグがなく、適切にスケーラブルである – skaffman

答えて

0

元の解決策でメモリが不足しているため、スタッカの提案(データをファイルに保存する)が機能するはずです。 httpからtomcat経由でファイルをアップロードすることは、一括アップロードを行うには理想的ではありません。

より単純なサーバー/より効率的なプロトコル(例:ftp)を使用したり、アプリケーションサーバー&アプリケーションのプロファイルを作成して、ボトルネックがどこにあるかを調べることができます。気になることの1つは、HTTPのアップロードをMIMEでデコードする必要があることです。

0

あなたは8キロバイトを言う、小さなブロックに(一時ファイルに受信したデータを書き込む必要があります)30 * 100MB = 3GB以来、あなたはおそらくマシンがメモリを呼び出し始めます。スループットは、インターフェイスアダプタによって制限されます。

+0

データを読み取った後、チャンクデータをディスクに保存しようとしましたが、RAM使用量はかなり減少しましたが、CPU使用率は高いままです。 –

+1

@ Kingsley Reubenはskaffmansのアドバイスに従ってスケーラブルなライブラリを使用するか、手を汚くしてプロセスをプロファイリングし、悪意のある人物を見つけたい場合 – stacker

関連する問題