문제

크고 복잡한 Tomcat Java 웹 애플리케이션의 성능 문제를 해결하려고 합니다.현재 가장 큰 문제는 때때로 메모리 사용량이 급증하고 애플리케이션이 응답하지 않는다는 것입니다.로그 프로파일러와 로그 파일의 베이지안 분석을 사용하여 수정할 수 있는 모든 항목을 수정했습니다.프로덕션 Tomcat 서버에서 프로파일러를 실행하는 것을 고려 중입니다.

온화한 감성을 지닌 독자를 위한 참고 사항:

일부 사람들은 프로덕션 앱을 프로파일링한다는 개념 자체가 불쾌하다고 생각할 수도 있다는 것을 이해합니다.다른 옵션은 대부분 다 써봤으니 안심하시기 바랍니다.제가 이것을 고려하는 이유는 테스트 서버에서 프로덕션 설정을 완전히 복제할 리소스가 없고 테스트 서버에서 관심 있는 오류를 일으킬 수 없기 때문입니다.

질문:

Tomcat에서 실행되는 Java 웹 응용 프로그램에서 작동하거나 언어에 구애받지 않는 방식으로 이 질문에 대답하는 답변을 찾고 있습니다.

  • 프로파일링의 성능 비용은 얼마입니까?
  • 프로덕션 환경에서 웹 애플리케이션을 원격으로 연결하고 프로파일링하는 것이 좋지 않은 다른 이유(이상한 오류 모드, 보안 문제 등)가 있습니까?
  • 프로파일링은 메모리 사용량에 얼마나 영향을 미치나요?
  • 특히 성능 비용이 매우 낮은 Java 프로파일링 도구가 있습니까?
  • 웹 애플리케이션 프로파일링을 위해 설계된 Java 프로파일링 도구가 있습니까?
  • VisualVM을 사용한 프로파일링의 성능 비용에 대한 벤치마크가 있는 사람이 있습니까?
  • VisualVM을 어떤 크기의 애플리케이션과 데이터 세트로 확장할 수 있나요?
도움이 되었습니까?

해결책

Oprofile 그리고 그 조상 DPCI 프로파일 링 생산 시스템을 위해 개발되었습니다. 이것에 대한 오버 헤드는 매우 낮으며, 그들은 당신의 전체 시스템, 커널을 포함하여 VM에서 성능 문제를 찾을 수 있습니다. 그리고 커널과 라이브러리에서.

질문에 답하기 위해 :

  1. 간접비: 이것들은 샘플링 프로파일 러, 즉 타이머를 생성하거나 생성합니다 성능 카운터 정기적 인 간격으로 인터럽트하고 현재 실행중인 코드를 살펴 봅니다. 그들은 당신이 시간을 보내는 곳의 히스토그램을 만들기 위해 그것을 사용하고 오버 헤드는 매우 낮습니다 (1-8%는 무엇입니다. 그들은 주장합니다) 합리적인 샘플링 간격.

    보세요 이 그래프 샘플링 주파수 대 Oprofile의 오버 헤드. 기본값이 취향에 맞지 않으면 오버 헤드가 낮은 샘플링 주파수를 조정할 수 있습니다.

  2. 생산 사용 : OproFile 사용에 대한 유일한 경고는 생산 기계에 설치해야한다는 것입니다. RHEL3 이후 Red Hat에 커널 지원이 있다고 생각하며 다른 배포판이 지원한다고 확신합니다.

  3. 메모리: 나는 Oprofile의 정확한 메모리 풋 프린트가 무엇인지 잘 모르겠지만, 비교적 작은 버퍼를 유지하고 가끔 파일을 로그에 버린다고 생각합니다.

  4. 자바: OproFile에는 Java를 지원하고 JITS에서 실행되는 코드를 알고있는 프로파일 링 에이전트가 포함됩니다. 따라서 통역사와 JIT의 C 호출뿐만 아니라 Java 호출을 볼 수 있습니다.

  5. 웹 앱 : Oprofile은 시스템 수준의 프로파일 러이므로 웹 앱이 가질 수있는 세션, 트랜잭션 등과 같은 것들을 알지 못합니다.

    즉, 그것은 a입니다 전체 시스템 프로파일 러, 따라서 성능 문제가 OS와 JIT 간의 나쁜 상호 작용으로 인해 발생하거나 일부 타사 라이브러리에있는 경우 OproFile이 커널과 라이브러리를 프로파일 링하기 때문에이를 확인할 수 있습니다. 테스트 환경에 존재하지 않는 생산 환경의 오해 또는 세부 사항으로 인한 문제를 해결할 수 있기 때문에 이것은 생산 시스템의 장점입니다.

  6. VisualVM : visualvm에 대한 경험이 없기 때문에 이것에 대해 확실하지 않습니다.

여기에 있습니다 튜토리얼 OproFile을 사용하여 성능 병목 현상을 찾습니다.

다른 팁

나는 YourKit을 사용하여 고 부하 생산 환경에서 앱을 프로파일 링했으며 확실히 영향을 미쳤지 만 쉽게 허용되는 것이 었습니다. Yourkit 큰 거래를합니다 더 비싼 특정 프로파일 링 기능을 선택적으로 끄는 등 비 침습적 방식 으로이 작업을 수행 할 수 있다는 것입니다 (실제로 슬라이딩 스케일입니다).

내가 가장 좋아하는 측면은 YourKit 에이전트가 실행되면 VM을 실행할 수 있으며 성능에 영향을 미치는 것입니다. GUI를 연결하고 프로파일 링을 시작할 때만 효과가 있습니다.

프로덕션 앱을 프로파일링하는 데에는 아무런 문제가 없습니다.분산 애플리케이션에서 작업하는 경우 개발/스테이지/UAT 환경에서 재현하기 매우 어려운 매우 독특한 확률 시나리오에서 메모리 부족 예외가 발생하는 경우가 있습니다.

사용자 정의 프로파일러를 사용해 볼 수 있지만 서둘러서 프로덕션 상자에 프로파일러를 연결/설정하는 데 시간이 걸리면 jvm을 사용하여 메모리 덤프를 수행할 수도 있습니다(jvms 메모리 덤프는 스레드 덤프도 제공합니다).

  1. 다음 옵션을 사용하여 JVM 명령줄에서 자동 생성을 활성화할 수 있습니다.-XX:+HeapDumpOnOutOfMemoryError

  2. Eclipse 메모리 분석기 프로젝트에는 "값별 그룹화"라는 매우 강력한 기능이 있습니다. 이를 통해 개체 쿼리를 작성하고 필드 값별로 인스턴스를 재그룹화할 수 있습니다.이는 가능한 값의 작은 집합을 포함하는 인스턴스가 많은 경우에 유용하며 어떤 값이 가장 많이 사용되는지 확인할 수 있습니다.이는 복잡한 메모리 덤프를 이해하는 데 큰 도움이 되므로 직접 시도해 보시기 바랍니다.

최신 핫스팟 JVM -Java Flight Recorder 중 하나를 사용하는 것을 고려할 수도 있습니다. 자바 미션 컨트롤. CPU 오버 헤드로 약 5%로 저수준 런타임 정보를 수집 할 수있는 일련의 도구입니다 (어쨌든 마지막 진술을 증명할 수는 없습니다. 이것은 기능을 제시하고 라이브 데모를 제시 한 Oracle 엔지니어의 진술입니다).

응용 프로그램이 실행되는 한이 도구를 사용할 수 있습니다. 1_7u40 JVM 이상. 런타임 정보 수집을 활성화하려면 특정 플래그로 JVM을 시작해야합니다.

기본적으로 JFR은 JVM에서 비활성화됩니다. JFR을 활성화하려면 Java 응용 프로그램을 -xx :+flightrecorder 옵션. JFR은 상용 기능이며 Java 플랫폼, Standard Edition (Oracle Java SE Advanced 및 Oracle Java SE Suite)을 기반으로하는 상용 패키지에서만 제공되므로 -XX :+UnlockMercialFeatures 옵션.

(인용 http://docs.oracle.com/javase/8/docs/technotes/guides/jfr/about.html#sthref7)

생산 IMO에서 프로파일 링을위한 실용적인 옵션 이므로이 답변을 추가했습니다.

또한 있습니다 일식 플러그인 이는 JFR 및 JMC를 지원하고 정보를 사용자 친화적으로 표시 할 수 있습니다.

도구는 수년에 걸쳐 크게 향상되었습니다. 요즘에는 이러한 필요가있는 대부분의 사람들은 프로파일 링 API 대신 Java의 계측 API에 연결되는 도구를 사용합니다. 확실히 더 많은 예가 있지만 Newrelic 그리고 AppDynamics 생각 나다. 계측 기반 솔루션은 일반적으로 JVM의 에이전트로 실행되며 지속적으로 데이터를 수집합니다. 그들은 이전 프로파일 링 접근법보다 더 높은 수준 (비즈니스 트랜잭션, 웹 트랜잭션, 데이터베이스 트랜잭션)으로 데이터를보고하고 필요한 경우 더 깊이 파기 할 수 있습니다. 모니터링 및 경고를 설정할 수도 있으므로 페이지로드 시간 및 SLA에 대한 성능과 같은 메트릭을 추적/경고 할 수 있습니다. 이 훌륭한 도구를 사용하면 더 이상 프로덕션 프로파일 러를 실행할 이유가 없어야합니다. 실행 비용은 무시할 수 있습니다.

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