blog.stackframe.dev

[Arch Linux ARM] CPU 최대 클럭 고정 문제 해결방법

Arch Linux ARM은 각 플랫폼마다 고유의 패치가 들어간 리눅스 커널 패키지(linux-raspberrypi4, linux-aarch64-chromebook...)외에도 아키텍쳐가 같은 다양한 플랫폼에서 실행 가능할 수도 있는 리눅스 패키지(linux-aarch64, linux-armv7...)도 제공한다. 문제는 이 다양한 플랫폼에서 사용할 수 있는 리눅스 패키지는 CPU 클럭을 최대로 고정시켜 버린다는 것이다.

라즈베리파이 4의 최대 클럭인 1.5GHz로 고정되었다.

이건 Arch Linux ARM 쪽에서 리눅스 커널을 컴파일 할 때 CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y 옵션을 넣었기 때문이다.

기본 CPU 가버너가 performance로 설정되어 있다.

performance 가버너는 유동적으로 CPU 클럭을 조절하지 않고 최대로 고정시켜버린다. Arch Linux ARM에서 왜 이걸 설정해둔건지 모르겠지만 옛날부터 이 옵션이 활성화되어 있었다.

이럴경우 부팅이 끝나면 cpupower 유틸을 이용하거나 직접 /sys 디렉토리에 접근하여 가버너를 바꿀 수 있다. /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor 파일에 원하는 가버너를 쓰면 변경이 가능하다:

# echo 'schedutil' > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

*에는 0부터 CPU 스레드 수 - 1 까지의 숫자가 존재한다. 라즈베리파이는 cpu0 만 바꿔도 나머지 CPU의 가버너까지 바뀌었지만 노트북에서는 그렇지 않았으므로 모든 CPU 스레드에 대해 일일이 위의 명령을 실행하는게 정확할 것이다. 참고로 지원하는 가버너를 보려면 아래처럼 실행하면 된다:

# cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors

하지만 다른 프로그램을 설치하는 것을 좋아하지 않고 sysfs 부분을 만지는게 꺼려진다면 아예 커널 파라미터에 가버너 설정을 넣는 것도 좋다.

라즈베리파이4를 aarch64 아키텍쳐로 설치했으면 U-Boot 부트로더를 거쳐서 부팅될 것이다. 그렇다면 /boot 디렉토리에 boot.txt 파일을 열어서 setenv bootargs로 시작하는 라인에 cpufreq.default_governor=schedutil을 추가하고 ./mkscr을 실행해서 boot.scr 파일을 생성한다:

setenv bootargs console=ttyS1,115200 cpufreq.default_governor=scheduitl console=tty0 root=PARTUUID=${uuid} rw rootwait smsc95xx.macaddr="${usbethaddr}"

리부팅 후 확인하면 가버너가 schedutil로 나올 것이다.

schedutil로 변경되었다.

만약 U-Boot를 사용하지 않고 라즈베리파이4 부트로더에서 바로 커널이 실행되는 거라면 커널 파라미터는 cmdline.txt 파일에서 설정할 수 있다. 물론 이 경우는 가버너를 performance로 설정하는 옵션이 들어있지 않으므로 변경할 이유가 없지만 호기심이나 실험 용도로 쓸만하다.

라즈베리파이 외에 다른 플랫폼에서도 그 플랫폼의 커널 파라미터를 설정하는 곳에 동일하게 cpufreq.default_governor=schedutil을 추가하면 된다.

댓글