병렬 프로그램의 성능을 분석하고, 모니터링하고, 성능을 향상시킬 수 있는 방법
- 단, 성능 때문에 안정성을 해칠 수는 없다.
- 프로그램이 정상적으로 동작하도록 만들어 놓은 다음, 프로그램이 빠르게 동작하도록 만드는게 낫다.
- 예상한 성능 기준에 미치지 못할 경우에만 성능 문제를 살펴보는 것으로 충분하다.
11.1 성능에 대해
성능을 높인다 = 더 적은 자원을 사용하면서 더 많은 일을 하도록 한다
- 자원
- CPU, 메모리, 네트워크 속도, 디스크 속도, 데이터베이스 처리 속도, 디스크 용량 등
- 비용
더 나은 성능을 목표로 해서 프로그램이 병렬로 동작하도록 만들 때는 2가지 부분을 우선적으로 생각해야한다.
- 프로그램이 확보할 수 있는 모든 자원을 최대한 활용해야 하고,
- 남는 자원이 생길 때마다 그 자원 역시 최대한 활용할 수 있도록 해야 한다.
11.1.1 성능 대 확장성
-
성능과 확장성의 정의
- 성능
- 애플리케이션의 성능을 나타내는 수치
- 서비스 시간, 대기 시간 → 특정 작업을 처리하는 속도가 얼마나 빠른지
- 용량, 처리량 → 동일한 자원을 갖고 있을 때 얼마나 많은 양의 일을 할 수 있는지
- 확장성
- CPU, 메모리, 디스크, I/O 장치 등 장비를 사용해 처리량/용량을 얼마나 쉽게 키울 수 있는지
-
성능과 확장성의 차이
- 성능을 목표로 튜닝을 하는 경우
- 동일한 일을 더 적은 노력으로 하기 위해 작업을 한다.
- [예시] 이미 계산했던 결과를 캐싱해서 실행 속도를 높이거나,
$O(n^2)$ 의 시간이 걸리는 알고리즘을 $O(nlogn)$ 시간에 처리할 수 있는 알고리즘으로 바꾸기
- 확장성을 목표로 튜닝을 하는 경우
- 처리해야할 작업을 병렬화해 시스템의 가용 자원을 더 많이 끌어다 사용하면서 더 많은 일을 처리할 수 있도록 하는 방법을 사용한다.
-
[예시] 3-티어 모델
- 프레젠테이션, 비즈니스, 로직 스토리지의 3가지 부분이 하나로 통합되어 있는 단일 애플리케이션과,
각 부분이 분리되어 있는 다중 티어 애플리케이션 간 비교할 때
- 일정량의 부하에선 단일 티어 애플리케이션의 성능이 훨씬 나을 가능성이 많다.
- 티어 간에 작업을 주고받는 도중에 발생하는 네트워크 시간 지연 현상,
연산 작업을 서로 다른 추상적인 계층을 통과하며 처리하는데 드는 부하가 적다.
- 단, 처리 가능한 최대 부하를 넘어서면 처리 용량을 단시간에 급격하게 증가시키는 일이 어렵다.
- 성능의 관점에서 ‘얼마나 빠르게’ 라는 측면보다 ‘얼마나 많이’ 라는 측면,
처리량과 용량, 그리고 확장성의 측면을 훨씬 중요하게 생각하는 경우가 많다.
11.1.2 성능 트레이드 오프 측정