-
Notifications
You must be signed in to change notification settings - Fork 0
3. 성능 최적화
성능이란 기준이 상황에 따라 다양했다. 주요 성능 기준 두 가지: 지연 시간과 처리량를 집중해서 보겠습니다.
<이상적인 멀티 스레드 개수>

운영 체제는 각 CPU 코어에서 병렬로 작업을 실행하도록 설계되어 있습니다.
하지만 스레드가 필요 이상으로 많으면 오히려 성능이 떨어질 수 있습니다

-
컨텍스트 스위치(문맥 전환):
CPU가 여러 스레드를 번갈아 실행하며 상태를 저장하고 복구하는 데 드는 추가 비용. -
캐시 성능 저하:
스레드 간 메모리를 공유하며 캐시를 반복적으로 비우고 재로드하는 문제. -
추가 메모리 소모:
더 많은 스레드를 관리하기 위한 메모리 사용 증가.
즉, 이상적인 스레드 개수는?
- 일반적으로 스레드 개수 = CPU 코어 개수가 성능을 최적화합니다.
- 다만, 이는 모든 스레드가 인터럽트 없이 하위 작업을 실행할 수 있는 경우에 해당합니다.
-
I/O 작업이나 블로킹 호출이 없는 경우
작업이 CPU 중심적일 때 최대 효율 가능. -
앱에 전용 서버가 있는 경우
운영 체제나 다른 프로세스가 CPU를 차지하지 않아 애플리케이션 스레드가 CPU를 독점적으로 사용할 수 있습니다. -
하이퍼스레딩 기술 활용
물리적 코어 일부를 복제하여 가상 코어(Virtual Core)를 생성.
두 스레드가 병행으로 실행 가능하지만, 완벽한 병렬 처리는 어려움.
작업 분할 비용: 큰 작업을 작은 조각들로 나누는 데 시간과 계산이 필요.
작업 전달 비용: 분할된 작업을 각 스레드에 전달하고 시작하는 과정에서 추가 시간이 필요.
스케줄링 및 실행 비용: 운영 체제가 스레드를 실제로 실행하고 작업을 스케줄링하는 데 걸리는 시간.
결과 집계 비용: 모든 하위 작업이 완료된 후, 결과를 통합하는 데 드는 시간.
- 큰 작업을 작은 작업으로 세분화
- 스레드 생성, 스레드에 작업 전달
- thread.start()에서 스레드가 run하는 시간
- 마지막 스레드 끝나고 신호가 올때 까지의 시간
- 집계 스레드가 실행될때까지의 시간
- 하위 결과를 하나의 아티팩트로 통합
-
멀티스레드와 싱글 스레드의 교차점:
멀티스레드의 성능이 싱글 스레드를 능가하기 시작하는 교차점 이후에서만 병렬 처리의 가치가 나타납니다. - 작업이 작을수록 멀티스레드의 추가 비용이 더 크므로 성능이 오히려 나빠질 수 있습니다.
작업은 크게 세 가지 유형으로 나눌 수 있습니다:
- 완전히 병렬화 가능한 작업: 독립적으로 실행 가능한 작업.
- 병렬화가 불가능한 작업: 순차적으로만 처리 가능한 작업(싱글스레드).
- 부분적으로 병렬화 가능한 작업: 일부는 병렬로 처리 가능하지만, 마지막엔 순차적으로 진행해야 하는 작업.
-
운영 체제의 기본 내용 및 멀티스레딩과 병행성이 필요한 이유
-
멀티스레딩의 기본 - Java에서 스레드를 생성하는 방법 및 스레드 간에 소통하는 방법
-
멀티스레드 병렬 실행 애플리케이션의 성능 관련 고려 사항 및 설계 패턴. 지연 시간 또는 처리량을 최적화하는 방법
-
Java에서 스레드 간에 데이터를 공유하는 방법. 발생할 수 있는 모든 함정과 어려움 및 솔루션과 모범 사례
-
반응성과 성능을 향상시킬 수 있는 락이 걸리지 않은 고급 알고리즘 및 데이터 구조