Linux CPU 온도 한계점 해제

d3fau1t·2021년 12월 5일
0

Embedded

목록 보기
6/6

이전에 SBC의 CPU 부하 테스트 진행중, 온도가 올라가면 클럭이 낮아지는 현상을 발견하였음.
CPU내부의 온도센서가 특정 온도이상의 상태를 감지하면 뭔가 제한을 하는 것으로 보였음.
전력소모량 관계없이 쿨링을 최대한 지원한다는 조건하에 제한을 풀어버려도 되겠다 생각이 들었기 때문에 제한을 해제하였던 내용을 포스트로 기록함.

디바이스트리 파일을 수정하여 온도 제한을 풀어버릴 수 있다.

알아야 할 기본 내용

디바이스 트리 파일을 수정하여 thermal zone의 제한을 조정하고 싶을때 필요한 내용을 리눅스 커널 메인라인 저장소 내부의 thermal관련 문서에서 확인하였음.

CPU들의 thermal 관련 설정은 각 CPU의 디바이스트리(*.dts) 파일 안에 기록되어있음.
디바이스 트리 내부의 노드 유형은 다음 다섯가지가 있음.

참조한 문서를 보고 학습하면서 옮겨적은 내용이기 때문에 틀린 내용이 있을 수도 있음
잘못된 내용을 보실경우 피드백 부탁드립니다

디바이스 트리 내부 노드 구성요소

구성요소설명
thermal sensor온도 측정에 사용되는 센서
cooling devices온도에따른 쿨링을 해주는 장치
trip points이쯤되면 뭔가 해야하는데? 라고 생각되는 온도와 작업을 바인딩해둔 부분.
cooling mapstrip points와 cooling devices간의 관계를 설명하려고 기록해둔 부분.
thermal zones하드웨어 내부 thermal 관련 데이터를 설명하려고 기록해둔 부분.

Thermal sensor devices

thermal-sensor-cells

type : unsigned
size : one cell
일반적으로 온도 센서가 하나 있는데, 그럴 때 0으로 설정함. 아닌경우엔 1.
자세한 내용은 thermal zone binding 참조.

Cooling devices

cooling-cells

type : unsigned
size : one cell
쿨링 장치 관련 정보를 제공하는 데 사용됨.
참조에 사용되는 최소 및 최대 냉각 상태를 지정하려면 최소 2를 적어줘야함.
첫 번째 셀은 요청 된 최소 냉각 상태이고 두 번째 셀은 참조에서 요청 된 최대 냉각 상태임.

Trip points

temperature

type : signed
size : one cell
Trip 온도 수준을 나타내는 정수값. (단위 milli Celcius)

hysteresis

type : unsigned
size : one cell
온도 특성에 대해 낮은 hysteresis 값.
상대적인 값이며, 단위는 milli Celcius 임.

이력현상 또는 히스테리시스는 물질이 거쳐 온 과거가 현재 상태에 영향을 주는 현상으로 어떤 물리량이 그 때의 물리조건만으로 결정되지 않고 이전에 그 물질이 경과해 온 과정에 의존하는 특성을 말한다.

type

type: String

문자열을 포함하는 Trip 타입.

Cooling device maps

cooling-devices

type: phandles + cooling specifier

지정자가있는 냉각 장치의 '팬들 (phandles)'목록으로, 이 바인딩에서 사용되는 냉각 장치를 나타냄.
냉각 지정자에서 첫 번째 셀은 최소 냉각 상태이고 두 번째 셀은 이 맵에서 사용 된 최대 냉각 상태.

trip

type: phandles of trip point node
동일한 thermal zone 내의 trip point node의 phandle

Thermal zone nodes

냉각 장치 바인딩을 포함하여 열 영역을 설명하는 데 필요한 모든 정보가 포함 된 노드.
열 영역 노드에는 자체 속성과 별도로 트립 노드를 포함하는 하나의 하위 노드와 모든 영역 냉각 맵을 포함하는 하나의 하위 노드가 있어야함.

polling-delay

type: unsigned
size: one cell
이 열 영역을 확인할 때 폴링 사이에 대기하는 최대 시간 (밀리 초).

polling-delay-passive

type: unsigned
size: one cell
수동 냉각을 수행 할 때 폴링 사이에 대기하는 최대 시간 (밀리 초).

thermal-sensors

type: list of phandles + sensor specifier
thremal zone을 모니터링하는 동안 사용되는 열 센서 phandles 및 센서 지정자 목록.

trips

type: Sub-node
thermal zone을 설명하는 데 필요한 트립 지점 노드의 컨테이너인 하위 노드.

cooling-maps

type: Sub-node
트립과 냉각 장치 간의 관계를 설명하는 데 사용되는 냉각 장치 맵 노드의 컨테이너 인 하위 노드.

dts 파일 조작

사용중인 보드는 96Board의 Rock960ab이다.
아래의 내용은 github@rockchip-linux의 리눅스 커널내부에 위치한 rk3399.dtsi 일부를 발췌하여 수정한 내용.

thermal_zones: thermal-zones {
	soc_thermal: soc-thermal {
		polling-delay-passive = <20>; /* milliseconds */
		polling-delay = <1000>; /* milliseconds */
		sustainable-power = <1000>; /* milliwatts */

		thermal-sensors = <&tsadc 0>;

		trips { // 온도에 따른 정책
			threshold: trip-point-0 {
         // 70도를 넘길경우 2도마다 작동중 클럭이 낮아지는 이유는 여기서 알수있었음.
         // temperature 항목을 수정하면 클럭이 낮아지는 시점을 늦출 수 있음.
				temperature = <70000>; /* millicelsius */
				hysteresis = <2000>; /* millicelsius */
				type = "passive";
			};
			target: trip-point-1 {
         // 이 부분에 대한 이해가 약간 부족해서 위의 threshhold 부분과 같이 설정해줬음.
				temperature = <85000>; /* millicelsius */
				hysteresis = <2000>; /* millicelsius */
				type = "passive";
			};
			soc_crit: soc-crit { // 여기까진 안올려봐서 모르겠지만 이 이후로는 고장날 것 같기도 하고... 관리 범위 밖인듯.
				temperature = <115000>; /* millicelsius */
				hysteresis = <2000>; /* millicelsius */
				type = "critical";
			};
		};

		cooling-maps {
			map0 {
				trip = <&target>;
				cooling-device =
					<&cpu_l0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
				contribution = <4096>;
			};
			map1 {
				trip = <&target>;
				cooling-device =
					<&cpu_b0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
				contribution = <1024>;
			};
			map2 {
				trip = <&target>;
				cooling-device =
					<&gpu THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
				contribution = <4096>;
			};
		};
	};

	gpu_thermal: gpu-thermal {
		polling-delay-passive = <100>; /* milliseconds */
		polling-delay = <1000>; /* milliseconds */

		thermal-sensors = <&tsadc 1>;
	};
};
  • thermal zone 내부 값을 이리저리 바꿔보았더니 온도가 100도까지 올라가도 클럭이 떨어지지 않았음.
  • rock960ab 보드에서 스트레스 테스트 진행하였다.
    • 4 프로세스, 8 스레드
    • 12V/0.45A 만큼 전력을 소모했다.
    • dts변경 이후 같은 조건으로 테스트할 경우 12V/1.05A 정도의 전력을 소모하였음.
    • 원하는 수치를 뽑았으니 테스트를 마치고, 다시 원상복구시켰음.
profile
웹 백엔드 합니다.

0개의 댓글

관련 채용 정보