Skip to content

3. 성능 최적화

dami0806 edited this page Jan 26, 2025 · 3 revisions

성능이란 기준이 상황에 따라 다양했다. 주요 성능 기준 두 가지: 지연 시간과 처리량를 집중해서 보겠습니다.

1. 성능의 기준은 다양하다


2. 지연 시간의 최적화: 스레드 개수(N)

스레드 개수(N)는 몇 개가 적절할까?

<이상적인 멀티 스레드 개수>
image
운영 체제는 각 CPU 코어에서 병렬로 작업을 실행하도록 설계되어 있습니다.

하지만 스레드가 필요 이상으로 많으면 오히려 성능이 떨어질 수 있습니다
image

왜 스레드가 많으면 성능이 저하될까?

  1. 컨텍스트 스위치(문맥 전환):
    CPU가 여러 스레드를 번갈아 실행하며 상태를 저장하고 복구하는 데 드는 추가 비용.

  2. 캐시 성능 저하:
    스레드 간 메모리를 공유하며 캐시를 반복적으로 비우고 재로드하는 문제.

  3. 추가 메모리 소모:
    더 많은 스레드를 관리하기 위한 메모리 사용 증가.

즉, 이상적인 스레드 개수는?

  • 일반적으로 스레드 개수 = CPU 코어 개수가 성능을 최적화합니다.
  • 다만, 이는 모든 스레드가 인터럽트 없이 하위 작업을 실행할 수 있는 경우에 해당합니다.

특별한 상황에서 더 높은 효율을 기대할 수 있습니다:

  1. I/O 작업이나 블로킹 호출이 없는 경우
    작업이 CPU 중심적일 때 최대 효율 가능.

  2. 앱에 전용 서버가 있는 경우
    운영 체제나 다른 프로세스가 CPU를 차지하지 않아 애플리케이션 스레드가 CPU를 독점적으로 사용할 수 있습니다.

  3. 하이퍼스레딩 기술 활용
    물리적 코어 일부를 복제하여 가상 코어(Virtual Core)를 생성.
    두 스레드가 병행으로 실행 가능하지만, 완벽한 병렬 처리는 어려움.


3. 병렬화된 작업의 고유 비용

병렬 처리 과정에서 발생하는 비용:

작업 분할 비용: 큰 작업을 작은 조각들로 나누는 데 시간과 계산이 필요.

작업 전달 비용: 분할된 작업을 각 스레드에 전달하고 시작하는 과정에서 추가 시간이 필요.

스케줄링 및 실행 비용: 운영 체제가 스레드를 실제로 실행하고 작업을 스케줄링하는 데 걸리는 시간.

결과 집계 비용: 모든 하위 작업이 완료된 후, 결과를 통합하는 데 드는 시간.

  • 큰 작업을 작은 작업으로 세분화
  • 스레드 생성, 스레드에 작업 전달
  • thread.start()에서 스레드가 run하는 시간
  • 마지막 스레드 끝나고 신호가 올때 까지의 시간
  • 집계 스레드가 실행될때까지의 시간
  • 하위 결과를 하나의 아티팩트로 통합

병렬 처리의 성능 그래프

image
  • 멀티스레드와 싱글 스레드의 교차점:
    멀티스레드의 성능이 싱글 스레드를 능가하기 시작하는 교차점 이후에서만 병렬 처리의 가치가 나타납니다.
  • 작업이 작을수록 멀티스레드의 추가 비용이 더 크므로 성능이 오히려 나빠질 수 있습니다.

4. 병렬화의 한계: 모든 작업이 병렬로 가능한 것은 아니다

작업은 크게 세 가지 유형으로 나눌 수 있습니다:

  1. 완전히 병렬화 가능한 작업: 독립적으로 실행 가능한 작업.
image
  1. 병렬화가 불가능한 작업: 순차적으로만 처리 가능한 작업(싱글스레드).
image
  1. 부분적으로 병렬화 가능한 작업: 일부는 병렬로 처리 가능하지만, 마지막엔 순차적으로 진행해야 하는 작업.
image