# 가장 안정적인 Raspberry Pi? 열 관리로 81% 향상된 NTP 정확도

> Clean Markdown view of GeekNews topic #24641. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=24641](https://news.hada.io/topic?id=24641)
- GeekNews Markdown: [https://news.hada.io/topic/24641.md](https://news.hada.io/topic/24641.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2025-11-27T05:48:12+09:00
- Updated: 2025-11-27T05:48:12+09:00
- Original source: [austinsnerdythings.com](https://austinsnerdythings.com/2025/11/24/worlds-most-stable-raspberry-pi-81-better-ntp-with-thermal-management/)
- Points: 1
- Comments: 1

## Topic Body

- **Raspberry Pi 기반 NTP 서버**의 주파수 변동을 줄이기 위해 **CPU 코어 고정과 열 안정화**를 결합한 실험 결과 소개  
- CPU 온도 변화가 **크리스털 오실레이터의 주파수 드리프트**를 유발함을 관찰하고, 이를 일정 온도로 유지해 안정화  
- **PID 제어 기반 ‘time burner’ 프로세스**로 CPU를 54°C에 유지하며, **81% 주파수 변동 감소**와 **77% 표준편차 감소** 달성  
- **CPU 0을 chronyd 전용으로 고정**하고 나머지 코어로 열 부하를 유지해 NTP 오프셋을 **평균 38ns 수준**으로 개선  
- 정밀 시각 동기화나 과학 장비 등 극한의 정확도가 필요한 환경에서 **저비용 고정밀 타이밍 서버 구현 가능성** 제시  

---

### 문제: 온도 변화로 인한 타이밍 불안정
- Raspberry Pi의 **동적 주파수 조절(DVFS)** 기능이 전력 효율에는 유리하지만, **정밀 시각 동기화에는 불리**  
  - CPU 부하에 따라 클록 주파수가 변하면 시스템 클록의 틱 속도도 변동  
- **크리스털 오실레이터의 주파수는 온도에 민감**하며, CPU 발열에 따라 수 ppm 단위로 변동  
  - 낮과 밤의 온도 변화에 따라 주파수 드리프트가 발생  
- Grafana 모니터링 결과, CPU 온도 변화에 따라 **약 ±1ppm의 주파수 오프셋**이 관찰됨  
  - RMS 오프셋 평균은 86ns 수준으로, 개선 여지 존재  

### 발견: 일정 온도 유지의 효과
- CPU 온도를 일정하게 유지하면 **주파수 안정성 향상** 가능성 확인  
- 해결책은 두 가지로 구성  
  1. **CPU 코어 격리** – chronyd와 PPS 인터럽트를 CPU 0에만 할당  
  2. **열 안정화** – 나머지 코어를 지속적으로 가동해 일정 온도 유지  
- 2025년 11월 17일 09:10에 열 안정화 시스템을 활성화하자 **주파수 진동이 즉시 감소**  

### 해결책 1: CPU 코어 고정 및 실시간 우선순위 설정
- **CPU 0**: chronyd와 PPS 인터럽트 전용  
- **CPU 1–3**: 일반 작업 및 열 부하 유지  
- 부팅 시 자동 실행되는 **최적화 스크립트** 구성  
  - CPU 주파수 조절 모드를 **performance**로 고정  
  - **PPS IRQ(200)** 를 CPU 0에 고정  
  - **chronyd를 실시간 우선순위(SCHED_FIFO 50)** 로 설정  
  - **ksoftirqd/0 프로세스 우선순위 향상**  
- 스크립트는 `/etc/rc.local` 또는 systemd 서비스로 등록 가능  

### 해결책 2: PID 제어 기반 열 안정화
- CPU 온도를 일정하게 유지하기 위해 **PID 제어 루프**를 사용  
  - 목표 온도: **54°C**  
  - **CPU 1–3**에서 3개의 워커 프로세스가 MD5 해시 연산으로 부하 생성  
  - PID 출력값에 따라 **연산 시간과 대기 시간**을 조절  
- **PID 파라미터**  
  - Kp=0.05, Ki=0.02, Kd=0.0  
  - 온도 변화가 느리므로 미분항(Kd)은 0  
- 결과적으로 CPU 온도는 ±0.2°C 범위 내에서 안정 유지  

### 결과: 주파수 안정성 향상
- **주파수 변동성 81% 감소**, **표준편차 77% 감소**, **RMS 오프셋 49% 감소**  
- 평균 RMS 오프셋: 85.44ns → 43.54ns  
- 중앙값 RMS 오프셋: 80.13ns → 37.93ns  
- CPU 온도 54°C 유지 상태에서 **±0.14ppm 범위의 주파수 안정성** 확보  
- 실내 온도 변동(18.9~22.2°C)에도 불구하고 안정성 유지  

### 설정 절차
- 사전 준비: GPS PPS 기반 NTP 서버 구축 필요  
- **필수 패키지 설치**  
  - `linux-cpupower`, `python3`, `util-linux`  
- **부팅 최적화 스크립트** `/usr/local/bin/pps-optimize.sh` 작성 및 systemd 등록  
- **열 제어 스크립트** `/usr/local/bin/time_burner.py` 작성 및 서비스 등록  
  - `ExecStart=/usr/bin/python3 /usr/local/bin/time_burner.py -t 54.0 -n 3`  
- **검증 명령**  
  - CPU governor: `performance` 확인  
  - chronyd CPU 고정 및 우선순위 확인  
  - `chronyc tracking`으로 RMS 오프셋 측정 (예: 35ns 수준)  

### 모니터링 및 문제 해결
- 실시간 모니터링: `watch -n 1 "chronyc tracking"`  
- 서비스 상태 확인: `sudo systemctl status time-burner.service`  
- PID 튜닝  
  - 온도 진동 시 Kp 감소, 안정화 지연 시 Ki 증가  
  - 목표 온도는 50~60°C 범위에서 조정 가능  
- 높은 CPU 사용률(약 90%)은 의도된 동작  

### 트레이드오프
- **전력 소비 증가**: 3–4W 지속 소비 (연간 약 15–25kWh)  
- **발열 증가**: 54°C 유지, 안전 범위 내  
- **CPU 자원 점유**: 4코어 중 3코어 사용  
  - NTP 전용 장비에는 적합, 다중 서비스 환경에는 부적합  

### 적용 가능 분야
- **정밀 시각 동기화**, **과학 장비**, **분산 시스템 연구**, **네트워크 테스트** 등  
- 일반 용도에는 과도하지만, **저비용 고정밀 실험 환경 구축**에 유용  

### 향후 개선 방향
- **적응형 PID 튜닝**으로 계절별 온도 변화 대응  
- **하드웨어 기반 냉각 제어**(PWM 팬 등)로 전력 효율 개선  
- **OCXO(오븐 제어 크리스털 오실레이터)** 적용 시 열 드리프트 제거 가능  

### 결론
- CPU 코어 고정과 PID 제어 열 관리 결합으로 **초정밀 NTP 서버 구현**  
- 주파수 안정성 81% 향상, RMS 오프셋 38ns 달성  
- 실험을 통해 **열 관리와 실시간 스케줄링의 상관관계**를 입증  
- 실용성보다는 **기술적 탐구와 학습 가치** 중심의 프로젝트임

## Comments



### Comment 46847

- Author: neo
- Created: 2025-11-27T05:48:12+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=46042946) 
- CPU0을 피하고 커널 명령줄에 **idle=poll**을 설정하면 더 나은 정밀도를 얻을 수 있음  
  CPU0에는 다른 인터럽트들이 몰리기 때문에, 높은 타이밍 정밀도가 필요한 작업에는 적합하지 않음
  - 나도 같은 생각임. 우리 **Debian 기반 OS 배포판**에서도 주파수 스케일링 비활성화, 코어 고정 등 비슷한 최적화를 함  
    CPU0에는 옮길 수 없는 시스템 작업이 많아서, 다른 코어를 **격리된 섬(isolated core)** 으로 쓰는 게 훨씬 나음  
    우리 격리 코어의 스케줄러 지연(latency)은 최소 1µs, 평균 5µs, 최대 59µs 정도로 매우 안정적임
  - 좋은 팁임. 오늘 나중에 직접 시도해볼 생각임
- **WWVB 송신소**에서는 온도 변화를 막기 위해 수백 개의 물병으로 장비를 단열함  
  관련 기사: [Spare Time – JILA](https://jila.colorado.edu/news-events/articles/spare-time)
  - 그 페이지는 따로 공유할 가치가 있음. **원자시계 4개**를 운영하면서 UPS가 자동차 배터리 두 개와 헤드라이트 두 개로 구성된다는 점이 정말 인상적임  
    물병으로 만든 열 질량(thermal mass)도 흥미로움
  - 나도 비슷한 방법을 씀. 단열된 창고 안 책상 밑에 물을 저장해서 밤새 얼지 않게 함  
    마치 침낭 속에 **따뜻한 돌**을 넣는 효과와 비슷함
- 나는 **Austin (austinsnerdythings.com)** 임. 어젯밤에 글을 올리고 자고 일어났더니 HN 1위라 놀랐음  
  내 **LEA-M8T**는 16Hz로 타임 펄스를 생성하고, chrony 설정에서 dpoll=-4로 설정했음. 16초 간격으로 256 샘플을 모아 안정성이 향상됨  
  책상 옆에는 **BH3SAP GPSDO**도 있음. Claude가 펌웨어를 수정해 GPS PPS가 없어도 펄스를 계속 생성하는 **flywheel 모드**를 추가했음  
  또 TSIP(Trimble 프로토콜) 출력을 지원하도록 업데이트했음. 관련 내용은 다음 글에서 다룰 예정임  
  댓글들에 대한 답변도 곧 달 예정이며, 질문은 언제든 환영임
  - 좋은 글 고마움. 나도 비슷한 세팅을 하고 있어서 참고가 많이 됨  
    16Hz 펄스가 실제로 얼마나 차이를 만드는지 궁금함. 그리고 데이터를 **influxdb**로 어떻게 넣는지도 알고 싶음. 나는 collectd를 쓰는데 정보가 부족함
  - 프로젝트 멋짐. 혹시 **Raspberry Pi를 케이스에 넣었는지** 궁금함  
    금속 케이스라도 있으면 난방기나 에어컨의 주기적 온도 변화로부터 더 안정적인 결과를 얻을 수 있음
- 저가형 Pi 오실레이터 크리스털을 **TCXO**로 교체하면 훨씬 안정적인 주파수를 얻을 수 있음  
  관련 문서: [Raspberry Pi StackExchange – oscillator 교체](https://raspberrypi.stackexchange.com/questions/74482/switch-out-the-x1-oscillator-on-a-rpi-2-3)  
  이 방법만으로도 드리프트가 4~5배 줄어듦. 다른 기법과 병행하면 더 좋음
  - 그 글 여러 번 읽었음. Pi4용 **OCXO가 달린 오디오파일용 HAT**도 팔고 있음  
    하지만 납땜 실력이 부족해서 직접 교체하기는 자신이 없음
  - **TCXO 가격**이 의외로 저렴함. Abracon 제품 중 일부는 2달러 이하였음
- 이건 **SBC 규모의 OCXO**임. 더 큰 히트싱크를 달거나 오실레이터 주변에 **열 질량(thermal mass)** 을 추가하면 도움이 될지 궁금함  
  단순히 NTP 서버를 세팅하는 일에서도 배울 게 많음
  - **Flirc 금속 케이스**를 추천함. CPU가 케이스 본체에 밀착되어 큰 열 질량을 형성함  
    팬 없이도 훌륭한 **수동 냉각**이 가능함
  - 나도 비슷하게 생각함. CPU와 오실레이터 위에 금속 블록을 얹어 **열 관성**을 높이면 좋을 듯함  
    온도가 천천히 변하면 클록 드리프트도 느리게 변하므로 보정이 쉬움  
    다만 작은 히트싱크는 오히려 주변 온도 변화에 민감해질 수 있음
  - Pi의 케이스에 **단열재를 추가**하는 것도 고려 중임  
    방 온도 급변(창문 열기, 샤워 후 습기 등)을 완화하고, CPU가 불필요하게 열을 태우는 걸 줄일 수 있음  
    결국 목표는 열을 일정하게 유지하는 것임
  - 하지만 너무 많은 열 방출은 오히려 역효과일 수 있음  
    다른 코어들이 이미 최대 온도 근처에서 동작하며, 온도에 따라 클록 속도를 자동 조절함  
    과도한 냉각은 이 **자체 온도 제어 메커니즘**을 방해할 수 있음
- 크리스털에 **저항과 폼 단열재**를 붙여 직접 가열하는 방법도 있음  
  GPIO로 제어 가능한 트랜지스터를 추가해 **PID 제어**로 온도를 유지할 수도 있음
  - 이건 거의 100년 전부터 쓰이던 방식임. 1950년대의 **크리스털 오븐**은 작은 금속 상자 안에서 약 75°C로 유지되었음  
    온도 계수(temperature coefficient)가 0에 가깝도록 절단된 크리스털을 사용했기 때문에 안정적이었음  
    최근 장비들도 여전히 이런 구조를 사용하며, 완전히 안정화되기까지 약 5분 정도 걸림
  - 나도 예전에 Pi를 **포장용 폼 위에 올려놓는 실험**을 했음  
    주변 온도 변화는 줄었지만, 결국엔 **온도 제어 챔버** 안에 넣는 게 가장 확실한 해결책임
- 굳이 CPU를 태워 온도를 유지하기보다는, **마이크로컨트롤러와 정밀 오실레이터**를 쓰는 게 더 낫지 않을까 생각함  
  예를 들어 STM32 보드에 이더넷을 연결해 NTP 서버로 쓰면 더 안정적일 듯함
  - 나도 그걸 가지고 있음. eBay에서 70달러에 산 **BH3SAP GPSDO**인데, 수정된 펌웨어로 **flywheel 모드**를 지원함  
    Pi에 NTP 신호를 공급할 수 있고, STM32도 가능하지만 기본적으로 이더넷 기능은 없음
  - 일반적으로 NTP는 **시간 민감 프로세스**라서, SoC보다 MCU가 훨씬 안정적임  
    RTLinux에는 외부 핀 상태에 맞춰 스케줄러를 동기화하는 기능도 있음  
    하지만 프로세서가 많아지면 **메타안정성(metastability)** 문제가 생김  
    Pi는 FPGA(Zynq)처럼 실시간 보장을 제공하지 않음
- SoC의 온도를 일정하게 유지하기 위해 **의도적으로 부하를 주는 발상**은 생각 못 했음  
  하지만 소비 전력이 낮으니, 복잡한 냉각 시스템 대신 약간의 전력 낭비로 해결하는 게 합리적임
- 2022년에 관련된 **논문**이 있었음: [USENIX NSDI22 – Najafi](https://www.usenix.org/conference/nsdi22/presentation/najafi)
  - 흥미로운 논문이었음. **온도 반응 곡선 모델링**으로 CPU를 태우는 대신 더 우아하게 문제를 해결함
  - 하지만 그 논문은 서버 내 **온도 센서의 다양성**을 관찰한 정도임  
    PPS 신호 두 개로 지터를 감지하는 방법은 오래된 기술이고, **온도 계수 학습(tempco learning)** 도 수십 년 전부터 존재함  
    실제로 그 학습된 tempco가 얼마나 정확한지에 대한 검증은 빠져 있음
