미니PC 홈서버 CPU가 94도까지 오르길래
마크 서버를 하나 더 팔까 하다가 문득 서버 온도가 궁금해졌다. sensors 쳐보니 Tctl 70도. 놀고 있는 서버가 70도면 좀 높은데? 싶어서 Prometheus에 쌓인 24시간치를 뽑아봤다.
- 평균 68.9도
- 최저 60.2도
- 최고 94.1도
Ryzen 스로틀 한계가 95도다. 매일 밤 한계 바로 앞까지 가고 있었음. 85도 넘긴 시간만 하루 34분.
부하도 없는데 왜 뜨겁지?
스파이크 난 시간대를 찍어보니 밤 11시부터 새벽 1시. 백업 도는 시간인가 했는데 크론에 그런거 없다. 친구들이 마크랑 팰월드 하는 시간이었음. 근데 그 시간대 CPU 사용률을 보니 12~17%다. 12스레드 중에 2코어 정도 쓴건데 이걸로 94도까지 감.
이 미니PC에 든 칩이 Ryzen 5 5625U다. 노트북용 15W짜리. 쿨러도 노트북 수준인데 설계상 95도까지는 부스트를 밀어붙이게 돼있다. governor를 powersave로 해놨는데도 클럭을 찍어보니 4.17GHz. 절전 모드라며...
서버 워크로드는 잠깐 일하고 쉬는 패턴이라, 그 잠깐마다 풀부스트로 튀면서 열을 왕창 만드는 구조였다.
마지막 1GHz가 열의 절반
전력은 클럭에 비례하는게 아니라 대략 클럭 곱하기 전압 제곱이다. 전압이 클럭 따라 비선형으로 오르니까 3.2GHz에서 4.4GHz 가는 마지막 구간이 발열의 절반 가까이를 만든다. 반대로 말하면 그 구간만 잘라내면 성능은 조금 잃고 열은 왕창 버는 것임.
그래서 최대 클럭에 3.2GHz 캡을 걸었다. 재부팅에도 유지되게 systemd oneshot으로.
[Unit]
Description=Cap CPU max frequency to 3.2GHz
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'for f in /sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq; do echo 3200000 > "$f"; done'
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
3.2GHz로 잡은 이유는 이 칩 기본 클럭(2.3GHz)보다는 한참 위라서다. 마크 틱 처리 성능은 거의 그대로고 발열 급증 구간만 잘린다.
결과
- 평시 70도대 → 52도
- 패키지 전력 41W → 11W
- 게임 서버 체감 차이 없음
20도 가까이 떨어졌다. 이 정도면 청소기 들고 케이스 뜯을 필요도 없었음
케이스 개조는?
외부 팬이나 쿨링패드도 생각했었는데 순서가 있다. 미니PC는 흡기구랑 배기구가 몇 cm 옆이라 가만두면 자기가 뱉은 열기를 자기가 다시 마신다. 외부 바람은 그 고인 공기를 흩어주는 것만으로 몇 도 먹고 들어간다. 근데 그건 베이스라인을 낮추는 얘기고, 94도 스파이크의 범인은 부스트 클럭이라 캡이 먼저였다.
마치며
덕분에 마크 서버 하나 더 팔 여유가 생겼다. 그건 다음 글에서.