[golang] GOMAXPROCS로 최대 CPU 코어 수 제한하기

2024. 11. 13. 22:12·Language/Go

서론

Go 언어에서는 GOMAXPROCS를 사용하여 프로세스가 사용할 수 있는 최대 CPU 코어 수를 제한할 수 있다. 기본적으로 Go는 가능한 모든 CPU 코어를 활용하지만 멀티코어 시스템에서 특정한 상황에 맞게 CPU 리소스를 조절할 필요가 있을 때 GOMAXPROCS를 사용하여 CPU 코어 수를 설정할 수 있다.

 

GOMAXPROCS로 CPU 코어 수 제한

package main

import (
	"fmt"
	"runtime"
)

func main() {
	cpuNum := runtime.GOMAXPROCS(1)
	fmt.Printf("CPU: %d -> 1\n", cpuNum)
}

사용법은 간단하게 GOMAXPROCS에 원하는 CPU 코어 수를 인수로 전달하면 된다. 이때 이전에 설정된 값이 반환되며 1보다 작은 값으로 호출하면 설정이 변경되지 않는다.

 

Go 1.5 이전 버전에서 사용

package main

import (
	"fmt"
	"runtime"
)

func main() {
	cpuNum := runtime.NumCPU()
	runtime.GOMAXPROCS(cpuNum)
	fmt.Printf("CPU: 1 -> %d\n", cpuNum)
}

Go 1.5 이전 버전에서는 GOMAXPROCS의 기본값이 1이었다. 따라서 모든 CPU 코어를 활용하려면 runtime.NumCPU()를 호출하여 현재 프로세스가 사용할 수 있는 최대 CPU 수를 확인하고 그 값을 GOMAXPROCS에 설정해야 했다.

 

성능 테스트

package main

import (
	"fmt"
	"runtime"
	"sync"
	"time"
)

func main() {
	runtime.GOMAXPROCS(1)
	start := time.Now()

	var wg sync.WaitGroup
	for i := 0; i < 1000000; i++ {
		wg.Add(1)
		go func(i int) {
			defer wg.Done()
			_ = i * i
		}(i)
	}
	wg.Wait()
	fmt.Printf("1 CPU: %s\n", time.Since(start).String())

	cpuNum := runtime.NumCPU()
	runtime.GOMAXPROCS(runtime.NumCPU())
	start = time.Now()

	for i := 0; i < 1000000; i++ {
		wg.Add(1)
		go func(i int) {
			defer wg.Done()
			_ = i * i
		}(i)
	}
	wg.Wait()
	fmt.Printf("%d CPU: %s\n", cpuNum, time.Since(start).String())
}

이 코드는 1,000,000개의 고루틴을 실행하면서 1개의 CPU와 멀티코어 시스템에서 모든 CPU를 사용할 때의 성능을 비교하는 예제다. 고루틴이 많을 수록 멀티코어 시스템에서 성능 차이가 더욱 뚜렷하게 나타난다.

 

실행 결과

1 CPU: 592.220198ms
8 CPU: 269.343799ms

결과에서 알 수 있듯이 8개의 CPU를 사용할 때 고루틴들이 멀티코어 시스템에서 병렬로 실행되어 더 빠르게 완료되었다.

'Language > Go' 카테고리의 다른 글

[golang] URL 및 쿼리 파라미터 파싱과 수정하기  (0) 2024.11.15
[golang] 텍스트 이미지 생성 및 JPEG 인코딩  (0) 2024.11.14
[golang] 파일 잠금으로 프로그램 중복 실행 방지하기  (0) 2024.11.12
[golang] 현재 운영 체제 확인하기  (0) 2024.11.11
[golang] iota 키워드로 열거형 상수 정의  (4) 2024.11.10
'Language/Go' 카테고리의 다른 글
  • [golang] URL 및 쿼리 파라미터 파싱과 수정하기
  • [golang] 텍스트 이미지 생성 및 JPEG 인코딩
  • [golang] 파일 잠금으로 프로그램 중복 실행 방지하기
  • [golang] 현재 운영 체제 확인하기
在晟
在晟
  • 在晟
    Jae-Sung
    在晟
  • 전체
    오늘
    어제
    • 분류 전체보기 (25)
      • Language (23)
        • Go (23)
      • DBMS (1)
        • MariaDB (1)
      • Notes (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Jae-Sung
    • GitHub
  • 인기 글

  • 태그

    recover
    go
    http
    unsafe
    오블완
    티스토리챌린지
    Runtime
    interface{}
    fasthttp
    filepath
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
在晟
[golang] GOMAXPROCS로 최대 CPU 코어 수 제한하기
상단으로

티스토리툴바