2010-12-14 5 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(); 
} 

나의 의심은 다음과 같습니다

  • 은 무엇 톰캣 서버가 처리 할 수있는 동시 파일 업로드의 최대 수 (각 100메가바이트 파일) 될 수 있을까?
  • 250 개의 연결 스레드를 모두 사용하려면 내 코드에 어떤 최적화가 필요합니까?
  • 소개 sleep은 오랜 업로드를 유발할 수 있습니다. 효율적인 코드를 작성하는 방법?

미리 감사드립니다.

관련, 킹슬리 르우벤 J

참고 :이 문제를

+0

확답을 내리기가 어렵습니다. 그것은 많은 요소에 따라 달라집니다 : "컴퓨터 (CPU, RAM),이 작업 옆에있는로드, 업로드 된 파일 (저장 또는 다른 처리)로 수행 할 작업, 사용할 수있는 대역폭 등에 따라 달라지는 전원 ... –

+0

서버 컴퓨터는 파일을 받고 저장하는 것 외에 다른 프로세스가 없습니다. 또한 듀얼 코어 프로세서가 장착 된 8GB RAM이 있습니다 –

+1

직접하지 마십시오. Commons FileUpload (http : /commons.apache.org/fileupload/) 아무런 버그도없고 확장 성도 없음 – skaffman

답변

0

원본 솔루션으로 메모리가 부족하므로 스태커의 제안 (데이터를 파일에 저장)이 작동해야합니다. http to tomcat을 통해 파일을 업로드하면 대용량 대량 업로드를 수행하기에 적합하지 않습니다.

간단한 서버 /보다 효율적인 프로토콜 (예 : ftp)을 사용하거나 응용 프로그램 서버 & 응용 프로그램의 프로필을 분석하여 병목 현상이 어디인지 확인할 수 있습니다. 염두에 두어야 할 점 중 하나는 HTTP 업로드가 MIME 디코딩되어야한다는 것입니다.

0

당신은 작은 블록에 임시 파일 (에 수신 된 데이터를 기록, 말을해야 8킬로바이트를 해결하기 위해 타사 응용 프로그램을 사용할 수 있습니다 실 거예요) 30 * 100MB = 3GB 이후 아마 컴퓨터가 메모리를 페이징하기 시작합니다. 처리량은 인터페이스 어댑터에 의해 제한됩니다.

+0

데이터를 읽은 후 청크 데이터를 디스크에 저장하려고 시도했지만 RAM 사용량은 상당히 감소했지만 CPU 사용량은 여전히 ​​높습니다. –

+1

@ Kingsley Reuben은 skaffmans의 조언을 따르고 확장 가능한 라이브러리를 사용합니다. 또는 손을 더럽혀서 프로세스를 프로파일하고 악의적 인 행동자가 누구인지 찾아야 할 경우 – stacker

관련 문제