개요

IKEA EKET 두 개에 장비를 넣어 쓰다가 발열 때문에 바꿨다. 8월 15일에 수납장과 랙을 갈고 배기 덕트를 뺐다. 수납장과 배기만으로는 온도가 안 내려가서, 2주 뒤 SSD 방열판까지 달았다.

문제 인지: 온도 규칙 0건

알림 규칙을 196개 만들어 뒀다. 노드와 파드, 인그레스, CI까지 덮었는데 온도만 한 건도 없었다. 온도 데이터는 몇 달째 쌓이고 있었고, 그 패널을 열지 않았다.

8월 말에 그걸 알아채고 node_hwmon_temp_celsius를 꺼내 봤다. 7일 최고 온도가 하이퍼바이저 두 대에서 각각 99.9°C와 104.9°C였다. 잠깐 튄 값이 아니라 그 근처를 자주 오갔다.

아래는 임계(node_hwmon_temp_crit_celsius)의 90%를 넘긴 시간 비율이다.

센서임계 90% 초과 시간
bd895i CPU49.2%
bd895i nvme134.3%
bd895i nvme031.4%
wtrpro nvme024.2%

NVMe 임계는 대략 85°C고, 그 지점에서 강제 스로틀과 수명 손상이 시작된다.

“임계 근접(90%)” 알림을 만들려다 말았다. 90% 초과가 상시니까 켜자마자 계속 울리게 된다. 알림을 늘리는 대신 냉각을 손보기로 했다.

- alert: NodeSensorAtCriticalTemp
  expr: node_hwmon_temp_celsius / on(instance,chip,sensor) group_left node_hwmon_temp_crit_celsius >= 1
  for: 2m

원인: 더운 실내

IKEA EKET 두 개를 쌓아 쓰고 있었다. 뒤판에 케이블 구멍이 있어 완전히 막힌 상자는 아니었다. 다만 위아래가 뚫려 있지 않아 큐브끼리 공기가 오가지 못했다.

더 큰 문제는 방이었다. 8월 초 이 방은 최고 39.0°C였다. 뒤 구멍으로 들어오는 공기가 이미 그 온도라 안에서 돌려봐야 소용이 없었다.

1단계: 수납장·랙·배기 (08-15)

수납장IKEA LASTARE. 프레임이 세로로 길어 랙을 통째로 세워 넣는다. 칸마다 막히던 EKET과 달리 안이 하나로 트여 있다.

Lab Rax 10” Server Rack(mklements 설계, 소개 글). M6 너트를 쓰도록 수정된 리믹스를 6U로 두 개 뽑아 이어 붙였다. 위아래 핸들을 1U씩 더해 총 14U가 됐다. 우상단에 팬 자리가 있다.

— Phanteks 200mm 두 개. 하나는 랙 위 팬 자리, 하나는 wtrpro 메인보드 배기 구멍에.

배기 — 수납장 맨 위에 후드를 두고 알루미늄 덕트를 물려 창문형 팬으로 뺀다. 상시 구동이고 전원 제어는 Zigbee 스위치로 한다. 실내에서 순환만 시키면 방 온도가 같이 올라가니, 더운 공기는 집 밖으로 버린다.

이 단계에서 NVMe 온도는 내려가지 않았다.

일주일 뒤인 08-25에도 NVMe 한 장이 75°C였고, 방열판 직전인 8월 말에도 임계 90% 초과가 34.3%였다. 랙 안에 둔 Zigbee 센서로도 교체 전후 일평균이 33.6°C와 33.7°C로 같았다.

CPU는 뭐라 말하기 어렵다. 교체 사흘 뒤인 08-18에 뽑은 값이 wtrpro 79.0°C, um880 89.4°C, bd895i 91.9°C인데, 이게 7일 평균이라 교체 전 나흘이 섞여 있다. um880이 아직 값에 남아 있는 것도 그래서다 — 이 호스트는 08-14에 은퇴했다. 교체 직후만 따로 볼 수 있는 값은 남아 있지 않다. 그때 눈에 띈 건 bd895i의 같은 기간 CPU 사용률이 18.3%였다는 것이다.

그래도 사이즈가 커져서 케이블을 정리하고 랙을 관리하기 편해졌다.

2단계: SSD 방열판 (08-29)

랙을 바꾸고 2주가 지났는데도 온도는 그대로였다. 교체 2주 뒤 8월 말에 잰 값이 49.2%, 34.3%다. 수납장과 배기를 손보는 것만으로는 NVMe 온도까지 개선하지 못했다.

부하 보정을 걸어 비교했다. 디스크 사용률 구간을 맞추지 않으면 유휴상태라서 시원한 것과 구분이 안 된다.

호스트 · io_util방열판 전 (평균/최고)방열판 후
bd895i · 0.05~0.1071.7 / 81.9°C57.5 / 64.8°C
wtrpro · 0.10~0.2071.3 / 82.9°C50°C

같은 부하대에서 피크가 18~21도 내려갔다. 다만 방열판을 붙인 뒤 데이터가 얼마 없다. wtrpro 쪽은 전이 948개, 후가 9개다. 내려간 건 맞는데 얼마나 내려갔는지는 이 표만으로는 말하기 어렵다. bd895i는 방열판 후 3시간 29분 동안 CI 빌드까지 돌렸는데 임계 초과 0분이었다.

현재 상태

센서8월 말지금
bd895i CPU49.2%0%
bd895i nvme134.3%0.2%
bd895i nvme031.4%0%
wtrpro nvme024.2%0%

7일 최고 온도도 wtrpro 104.9 → 86.9°C, bd895i 99.9 → 82.9°C로 내려갔다.

정리

온도 데이터는 계속 쌓이고 있었다. 알림 규칙을 만들면서 온도는 한 건도 넣지 않았고, 그래서 하이퍼바이저가 100°C를 찍는 걸 몇 달 몰랐다. 알림을 만들었어도 켜자마자 계속 울렸을 테니 알림만으로 됐을 일도 아니다.

수납장과 랙을 바꾼 것으로는 NVMe 온도가 안 내려갔다. 나중에 붙인 방열판이 피크를 20도 내렸다.

이번엔 교체 전 기준점이 없었다. Prometheus 보존이 retention: 7d라 8월 데이터가 남아 있지 않고, 방 온도로 대신 재보려 해도 에어컨을 킨 적이 있이 섞여 갈라낼 수가 없다. 언제 바꿨는지도 온도 그래프에서 계단이 생긴 자리를 보고 거꾸로 짚었다.

그래서 다음 작업 전에 세 가지를 먼저 하려고 한다.

  • 바꾸기 직전 값을 Grafana 애노테이션으로 찍는다. 그래프에 세로선이 남으면 나중에 거꾸로 짚을 일이 없다
  • Prometheus 보존을 30일로 늘린다. 시계열 중 apiserver_request_duration_seconds_bucket·etcd_request_duration_seconds_bucket 같은 히스토그램 버킷이 35%를 차지한다. metricRelabelings로 버킷만 버리면 _sum·_count는 남으니 요청률은 계속 보면서 PVC를 늘리지 않고 30일이 들어간다
  • Home Assistant의 온습도를 Prometheus로 보낸다. 이번엔 실온은 HA에서, 장비 온도는 Prometheus에서 따로 확인했는데 한곳에서 확인하면 편할 것이다.

이전에도 비슷한 일이 있었다 → K3s 노드 축소