티스토리 뷰

Java

[Java] CPU 와 ThreadPool Size 결정 방법

snail voyager 2024. 1. 29. 19:45
728x90
반응형

CPU 바운드 작업

CPU 바운드 작업은 주로 계산이 많이 필요한 작업으로, CPU의 처리 능력이 주요 병목 지점이 되는 상황입니다.

이러한 작업들은 주로 CPU 연산이 많이 필요하며, I/O 작업이 상대적으로 적은 경우입니다. CPU 바운드 작업에서는 CPU의 성능이 주요 제약 요소가 되므로, 다중 코어를 활용하여 병렬처리를 하는 것이 성능 향상에 도움이 될 수 있습니다.

  • 계산적인 작업: 수학적 계산이 많이 필요한 작업은 CPU 바운드 작업에 해당합니다. 예를 들어, 대규모 행렬의 곱셈, 복잡한 수학적 함수의 계산 등이 여기에 속합니다.
  • 이미지/비디오 처리: 이미지나 비디오 처리 작업 중에서 CPU를 많이 사용하는 작업은 CPU 바운드 작업에 해당할 수 있습니다. 예를 들어, 이미지 필터링, 변환, 비디오 인코딩 등이 여기에 해당합니다.
  • 암호화/복호화: 데이터의 암호화나 복호화 작업은 보통 CPU를 많이 사용하는 작업입니다. 대칭키 또는 공개키 알고리즘을 사용한 암호화 작업은 계산이 많이 필요하여 CPU 바운드 작업이 될 수 있습니다.
  • 데이터 압축/해제: 데이터의 압축 또는 해제 작업도 CPU 바운드 작업에 해당할 수 있습니다. 압축 알고리즘의 경우, 데이터를 압축하거나 해제하는 데 CPU 연산이 필요합니다.
  • 심층 학습/머신 러닝: 대규모의 신경망 학습이나 추론 작업은 많은 계산이 필요하므로 CPU 바운드 작업에 해당할 수 있습니다.
  • 게임 엔진 처리: 게임 엔진에서 그래픽 렌더링, 물리 시뮬레이션, 인공 지능 등의 처리는 CPU를 많이 사용하므로 CPU 바운드 작업에 해당합니다.

I/O 바운드 작업

I/O 바운드 작업은 주로 파일 시스템, 네트워크, 데이터베이스 등과의 입출력 작업이 많이 포함된 상황을 나타냅니다.

이러한 작업은 주로 데이터를 읽거나 쓰는 동안 대기 시간이 발생하므로 CPU 자원이 효율적으로 활용되지 않습니다.

I/O 바운드 작업은 주로 입출력 작업에 대한 대기 시간이 발생하는 작업들을 의미합니다. 

이러한 작업들은 CPU 성능이 크게 요구되지 않으며, 대기 상태에서 다른 스레드가 실행될 수 있도록 병렬로 처리될 때 효과적으로 동작합니다.

  • 파일 읽기/쓰기: 대용량 파일을 읽거나 쓰는 작업은 주로 I/O 바운드 작업에 해당합니다. 파일 입출력은 디스크와의 상호 작용이 필요하기 때문에 대기 시간이 발생합니다.
  • 네트워크 통신: 웹 요청, 소켓 통신 등 네트워크와의 통신 작업은 I/O 바운드 작업에 속합니다. 데이터를 주고받는 동안 대기 상태에 있기 때문입니다.
  • 데이터베이스 쿼리: 데이터베이스에서 데이터를 읽거나 쓰는 작업도 I/O 바운드 작업에 해당합니다. 특히 복잡한 쿼리나 대용량의 데이터를 처리할 때 대기 시간이 더 늘어날 수 있습니다.
  • 외부 API 호출: 외부 API와의 통신이 필요한 작업도 I/O 바운드 작업에 해당합니다. API 호출 동안 대기 시간이 발생하게 됩니다.
  • 소켓 통신: 여러 시스템 간에 소켓을 통한 통신이 필요한 경우, 데이터를 주고받는 동안 대기 상태가 발생하여 I/O 바운드 작업이 될 수 있습니다.

ThreadPool Size 결정

CPU 바운드 작업

CPU 작업이 많은 경우에는 CPU 코어 수에 근접한 크기의 ThreadPool을 선택하는 것이 효율적입니다. 예를 들어, 8코어의 CPU에서는 8 또는 조금 더 적은 수의 스레드를 선택할 수 있습니다.

CPU 바운드 작업: 코어 수 + 1 정도

I/O 바운드 작업

I/O 바운드 작업의 경우에는 CPU 코어 수에 비해 더 많은 스레드를 허용하는 것이 효과적일 수 있습니다. 이는 I/O 작업이 대기 상태일 때 다른 스레드가 실행되어 CPU를 효율적으로 사용할 수 있기 때문입니다. 일반적으로는 CPU 코어 수의 2배 정도 더 많은 스레드를 허용하는 것이 좋을 수 있습니다.

I/O 바운드 작업: 2 * 코어 수 정도

현재 시스템의 프로세서 수 확인

public class AvailableProcessorsExample {
    public static void main(String[] args) {
        // Runtime 클래스를 이용하여 사용 가능한 프로세서 수 확인
        int availableProcessors = Runtime.getRuntime().availableProcessors();
        System.out.println("Available Processors: " + availableProcessors);
    }
}

Thread Pool Size 계산

N-thread = N-CPU * U-CPU * (1 + W/C)

  • N-CPU : Runtime.getRuntime().availableProcessors() 가 반환하는 수
  • U-CPU : 0과 1 사이의 값을 갖는 CPU 활용 비율
  • W/C : 대기시간과 계산시간의 비율
728x90
반응형

'Java' 카테고리의 다른 글

[Java] JVM  (0) 2024.02.17
[Java] List.of vs Arrays.asList  (1) 2024.02.11
[Java] Enum Singleton Pattern  (0) 2023.12.27
[Java] 기본적인 리팩터링  (0) 2023.12.16
[Java] 리팩터링 테스트  (0) 2023.12.16
반응형
300x250