단일 기계를 사용하여 하중/응력을 생성할 때 어떤 종류의 "합리화"가 발생합니까?

단일 기계를 사용하여 하중/응력을 생성할 때 어떤 종류의 "합리화"가 발생합니까?

이 질문의 제목은 나의 주요 관심사를 나타냅니다.질문섹션에서 우리 설정에 대한 몇 가지 배경 지식을 찾을 수 있습니다. 이는 관련성/유용할 수도 있고 그렇지 않을 수도 있습니다.

질문

우리는 다음을 사용하여 애플리케이션을 스트레스 테스트하고 있습니다.개틀링, Gatling 시나리오를 실행 중입니다.하나의기계. 우리는 우리 애플리케이션이 스트레스 도구에 의해 생성된 높은 부하에 대처할 수 있다는 것을 발견했습니다. 그러나 실제 사용자의 상대적으로 낮은 부하에는 대처할 수 없습니다.

내 질문은: 단일 시스템/OS에서 애플리케이션으로 동시 요청이 이루어질 때와 여러 시스템(예: 웹 브라우저를 사용하는 일반 사용자)의 동시 요청이 이루어질 때 어떤 종류의 OS/네트워크 수준 최적화 또는 간소화가 발생합니까?


배경

우리는 포트 80을 통해 Citrix Netscaler 뒤에 있는 AJP를 통해 Apache 뒤에 Tomcat 애플리케이션이 있습니다(우리는 또한 Apache를 방정식에서 제외할 계획이지만 그것은 또 다른 문제입니다...).

우리 앱은 상대적으로 낮은 로드(Apache와 Tomcat 사이에 구축되는 CLOSE_WAIT 연결)에서 중단되고 있으며 문제를 해결하기 위해 로드 테스트를 진행 중입니다. SQLServer 인스턴스에서 발생하는 교착 상태가 자주 발생했기 때문에 여기서부터 시작하기로 결정했습니다. 문제를 재현하고 수정 사항을 테스트하기 위해 단일 시스템을 사용하여 Gatling을 사용하여 로드를 생성하고 있습니다.

처음 시작했을 때 도구를 사용하여 교착 상태를 안정적으로 복제할 수 있었습니다. 몇 가지 최적화를 수행한 후 교착 상태가 사라졌고 CLOSE_WAIT 연결도 사라졌습니다. 그런 다음 애플리케이션을 매우 만족스러운 로드로 푸시했고 큰 문제 없이 실행되었습니다.

불행하게도 수정 사항이 프로덕션 시스템에 적용되었을 때 우리는 여전히 동일한 원래 동작을 보고 있었습니다. 스트레스 도구에 의해 생성된 로드가 실제 세계에서 실제로 일어나는 일을 잘 표현하지 못하는지 궁금합니다.인터넷에 분산된 다양한 클라이언트가 아닌 단일 소스에서 발생하기 때문입니다..

답변1

단일 로드 생성기는 서로 다른 클라이언트보다 연결 풀링 작업을 더 잘 수행할 가능성이 높습니다. 예를 들어 Keepalive를 더 잘 사용합니다. 이로 인해 더 적은 연결로 더 많은 요청이 발생합니다.

라운드 로빈 DNS가 포함된 경우 모든 DNS 대상에 로드를 분산시키는 대신 DNS 대상 중 하나만 공격하는 경향이 있습니다. 일부 로드 밸런서는 클라이언트 IP를 기반으로 고정성 결정을 내립니다. 이 경우 고정성은 고정됩니다.

로드 생성기에는 제한된 실행 풀(예: 200명의 '사용자')이 있어 응답 지연으로 인해 사용자의 속도가 느려질 수 있습니다. 다른 사용자가 완료해야 합니다.

답변2

Gatling 테스트 시나리오를 보지 않고는 아무것도 유지하기가 어렵습니다. 단지 "블라인드 샷": Gatling 테스트가 실제 사용자를 정확하게 나타내지 않습니다.

  • 실제 브라우저는 페이지에 포함된 외부 리소스(예: 이미지, 스크립트 및 스타일)를 다운로드하고 동시 스레드 풀을 사용하여 이를 수행합니다. 개틀링 테스트가 누락된 경우inferHtml리소스Gatling에서 발생하는 로드가 실제 브라우저 뒤에 앉아 있는 실제 사용자가 수행하는 로드보다 훨씬 적을 수도 있습니다.
  • DNS 캐싱. Gatling은 JVM 수준에서 캐싱하는 DNS 이름 뒤에 있는 IP 주소로 인해 하나의 IP 주소에만 도달할 수 있습니다. 에 따라개틀링 FAQ:

    기본적으로 Gatling/JVM의 DNS 캐시를 조정해야 합니다. 해결책은 -Dsun.net.inetaddr.ttl=0명령줄에 추가하는 것입니다.

  • AJAX 요청. Gatling은 클라이언트측 JavaScript를 실행하지 않으므로 애플리케이션이 XMLHTTP 요청을 기반으로 구축된 경우 Gatling이 페이지에 도달할 때 실행되지 않습니다. 애플리케이션이 AJAX 형식을 사용하는 경우 수동으로 처리해야 합니다.

그래서 참고하는 걸 추천드려요JMeter를 실제 브라우저처럼 동작하게 만드는 방법부하 테스트가 실제 부하를 나타내지 않는 것처럼 동등한 Gatling 설정을 구현합니다. 그러한 테스트를 실행하는 것은 의미가 없습니다.

관련 정보