문제

내가 건축 자바 서버는 규모입니다.하나의 서블릿 봉우에 저장된 이미지를 Amazon S3.

최근 부하 상태에서,추가 메모리에서 내 VM 고 그 후 저는 코드를 추가한 봉사하는 이미지 때문에 나는 확신이 스트리밍 더블릿 반응을 일으키는 내 문제입니다.

나의 질문은:이 있에 모범 사례를 코딩하는 방법 java servlet 트 대형(>200k)응답에 다시 브라우저 읽을 때 데이터베이스에서 또는 다른 클라우드 스토리지?

나는 여겨 쓰는 파일이 로컬 temp 드라이브 및 그란 또 다른 스레드 스트리밍도록 tomcat servlet 스레드가 다시 사용할 수 있습니다.이처럼 보인다는 것 io 무겁습니다.

어떤 생각을 감사하겠습니다.감사합니다.

도움이 되었습니까?

해결책

가능할 경우,당신은 저장하는 전체 파일의 내용을 제공 될 수 있도록 메모리에 있습니다.대신에,취득하는 InputStream 를 위한 데이터,그리고 데이터를 복사하 Servlet OutputStream 에 조각합니다.예를 들어:

ServletOutputStream out = response.getOutputStream();
InputStream in = [ code to get source input stream ];
String mimeType = [ code to get mimetype of data to be served ];
byte[] bytes = new byte[FILEBUFFERSIZE];
int bytesRead;

response.setContentType(mimeType);

while ((bytesRead = in.read(bytes)) != -1) {
    out.write(bytes, 0, bytesRead);
}

// do the following in a finally block:
in.close();
out.close();

I do agree with toby,당신은"대신에게 S3url 입니다."

로서 OOM 예외가,당신은 확실히 그것을 함께 할 수 있을 제공 이미지 데이터가?당신의 JVM256MB 의"추가"메모리를 사용에 대한 제공 이미지 데이터입니다.구글의 도움"256MB/200KB"=1310.에 대한 2GB"추가"메모리(이러한 일은 매우 합리적인 금액)10,000 개 이상의 동시 클라이언트 지원할 수 있습니다.그렇더라도,1300 의 동시 클라이언트가 꽤 큰 숫자가 있습니다.은 이 유형의 짐을 경험해 보았는가?하지 않을 경우,필요할 수 있는 다른 곳에서 찾을의 원인 OOM 예외는 아니다.

편집에 관한:

이 사례에서 이미지 중요한 데이터가 포함될 수 있습...

읽을 때를 통해 S3 문서 몇 주 전 나는 당신을 생성할 수 있는 시간 만료 키에 연결할 수 있는 S3Url.그래서,당신은 하지 않았을 열어서 파일 S3 을 공개한다.나의 이해 기술의:

  1. 초기 HTML 페이지로 연결되는 링크 다운로드 웹 애플리케이션
  2. 사용자 클릭하면 링크를 다운로드
  3. 귀하의 웹 애플리케이션을 생성합 S3URL 포함하는 키가 만료할 수 있습니다,5 분.
  4. 보 HTTP 리디렉션을 클라이언트에게 URL 에서 3 단계.
  5. 사용자는 파일을 다운로드에서 S3.이 경우에도 다운로드를 5 분 이상 걸리-면 다운로드가 시작을 계속할 수 있습니다.

다른 팁

왜 당신은 그냥 그들을 S3url?인 이슈에서 S3 다음 스트리밍을 통해 그것의 자신의 서버에 저에게 패배를 목적으로 사용하는 S3,이는 오프로드 대역폭 및 처리의 제공 이미지하지 아니한다.

을 많이 봤어요의는 다음과 같은 코드를 존-vasilef s(현재)응답,단단한 동 루 읽기 덩어리에서 하나의 스트림에 쓰기 다른다.

인수에서만 만날 수 있는가에 대한 불필요한 코드 복제,에서의 부탁을 사용하여 아파치의 IOUtils.이미 사용하고 있는 경우에는 그것이 다른 경우,또는 다른 라이브러리나 프레임 워크를 사용하는 것은 이미 이에 따라,그것은 단 하나 줄 알고 잘 테스트합니다.

다음 코드에서는 나 스트리밍 개체 아마존에서 S3 클라이언트에 servlet.

import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.io.IOUtils;

InputStream in = null;
OutputStream out = null;

try {
    in = object.getObjectContent();
    out = response.getOutputStream();
    IOUtils.copy(in, out);
} finally {
    IOUtils.closeQuietly(in);
    IOUtils.closeQuietly(out);
}

6 라인의 잘 정의된 패턴으로 적절한 스트림을 닫는 것 같다 꽤 고체.

동의함으로 강하게 두 토고 존 Vasileff--S3 한 오프로드 큰 미디어 개체는 경우에 당신을 허용할 수 있 관련 문제입니다.(인스턴스를 자신의 응용 프로그램은 해당하지 않 10-1000MB Flv 및 Mp4.) E.g.:부분적인 요청(바이트 범위는 헤더),하지만.하나는 처리는'으로,가끔씩 시간,등등....

하지 않는 경우는 옵션,존의 코드를 좋아 보인다.내가 찾는 바이트 버퍼의 2k FILEBUFFERSIZE 이에서 가장 효율적인 microbench 니다.또 다른 옵션이 될 수 있는 공유 FileChannel.(FileChannels 은 스레드에 안전합니다.)

는 말했다,나는 또한 추가하는 추측에서 무엇을 발생으로 메모리 오류는 고전적인 최적화 실수입니다.당신은 성공의 기회를 개선하는 작업에 의해 단단한 지표입니다.

  1. 소-XX:+HeapDumpOnOutOfMemoryError 으로 당신을 JVM 시작 매개변수,경우
  2. 을 사용 jmap 에서 실행하는 JVM(jmap-조직 <pid> 의)드
  3. Analyize 메트릭(jmap-조직을 넣거나,jhat 보 heap dump).그것을 아주 잘할 수 있는 메모리에서 어딘가에 못.

이 있다 물론 다른 도구가 있지만,jmap&jhat 올 Java5+'상자'

나는 여겨 쓰는 파일이 로컬 temp 드라이브 및 그란 또 다른 스레드 스트리밍도록 tomcat servlet 스레드가 다시 사용할 수 있습니다.이처럼 보인다는 것 io 무겁습니다.

아,나는 생각하지 않을 할 수 없습니다.심지어할 수 있다면,그것은 소리 의심스러운입니다.Tomcat 는 스레드 관리는 연결이 필요하 제어하고 있습니다.발생하는 경우에는 스레드 기아 다음의 수가 증가 스레드가 사용할 수 있습니다./conf/server.xml.다시 측정하는 방법을 감지하는 이--단지 추측한다.

질문:당신은 또한에서 실행 EC2?무엇을 톰캣의 JVM 시작 매개변수는?

토 비가 오른쪽,당신이 있어야를 가리키는 바로 S3 는 경우에,당신은 할 수 있습니다.할 수 없는 경우,문제는 약간의 막을 정확하게 응답:얼마나 큰 java 힙?얼마나 많은 스트림은 열기를 동시에 실행할 때의 메모리?
얼마나 큰 읽기/쓰기 bufer 에(8K 좋)?
당신이 읽고 8K 스트림에서,다음 쓰기 8k 출력,right?당신이 시도하고 있지 않을 읽고 전체 이미지에서 S3,버퍼 메모리에,다음에 보내는 모든 것에 한 번?

당신이 사용하는 경우 8K 버퍼,당신이 할 수 있 1000 동시 스트림에서~8Megs 의 힙 공간,그래서 당신은 확실히 하고 무언가 잘못된 것입니다....

BTW,하지 않았을 선택 8K 기,그것은 기본 크기를 위한 소켓 버퍼,더 많은 데이터를 보낼 말 1Meg,그리고 당신이 차단됩니다에 tcp/ip 스택을 들고 많은 양의 메모리가 있습니다.

이 있을 확인하는 두 가지:

  • 당신은 스트림을 닫?매우 중요한
  • 어쩌면 당신은 당신을주는 스트림 연결에 대해"무료"입니다.스트림은 크지 않지만 많은 스트림에서 동일한 시간을 훔칠 수 있는 모든 메모리입니다.을 만들 수 있도록 할 수 없는 특정 숫자의 스트림을 동시에 실행

하는 것 외에도 요한 제안,당신은 반복적으로 플러시합니다.에 따라 귀하의 웹 컨테이너,그것은 가능한 캐시한 부분 또는 심지어는 모든 출력 및 플러시 그것은에-되면(예를 들어,계산 Content-Length 헤더).는 화상 꽤 많은 메모리입니다.

할 수 있는 경우 구조의도록 파일에 정적 파일이 별도로 및에서 자신의 버킷,가장 빠른 성능을 오늘날 가능성이 될 수 있을 사용하여 달성 Amazon S3CDN CloudFront.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top