주니어 백엔드 개발자가 반드시 알아야 할 실무 지식 ‐ 처음 해보는 성능 테스트를 위한 기본 정리 - thought-corner/backend-roadmap GitHub Wiki

포화점과 버클존

  • 부하를 증가시키면 초기에는 처리량도 함께 증가한다.
  • 그러다 일정 부하 구간에 도달하면 처리량의 증가 폭이 줄어들기 시작하고 어느 시점부터는 처리량과 응답 시간이 급격히 저하된다.
  • 이 때, 성능이 저하되기 전에 최대 처리량을 포화점(saturation point)이라고 한다.
  • 포화점은 시스템이 감당할 수 있는 성능 한계 지점이다. 포화점을 지나 성능이 꺾이기 시작하는 구간을 버클존(buckle zone)이라고 한다.

주요 측정 지표 정리

  • 응답 시간 : 응답 시간은 여러 값(평균, 최대/최소, 중앙, 99%나 95% 백분위)을 측정한다.
  • 처리량 : TPS(Transaction Per Second)는 초당 트랜잭션 처리 건수를 말하며, 초 단위로 얼마나 많은 요청을 처리했는지를 나타내는 지표이다. 테스트를 진행하는 동안 처리량은 변화하므로 최대, 평균, 최소값을 함께 구한다.
  • 에러율 : 전체 요청 중에서 에러가 발생한 비율을 의미한다. 부하 테스트를 하다 보면 처리량은 높은데 에러도 함께 증가하는 상황이 생긴다. 에러가 발생한다는건 시스템이 부하를 감당하지 못하고 있다는 신호일 수 있다. 에러가 증가하기 시작하는 지점이 시스템의 한계일 가능성이 높다.
  • CPU 사용률 : 일반적으로 웹 서버 성능 문제는 DB나 외부 연동에서 발생하지만 높은 CPU 사용률로 인해 문제가 생기는 경우도 있다. CPU 사용률을 측정하면 문제 원인을 분석할 때 범위를 좁히는 데 도움이 된다.

성능 테스트 설계 시 고려사항⭐

  • 개발 → 테스트 코드 → 관찰 코드 심기 → 기준선 측정 → 부하 실험 → 병목 분석 → 개선 → 재측정
    • 관찰 코드를 미리 심어두기
    • 기준선(baseline)부터 재기
    • 일부러 부하를 올려 한계를 찾는 실험
    • 병목을 바꿔가며 원인 좁히기(핵심 습관)
    • 흔한 병목을 재현해보며 익히기
    • 성능 회귀 방지 자동화

성능 테스트 설계 시 주의사항

  • 성능 테스트를 진행할 때 흔히 하는 실수 중 하나가 바로 테스트 대상 시스템과 부하기를 한 장비에서 실행하는 것이다.
  • 부하 생성은 그 자체로 많은 자원을 사용한다. 따라서 테스트 대상 시스템과 부하기를 한 장비에서 실행하면 테스트 대상 시스템이 자원을 온전히 활용하지 못해 실제 성능보다 낮은 결과가 나온다. 성능 테스트를 진행할 때, 반드시 부하 발생기와 테스트 대상 시스템을 분리해야 한다.
  • 서버 설정에 제한을 두고 부하 테스트를 실행하는 것도 자주 하는 실수 중 하나이다. 예를 들어 Nginx를 사용하는데 DDos 공격을 막기 위해 limit_req_zone을 사용해서 IP당 요청 개수를 10개로 제한했다고 가정하면 초당 10개의 제한이 걸리게 된다. 이러면 많은 요청에 대해 오류 응답이 발생하므로 제대로 부하 테스트를 할 수 없다. 비슷하게 서버 쓰레드를 개수나 DB 커넥션 풀의 크기가 작으면 부하 테스트가 제대로 이루어지지 않으니 테스트할 부하 규모에 맞게 풀의 크기를 미리 설정해야 한다.
  • 운영 시스템과 동일한 네트워크 환경에서 부하 테스트를 진행하는 것도 조심해야 한다. 스트레스 테스트처럼 대량의 요청을 발생시킬 때는 테스트 대상 시스템에 많은 네트워크 트래픽이 발생한다. 실 운영 시스템과 테스트 대상 시스템을 동일 네트워크에 넣고 테스트를 실행하면 테스트가 발생시키는 트래픽이 실 운영 환경에 영향을 줄 수 있다.
  • 외부 서비스를 연동하는 기능을 테스트할 때는 실제 외부 서비스를 사용하지 않게 주의해야 한다. 테스트하고 싶은 대상은 우리 시스템이지 외부 시스템이 아니기 때문이다. 외부 시스템 연동을 그대로 둔 채로 부하 테스트를 진행하면 외부 시스템이 트래픽을 견디지 못하고 장애가 발생할 수 있다. 이런 경우 실제 외부 서비스 대신에 가짜 외부 서비스로 대체해야 한다.
  • 테스트 대상 시스템은 실제 운영 환경과 동일하게 구성해야 한다. 간혹 실제 운영 환경 대비 저사양 환경을 사용해서 테스트 대상을 구성할 때가 있다. 이렇게 되면 실제 환경에서 얼마나 성능을 낼 수 있는지 확인할 수 없다. 유효한 성능 지표를 구하려면 최대한 실제 환경에 맞춰야 한다.