2016-07-28 4 views
0

내 Linux 서버 (debian 7) 백그라운드에서 실행중인 java jar 응용 프로그램이 있습니다. 서버는 일반적으로 아파치를 통해 파일을받습니다. 그 다음 항아리는 정기적으로 데이터베이스를 가져 와서 httpclient (v2.5)의 http 연결 풀을 사용하여 최종 목적지로 파일을 업로드합니다.http OutputStream을 사용하여 Java OutputStream 파일 업로드 수행

서버는 16GB RAM, 8 코어 CPU, 1T 디스크 및 2Gb/s 인터넷 대역폭입니다. 내 문제는 대역폭이 항아리에 의한 업로드의 경우에만 10 % 또는 20 %로 사용된다는 것입니다. 많은 조사가 끝난 후에 병목 현상이 될 수있는 먼 서버의 용량 때문이라고 생각합니다. 그래서 더 많은 파일을 동시에 진행하고 내가 가지고있는 모든 대역폭을 사용하기 위해 서버에서 더 많은 스레드를 시작하고 싶습니다. 불행히도 httpclient로 파일을 업로드하면 많은 CPU를 먹는 것처럼 보입니다!

실제로 병은 20 개의 동시 업로드 가능한 스레드로 작업하며 CPU 사용량이 늘어나고 레코드가 끊어지면서 더 많은 스레드를 시작하면 시스템이 너무 느리고 사용하기 어려워집니다. 이상한 점은 iowaits가 null 인 것 같습니다. 그래서로드 평균을 일으키는 것이 무엇인지 모릅니다. 파일 바디 클래스

CPU SAMPLES BEGIN (total = 4617) Thu Jul 28 17:42:35 2016 rank self accum count trace method 1 52.76% 52.76% 2436 301157 java.net.SocketOutputStream.socketWrite0 2 33.53% 86.29% 1548 300806 java.net.SocketInputStream.socketRead0 3 1.62% 87.91% 75 301138 org.sqlite.core.NativeDB.step 4 1.47% 89.39% 68 301158 java.io.FileInputStream.readBytes 5 1.06% 90.45% 49 300078 java.lang.ClassLoader.defineClass1 6 0.26% 90.71% 12 300781 com.mysql.jdbc.SingleByteCharsetConverter.<clinit> 7 0.19% 90.90% 9 300386 java.lang.Throwable.fillInStackTrace 8 0.19% 91.10% 9 300653 java.lang.ClassLoader.loadClass 9 0.19% 91.29% 9 300780 com.mysql.jdbc.SingleByteCharsetConverter.<clinit> 10 0.17% 91.47% 8 300387 java.net.URLClassLoader.findClass 11 0.17% 91.64% 8 300389 java.util.zip.Inflater.inflateBytes 12 0.15% 91.79% 7 300090 java.lang.ClassLoader.findBootstrapClass 13 0.15% 91.94% 7 300390 java.util.zip.ZipFile.getEntry 14 0.13% 92.07% 6 300805 java.net.PlainSocketImpl.socketConnect

파일가 오버라이드는, writeTo와 요청을 실행 공통 HttpClient를의 POST로 전송됩니다() 메소드 :

나는 단지 하나의 스레드를 사용하여 HPROF를 실행 한, 여기에 결과입니다 8kb의 bufferedInputStream을 사용합니다.

파일 업로드의 성능 영향을 줄이고 사용하지 않는 대역폭 문제를 해결할 수 있다고 생각하십니까?

미리 도움을 주셔서 감사합니다.

답변

0

실제로 자바 프로세스에서 문제가 발생하지 않았지만 하드 드라이브의 IO를 모두 소비하는 아파치에서 퍼포먼스가 엉망이 된 것으로 보입니다. 어쨌든 도와 주셔서 감사합니다.

0

당신은 https://hc.apache.org/

당신은 java.nio의 기반으로 라이브러리에 HttpClient를 라이브러리를 변경할 수 있습니다 시도해야합니다 : https://docs.oracle.com/javase/7/docs/api/java/nio/package-summary.html

HttpCore입니다 사용할 수있는 낮은 수준의 HTTP 전송 구성 요소 세트 최소한의 설치 공간으로 맞춤 클라이언트 및 서버 측 HTTP 서비스를 구축 할 수 있습니다. HttpCore는 Java NIO을 기반으로하는 클래식 Java I/O 및 논 블로킹, 이벤트 기반 I/O 모델 을 기반으로 I/O 모델을 차단하는 두 가지 I/O 모델을 지원합니다.

하면이 올바른 생각이다 https://hc.apache.org/httpcomponents-asyncclient-dev/index.html

희망에서 봐 주시기 바랍니다.

+0

안녕하세요, 아이디어를 제공해 주셔서 감사합니다. 그러나 이상한 점은 iotop이 실행중인 자바 소프트웨어의 아이콘을 표시하지 않는 것 같아서이를 조사해야합니다. – user3550312

관련 문제