책/그림으로 공부하는 IT인프라 구조

성능 향상을 위한 인프라 구조

ballde 2021. 10. 17. 17:45

시스템 성능 지표

시스템 성능을 가리킬 때 응답과 처리량이라는 지표가 자주 사용된다.

응답

  • 처리 하나당 소요 시간, 응답이 걸리는 시간

처리량

  • 단위 시간당 처리하는 양, 초당 받아들이는 사용자 수

퍼센타일

  • 실제 시스템에서는 단일 사용자 응답만으로는 부족하기 때문에 여러 사용자의 평균값을 이용한다. 이때 통계학에서 사용되는 퍼센타일 개념을 이용한다.
  • 극단적으로 응답 시간이 긴 사용자는 다른 문제를 내포하고 있을 수 있기 때문에 오차라고 생각하고 평균값에 포함하지 않는다.

병목 현상

처리량을 제한하고 있는 요인

병목 지점

  • 병목 현상이 발생하는 위치

어떻게 해결하는가?

  • 각 서버의 처리량이나 응답 상황 로그를 취득해서 어느 서버가 병목 지점이 되고 있는지 찾아내는 것부터 시작해야 한다.

이러한 이유로 APM을 설치해서 병목 지점을 확인합니다.

APM이란 application performance management 로 어플리케이션 성능 관리 도구라고 보면 됩니다. 

APM 도구 예시 - naver pinpoint

was(tomcat) 까지 응답시간, db까지의 응답 시간 등을 확인으로 병목지점 찾음

시스템 이용자 수를 제한

  • 유량 제어는 적절한 계층에서 이용자 수를 제한하는 접근법이다.
  • 무슨 말이냐면 N 이상의 트래픽이 들어오면 로드밸런서 등에서 503 Service Unavailable 에러를 내보내는 것으로 근본적인 해결책이 되지 못함.

튜닝

  • 병목이 발생하는 지점을 파악해서 적절히 튜닝.

병목 현상의 종류

  • cpu
  • 메모리
  • 디스크 I / O
  • 네트워크
  • 애플리케이션

CPU 병목 현상

먼저 cpu 사용률은 처리 효율성 → 병목현상 유무와는 관련 X

  • CPU 응답이 느리다
  • 주의할 점은 CPU 사용률이 100%라고 병목이 발생한 것은 아님
  • 100% CPU에서 처리할 수 있는 작업 수 = 작업 큐에 남은 작업수 → 괜찮음

⇒ 사용자 관점에서 응답 속도나 시스템 전체 처리량을 확인해야한다.

주 원인

  1. CPU를 이용하는 처리가 많아서 대기 행렬이 발생하고 있다.
  2. 처리량 측면의 문제를 의미.

해결 방법

  • cpu 코어 수를 늘리거나 수평 분할에 따른 서버수를 늘림(스케일 아웃) - 물리적 성능 향상
  • 처리 능력을 향상시키는 방법 (스케일 업) - cpu 클럭수, 성능 향상
  • 병렬로 처리한다
    • 처리를 분할해서 다수의 CPU 코어에게 동시 처리를 시키는 것.

I/O 비동기화

  • CPU 처리와 I/O 처리를 동시에 진행할 수 있기 때문에 리소스 사용 상태가 개선된다.

트래픽이 많이 발생하는 곳에서 Spring Webflux이 유행하는 이유 (비동기&논블로킹)

메모리 병목 현상


  • 프로세스가 가동해서 어떤 처리를 하려면 반드시 전용 메모리 영역이 필요하다. 하지만 서버상의 메모리 영역은 유한하다.

해결 방법

  • 가상 메모리 (스왑 메모리)
  • 메모리 증설

디스크 I/O 병목 현상


하드 디스크 등의 저장 장치에 대한 I/O 병목. (메모리와 비교해서 디스크 I/O는 매우 느리다.)

외부 저장소

SAN(storage area network) NAS(network attached strorage)이 두 종류가 대표적

처리량 관점 - 디스크 수에 따라 처리량이 증가하므로 처리량 관점에서 외부 저장소가 좋음

응답 속도 관점 - 가까우면 빠르다. 즉 로컬 디스크가 빠르다. 로컬 저장소 또는 캐시

순차 I/O, 랜덤 I/O

단일 디스크일 경우 순차 방식이 빠르고 랜덤이 느림

예시) 3개의 데이터를 가져와야 할 경우

단일 - 단 1번의 회전으로 모든 데이터를 가지고 옴

랜덤 - 3번의 디스크 회전이 일어나야지 데이터를 가지고 올 수 있음

  • 순차 I/O는 선두부터 차례대로 액세스(읽기, 쓰기)하는 방식.
  • 랜덤 액세스는 헤드가 움직이면서 해당 위치로 바로 건너뛰는 액세스(읽기, 쓰기) 방식.