언더볼팅(CPU에 걸리는 전압을 낮추기)을 하면 CPU의 발열과 전력소모를 줄일 수 있다. 배터리 모드에서는 배터리 사용 시간을 늘릴 수 있고, 외부 전원을 사용할 때는 발열 감소로 쓰로틀링에 도달하는 시간을 늦춰 성능 향상을 노릴 수 있다. 하지만 전압을 과도하게 낮추면 CPU가 올바르게 동작하지 못해 시스템이 다운된다. 주의가 필요하긴 하지만 적절히 활용하면 노트북을 효율적으로 사용할 수 있다.

언더볼팅 설명: https://en.wikipedia.org/wiki/Dynamic_voltage_scaling

throttled는 리눅스에서 언더볼팅을 할 수 있게 해주는 프로그램이다. 윈도우의 ThrottleStop 프로그램과 비슷하다. throttled는 원래 씽크패드 노트북의 리눅스 환경에서 쓰로틀링이 과다하게 걸리는 문제를 해결하기 위해 만든 것이라고 한다. 외부 전원 사용시의 CPU 온도가 80°C 미만일 때 쓰로틀링이 걸려서 성능을 제대로 내지 못하는 문제(관련 내용)가 있다. 그러므로 언더볼팅을 하지 않더라도 사용을 고려해볼만하다.

나는 이 프로그램을 이용해 씽크패드 X1 카본 6세대 노트북 + 만자로 리눅스(아크 리눅스 변종)에서 언더볼팅을 해봤다.

throttled

throttled 설치

아크 리눅스에서는 그냥 throttled 를 설치하면 된다.

sudo pacman -S --needed throttled

다른 배포판의 설치법은 throttled 깃허브 문서에서 확인하기 바란다.

throttled 설정

데몬을 실행하기 전에 설정 파일을 확인해보자. /etc/lenovo_fix.conf 파일을 열어보면 된다. 이 파일의 모든 항목은 위험할 수 있으니 문서를 자세히 읽어보고 수정해야 한다. 다음은 언더볼팅과 관련된 설정 항목만 꼽은 것이다.

[GENERAL]
Enabled: True    # 스크립트 사용 여부

[BATTERY]
Trip_Temp_C: 85  # 배터리 사용시 쓰로틀링 전까지 허용할 온도

[AC]
Trip_Temp_C: 95  # 외부 전원 사용시 쓰로틀링 전까지 허용할 온도

[UNDERVOLT.BATTERY]
CORE: 0          # 배터리 사용시 CPU 코어 전압 조정치
GPU: 0           # 배터리 사용시 내장 GPU 전압 조정치
CACHE: 0         # 배터리 사용시 CPU 캐시 전압 조정치
UNCORE: 0        # 배터리 사용시 시스템 에이전트 전압 조정치
ANALOGIO: 0      # 배터리 사용시 아날로그 입출력 전압 조정치

[UNDERVOLT.AC]
CORE: 0          # 외부 전원 사용시 CPU 코어 전압 조정치
GPU: 0           # 외부 전원 사용시 내장 GPU 전압 조정치
CACHE: 0         # 외부 전원 사용시 CPU 캐시 전압 조정치
UNCORE: 0        # 외부 전원 사용시 시스템 에이전트 전압 조정치
ANALOGIO: 0      # 외부 전원 사용시 아날로그 입출력 전압 조정치

전압 조정은 언더볼팅만 허용하기 때문에 음수로 입력해야 한다. (예: CORE: -50) 적절한 언더볼팅 값은 테스트하면서 찾아야 하기 때문에 처음에는 설정치를 수정하지 않은 상태에서 throttled를 켜보자.

throttled 사용

systemd를 이용해 throttled 데몬을 실행할 수 있다. 서비스 이름은 lenovo_fix다. 아래 명령으로 enabled 설정을 해 두면 부팅 때마다 자동으로 실행되며 언더볼팅 설정도 적용된다.

sudo systemctl enable lenovo_fix.service

이대로는 다음 부팅 때야 실행되므로, 지금 바로 사용해 보려면 start 명령으로 실행한다.

sudo systemctl start lenovo_fix.service

설정을 수정한 경우에는 throttled 서비스를 재시작한다.

sudo systemctl restart lenovo_fix.service

sysbench 성능 테스트

sysbench 프로그램을 이용하면 시스템에 부하를 걸고 시간당 작업량을 확인할 수 있다. (시스템에 부하만 걸고 다른 방법으로 모니터링 하려면 stress 같은 프로그램을 이용해도 된다.)

sysbench 설치

sudo pacman -S --needed sysbench

sysbench 실행

sysbench cpu --threads=8 --time=120 run

--threads는 CPU의 쓰레드 개수만큼 지정하고, --time은 120초 이상으로 설정해 준다. 위 명령을 실행하면 120초 동안 테스트를 진행하고 다음과 같이 결과를 낸다.

sysbench 1.0.18 (using system LuaJIT 2.0.5)

Running the test with following options:
Number of threads: 8
Initializing random number generator from current time


Prime numbers limit: 10000

Initializing worker threads...

Threads started!

CPU speed:
    events per second:  7785.85

General statistics:
    total time:                          120.0008s
    total number of events:              934320

Latency (ms):
         min:                                    0.92
         avg:                                    1.03
         max:                                   16.15
         95th percentile:                        1.03
         sum:                               959858.55

Threads fairness:
    events (avg/stddev):           116790.0000/74.80
    execution time (avg/stddev):   119.9823/0.00

결과에서 General statistics total number of events 를 확인하면 작업 시간동안 수행한 작업 총량을 확인할 수 있다.

테스트 시간이 너무 짧으면 발열에 따른 성능 저하가 반영되지 않으므로 테스트 시간을 2분 이상으로 설정하는 것이 좋다. 또, 열이 쌓인 상태에서 테스트를 하면 측정치가 정확하지 않을 수 있으므로 테스트를 여러 번 할 때는 열이 완전히 식은 상태에서 시작할 수 있도록 테스트마다 5분 정도씩 간격을 두는 것이 좋다.

적절한 전압 조정치 찾기

이제 조정치를 적절히 수정하고 테스트를 반복하면서 시스템에 맞는 조정치를 찾으면 된다. 윈도우에서 ThrottleStop으로 하는 것과 크게 다르지 않다.

중요한 팁

외부 전원을 연결한 채로 언더볼팅을 한다. 처음에는 외부 전원을 연결했을 때의 전압 조정치만 수정한다. 조정치가 과도하면 시스템이 멈춘 뒤 부팅이 안 될 수 있다. 이 때는 전원을 빼고 배터리로 부팅한다. 배터리 모드의 전압을 조정하지 않았으므로 부팅이 될 것이다.

시스템 에이전트(UNCORE)와 아날로그 입출력(ANALOGIO)의 조정치는 수정할 필요가 없다. 리스크에 비해 얻는 것이 별로 없다.

조정치 찾는 순서

  1. /etc/lenovo_fix.conf 파일에서 CORE, GPU, CACHE의 조정치를 -10 낮춘다.
  2. throttled를 재시작한다. (sudo systemctl restart lenovo_fix.service)
  3. sysbench로 2분 이상 스트레스 테스트를 해본다.
  4. A) sysbench가 성공했으면 점수를 기록하고, 1로 가서 조정치를 더 낮춰 본다.
    B) 시스템에 이상이 발생했으면 배터리 모드로 컴퓨터를 껐다 켜고, 마지막에 성공한 조정치를 사용한다. 마지막에 성공한 것보다 조금 더 안전한 조정치를 사용하는 것도 좋다.

적절한 조정치를 찾았으면 /etc/lenovo_fix.conf 파일에 기록해두고 외부 전원을 뽑은 채로 배터리용 조정치도 같은 방법으로 찾으면 된다.

결과

다음은 내가 씽크패드 X1 카본 6세대(Intel Core i5-8250U)를 언더볼팅한 결과다.

POWER CORE GPU CACHE SCORE
AC 0 0 0 901211
AC -80 -80 -80 931802
AC -110 -110 -110 935153
AC -115 -115 -115 935268
AC -120 -120 -120 934320
AC -125 -125 -125 (dead)
BATTERY 0 0 0 659796
BATTERY -110 -110 -110 659691

-120 mV 에서는 화면이 이상해지는 문제가 생겼고, -125 mV에서는 시스템이 멈췄다. -110 mV 정도가 적당한 것 같다. 조정을 하지 않았을 때에 비해 성능이 3% 가량 향상되었다.

배터리 모드에서는 쓰로틀링이 걸리기 때문에 -110 mV로 조정하더라도 점수의 향상은 없었다. 하지만 같은 연산을 하는 데 드는 발열이 덜한 만큼 배터리 소모가 덜해질 것이라고 기대해 본다. 아쉽게도 이 경우의 온도와 전력 소모를 정확하게 측정할 방법을 찾지 못했다.

언더볼팅을 마치고, 시스템 안정성과 배터리 사용 시간을 고려해 쓰로틀링 진입 제한 온도를 전원: 92°C, 배터리: 69°C로 설정해 두었다.