성능이 떨어지는 Java 애플리케이션과 성능이 떨어지는 서버

성능이 떨어지는 Java 애플리케이션과 성능이 떨어지는 서버

이것은 매우 일반적인 문제이지만 나에게는 점점 더 자주 나타나는 문제입니다. 저는 이 일반적인 상황에 대해 적절한 조치를 결정하려고 노력하고 싶습니다. 이는 향후 저와 다른 시스템 관리자에게 도움이 될 수 있다고 생각하기 때문입니다. 그러나 모든 경우의 공통분모는 java입니다. 내가 스택 오버플로 대신 여기에 이 ​​질문을 하는 이유는 이것이 시스템 관리자 질문이기 때문입니다. 여기에 두는 것이 매우 적절하다고 생각합니다.

한 사용자가 나에게 와서 "내 응용 프로그램이 매우 느립니다. 당신이 나에게 제공한 서버의 성능이 형편없습니다. 서버는 베어 메탈, OpenVZ 또는 KVM일 수 있습니다."라고 말했습니다. 모든 경우에 운영 체제는 CentOS 6입니다. 사용자가 이것을 말하는 것은 페이지 로드 시간(JIRA) 또는 벤치마크 수치를 말하는 것입니다. (Selenium 또는 독점 애플리케이션)

이제 서버 자체에는 문제가 없다는 은근한 의심이 듭니다. ssh서버에 들어가보니 부하가 1보다 적더군요 . 메모리 사용량도 양호하며 여유 메모리 범위는 2~20GB입니다. 결국 확인해 iowait보니 vmstat0이더군요. CPU 유휴 상태는 99입니다.

Java를 보면 top프로세스의 CPU 비율이 약 200%인 것을 알 수 있습니다. 이는 4~24개의 코어가 있는 시스템에 있습니다.

프로세서 할당이 KVM이나 베어메탈과 확실히 openvz다른가요? ) 클라이언트에서 이런 일이 발생했다면 openvz호스트 kvm로 이동하여 비슷한 상황을 볼 수도 있습니다. CPU 유휴율은 99%입니다. iowait는 0입니다. 메모리에는 때때로 수백 개의 여유 공간이 있습니다.

strace, 및 를 사용하여 이러한 Java 프로세스와 스레드를 관찰했습니다 strace -f. 수많은 futex, clock 및 epoll.grep을 반전하면 대부분 ioctl, stat, sendto가 남습니다.

이런 일이 발생하는 애플리케이션: Selenium, JIRA 및 기타 독점 Java 애플리케이션. 하지만 항상 자바입니다.

Java 프로세스의 niceness를 조정하려고 생각했지만 내가 아는 한 niceness는 프로세스가 예약되는 방식에만 영향을 미칩니다. 부하가 낮으면 속도를 높이는 데 도움이 되지 않습니다.

간혹 애플리케이션에서 mysql을 사용하는 경우가 있는데, 상단의 mysql을 보면 거기에는 CPU 사용량이 거의 없는 것을 알 수 있습니다. 이것이 병목 현상이라면 CPU 사용량이 더 높아질 것이라고 생각합니다.

요점: 서버는 잘 작동하지만 애플리케이션이 형편없다는 것을 사용자에게 어떻게 증명할 수 있습니까? 이론적으로는 종료되지 않는 while 루프가 발생하기 때문에 애플리케이션이 느려질 수 있습니다. 이로 인해 나는 이 작업이 불가능하고 정전 문제를 해결하는 것과 유사하다고 믿게 되었습니다. o_O 하지만 Java를 좀 더 잘 작동하도록 조정할 수도 있고, 실행 중인 애플리케이션을 프로파일링하고 코드 조각을 가리키며 "이것이 문제입니다"라고 말할 수 있는 방법이 있을 수도 있습니다.

답변1

셜록!

불가능한 것이 제거되면 남는 것은 아무리 불가능하더라도 사실이어야 합니다. --아서 코난 도일

먼저 확인하고 싶을 수도 있습니다.이것성능 문제의 원인과 이를 진단하는 방법에 대한 토론입니다. Linux를 SmartOS와 비교하는데, 이는 게시물의 관점과 약간 다르지만 성능 문제의 원인을 밝히는 데도 도움이 됩니다.

일반적으로 소프트웨어 성능 문제를 디버깅할 때는 동일한 Java 버전, 동일한 커널, 동일한 사용자 공간 등을 사용하여 별도의 물리적 시스템에 정확히 동일한 소프트웨어 구성을 복제해야 합니다. 성능 문제가 존재하지 않으면 물리적 하드웨어, 하이퍼바이저/컨테이너 계층 또는 머신의 설치 문제를 살펴보기 시작할 수 있습니다.

사용자가 이전에 특정 OS/버전 구성에서 소프트웨어를 실행한 적이 없다면 이것이 귀하의 서버라고 즉시 주장할 수 없습니다. 차라리 입증책임을 맡기겠다그들을이를 입증하기 위해 CentOS 6(동일한 마이너 버전, 동일한 하이퍼바이저 및 베어메탈에서 실행되지 않는 경우 동일한 호스트 OS 사용)을 실행하여 더 나은 성능을 달성할 수 있었습니다.

성능이 더 좋다면 우수한 시스템 사양을 갖추고 있기 때문입니다(예: 인프라의 저가형 프로세서에 있는 1GB KVM에서 실행하지만 자체 24코어 Ivy Bridge E5 시스템에서는 8개의 PCIe SSD 하드웨어가 있습니다). 1000% 더 빠른 RAID0) 그런 다음 물리적 하드웨어에 대해 이야기를 시작할 수 있습니다. 물리적 하드웨어가 동일하거나 매우 유사한 경우 OS/하이퍼바이저 구성에 대한 논의를 시작할 수 있습니다.

또한 애플리케이션의 성능과 사용자 수, 데이터 워크로드에 따라 사용자에게 할당된 하드웨어가 작업에 충분하지 않을 가능성도 고려할 수 있습니다. 매우 중요한 고객이고 고객 만족을 유지하는 것이 비즈니스에 중요한 경우 가상 컨테이너 또는 VM 인스턴스에 적용할 수 있는 일부 제한 사항을 해제해 일시적으로 더 많은 RAM 또는 CPU 시간, 네트워크 대역폭을 제공할 수 있습니다. 등을 참조하여 도움이 되는지 확인하세요. 그렇다면 해당 워크로드에서 원하는 성능을 얻으려면 더 큰 가상 머신을 구입해야 한다고 사용자에게 알려야 할 수도 있습니다.


상황에서 도망가세요(당신의 문제가 아닐 때)

어떤 이유로 사용자가 별도의 하드웨어에서 동일한 소프트웨어 구성을 시도하는 것을 단호히 거부하는 경우 응용 프로그램의 성능 문제를 해결하도록 도와야 합니다(Brendan Gregg가 설명했듯이 Linux에서는 어렵거나 불가능할 수 있음). 때로는 성능 비용을 "감당"해야 하거나 단순히 사용자가 틀렸다고 주장해야 할 수도 있습니다. 이는 시스템에서 개발자를 지원하는 불행한 부작용입니다.

이 시점에서 사용자와의 비즈니스 관계가 무엇인지 자문해 볼 수 있습니다. 제공하는 경우관리되지 않는민간 부문 호스팅에서는 사용자 코드의 성능을 보장할 책임이 없다고 주장해야 할 수도 있습니다.

제공하는 경우관리하다문제가 그들의 잘못인지 아닌지에 관계없이 소프트웨어 사람들이 문제를 해결하도록 호스트하거나 다른 방식으로 동의하는 경우 소매를 걷어붙이고 손을 더럽히고 보다 정교한 성능 분석 도구를 실행하여 다음 사항을 확인해야 할 수도 있습니다. 당신은 발견할 수 있습니다실제질문. 네트워크 소켓을 차단하는 매우 수다스러운 프로토콜입니까? 메모리 I/O에 의해 제한됩니까? 아니면 BIOS에 VT-x가 활성화되어 있지 않습니까? 나열하기에도 너무 많은 가능성이 있습니다.

이 섹션을 요약하면 다음과 같습니다. 문제 해결에 대한 책임이 없다는 비즈니스적 또는 정치적 변명을 찾을 수 있다면 그것이 아마도 가장 쉽고 효과적인 방법일 것입니다. 불행하게도 이는 사용자가 문제를 결코 해결하지 못하고 대안으로 다른 비즈니스 파트너를 찾을 수도 있음을 의미합니다.


불길 부채질(문제가 있을 때)

공통 주제가 Java인 것처럼 "보이므로" 최소한 먼저 Java 프로세스 자체가 매우 느린 코드를 실행하고 있는지 확인할 수 있습니다. 이를 위해 개발자/사용자/클라이언트는 이상적으로 Java 프로그램(및 모든 종속 라이브러리)의 소스 코드를 제공할 수 있습니다.

좋은 환경에서 프로그램을 실행해보세요분석기. 무료 분석기와 무료가 아닌 분석기가 있습니다. 무료 분석기는 예제와 함께 제공됩니다.인터넷 콩. 프로파일러가 애플리케이션을 성공적으로 시작하고 감지하도록 하는 것은 애플리케이션이 무엇인지에 따라 어려울 수 있지만 결과는 거의 항상 어느 정도 의미가 있습니다.

물론 Java VM(또는 관련 RDBMS)이 "합리적"이라고 생각하는 것(하드웨어 및 작업 양을 고려할 때)보다 너무 많은 CPU, 메모리 I/O 또는 디스크 I/O를 수행하는지 여부를 사용 htop및/또는 iotop감지할 수 있습니다. 이는 매우 광범위한 도구이며 때로는 성능 문제가 프로그램 내용과 관련되어 있기 때문에 항상 포괄적인 정보를 제공하지는 않습니다.아니요리소스 병목 현상과 관련이 없을 수 있는 다른 작업을 기다리는 동안 이 작업을 수행하세요. 이는 엔진이 제대로 작동하는지 확인하기 위해 자동차의 시동을 거는 것만큼 일반적입니다. 시작하지 않으면 어떻게 합니까? 이것이 바로 더 깊이 파고들어야 할 경우 적합한 Java 프로파일러가 유용한 이유입니다.

마지막으로 Brendan Gregg가 강연에서 말하고 DTrace에 대해 언급한 내용을 반복하겠습니다. DTrace의 전체 기능은 dtrace-on-linux 재구현이나 경쟁사(예: SystemTap)에 의해 아직 Linux에 복제되지 않았습니다. 즉, 당신은 할 수 있습니다시도다음 도구 중 하나를 사용하여 도움이 되는지 확인하세요.일부통찰력은 다음과 비교할 수 있습니다.전혀.

물론 이러한 "스위스 군용 칼" 유형의 도구를 사용하려면 특별한 전문 지식이 필요합니다. 많은 경험(읽기: 시행착오 및 인터넷 검색)을 통해 대부분의 전문 지식을 얻을 수 있습니다. 단순히 도구를 실행하여 문제를 지적하는 문제가 아닙니다. 사용 가능한 데이터를 기반으로 문제를 해결해야 합니다.쉽지 않습니다.성능이 최소화됩니다.

관련 정보