우분투에서 Thermald 설정하기
우분투엔 기본적으로 thermald라는 온도 조절 서비스가 설치되어 있다. CPU 온도가 상승하면 쿨러를 더 세게 돌린다든지 하는 걸 담당하는데 우분투답지 않게 이 서비스는 설정을 안 해도 제대로 동작하는 게 아닌데다가 함정이 많이 파여 있다. 그래서 나중에 삽질을 덜 하기 위해 로그를 남긴다.
- 설정파일을 불러오게 하기
thermald는 /etc/thermald/thermal-conf.xml
파일을 사용하는 것처럼 보인다. 하지만 이 파일을 아무리 수정해도 로그를 살펴보면 기본값만 불러 올 뿐 설정을 제대로 사용하는 것 같지가 않다. 이것 때문에 결국 thermald를 끄고 사용하던 적이 있지만 이젠 안다. 우분투 제작자들의 설계미스다.
당장 다음과 같이 수정하자
/lib/systemd/system/thermald.service
[Unit]
Description=Thermal Daemon Service
[Service]
Type=dbus
SuccessExitStatus=1
BusName=org.freedesktop.thermald
ExecStart=/usr/sbin/thermald --no-daemon --dbus-enable --config-file /etc/thermald/thermal-conf.xml
[Install]
WantedBy=multi-user.target
Alias=dbus-org.freedesktop.thermald.service
--config-file /etc/thermald/thermal-conf.xml
부분을 추가했는데 thermald는 저 옵션이 없으면 이렇다 할 기본 설정파일을 불러오는 게 없던 것이다.
물론 설정파일을 불러온다고 해도 제대로 작동하는 건 아니다. 여기서부터는 리눅스의 시스템을 잘 아는 사람만 건드릴 수 있는 부분인데 개인적으로 이걸 왜 기본으로 설치해서 아무 것도 안 하는 서비스를 돌아가고 있게 만들어 놓았는지 모르겠다.
/etc/thermald/thermal-conf.xml
<?xml version="1.0"?>
<!--
use "man thermal-conf.xml" for details
-->
<!-- BEGIN -->
<ThermalConfiguration>
<Platform>
<Name>Spectre 13</Name>
<ProductName>*</ProductName>
<Preference>PERFORMANCE</Preference>
<ThermalSensors>
<ThermalSensor>
<Type>x86_pkg_temp</Type>
<Path>/sys/class/thermal/thermal_zone6/</Path>
<AsyncCapable>1</AsyncCapable>
</ThermalSensor>
</ThermalSensors>
<ThermalZones>
<ThermalZone>
<Type>x86_pkg_temp</Type>
<TripPoints>
<TripPoint>
<SensorType>x86_pkg_temp</SensorType>
<Temperature>70000</Temperature>
<type>active</type>
<ControlType>SEQUENTIAL</ControlType>
<CoolingDevice>
<index>1</index>
<type>rapl_controller</type>
<influence>50</influence>
<SamplingPeriod>5</SamplingPeriod>
</CoolingDevice>
<CoolingDevice>
<index>2</index>
<type>intel_powerclamp</type>
<influence>30</influence>
<SamplingPeriod>5</SamplingPeriod>
</CoolingDevice>
<CoolingDevice>
<index>3</index>
<type>intel_pstate</type>
<influence>0</influence>
<SamplingPeriod>5</SamplingPeriod>
</CoolingDevice>
<CoolingDevice>
<index>4</index>
<type>Processor</type>
<influence>0</influence>
<SamplingPeriod>10</SamplingPeriod>
</CoolingDevice>
</TripPoint>
<TripPoint>
<SensorType>x86_pkg_temp</SensorType>
<Temperature>80000</Temperature>
<type>active</type>
<ControlType>PARALLEL</ControlType>
<CoolingDevice>
<index>1</index>
<type>rapl_controller</type>
<influence>40</influence>
<SamplingPeriod>5</SamplingPeriod>
</CoolingDevice>
<CoolingDevice>
<index>2</index>
<type>intel_powerclamp</type>
<influence>30</influence>
<SamplingPeriod>5</SamplingPeriod>
</CoolingDevice>
<CoolingDevice>
<index>3</index>
<type>intel_pstate</type>
<influence>20</influence>
<SamplingPeriod>10</SamplingPeriod>
</CoolingDevice>
<CoolingDevice>
<index>4</index>
<type>Processor</type>
<influence>20</influence>
<SamplingPeriod>10</SamplingPeriod>
</CoolingDevice>
</TripPoint>
<TripPoint>
<SensorType>x86_pkg_temp</SensorType>
<Temperature>85000</Temperature>
<type>max</type>
<ControlType>PARALLEL</ControlType>
<CoolingDevice>
<index>3</index>
<type>intel_pstate</type>
<influence>50</influence>
<SamplingPeriod>10</SamplingPeriod>
</CoolingDevice>
<CoolingDevice>
<index>4</index>
<type>Processor</type>
<influence>50</influence>
<TargetState>3</TargetState>
<SamplingPeriod>10</SamplingPeriod>
</CoolingDevice>
</TripPoint>
</TripPoints>
</ThermalZone>
</ThermalZones>
<CoolingDevices>
<CoolingDevice>
<Type>rapl_controller</Type>
<IncDecStep>500000</IncDecStep>
</CoolingDevice>
<CoolingDevice>
<Type>intel_powerclamp</Type>
<DebouncePeriod>5000</DebouncePeriod>
<IncDecStep>10</IncDecStep>
</CoolingDevice>
<CoolingDevice>
<Type>intel_pstate</Type>
<DebouncePeriod>1000</DebouncePeriod>
<ReadBack>0</ReadBack>
<MinState>0</MinState>
<MaxState>0</MaxState>
</CoolingDevice>
<CoolingDevice>
<Type>Processor</Type>
<DebouncePeriod>10000</DebouncePeriod>
<ReadBack>0</ReadBack>
<MinState>0</MinState>
<MaxState>10</MaxState>
</CoolingDevice>
</CoolingDevices>
</Platform>
</ThermalConfiguration>
<!--
vim: et st=2 sts=2
-->
그냥 바로 복붙해서 쓸 수 있는 건 아니고 ThermalSensor
부분에 있는 Path
설정을 잘 봐야 하는데 이건 시스템마다 모두 다르다. /sys/class/thermal/
밑에 가 보면 여러가지 쿨링 디바이스와 온도 센서 등이 있는데 각 thermal_zone*에 들어가서 type
파일을 보면 타입을 알 수 있다.