1 पॉइंट द्वारा GN⁺ 2025-11-27 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • Raspberry Pi-आधारित NTP सर्वर की frequency fluctuation कम करने के लिए CPU core pinning और thermal stabilization को मिलाने वाले प्रयोग के नतीजे पेश किए गए
  • यह देखा गया कि CPU तापमान में बदलाव crystal oscillator की frequency drift पैदा करता है, और इसे स्थिर तापमान पर रखकर स्थिर किया गया
  • PID control-आधारित ‘time burner’ process से CPU को 54°C पर बनाए रखते हुए frequency fluctuation में 81% कमी और standard deviation में 77% कमी हासिल की गई
  • CPU 0 को chronyd के लिए समर्पित करके और बाकी cores पर thermal load बनाए रखकर NTP offset को औसतन 38ns स्तर तक सुधारा गया
  • precision time synchronization या scientific instruments जैसे अत्यधिक सटीकता वाले माहौल में कम लागत वाला high-precision timing server बनाने की संभावना दिखाई गई

समस्या: तापमान परिवर्तन से timing instability

  • Raspberry Pi की dynamic frequency scaling (DVFS) सुविधा power efficiency के लिए फायदेमंद है, लेकिन precision time synchronization के लिए नुकसानदेह
    • CPU load के अनुसार clock frequency बदलने पर system clock की tick rate भी बदलती है
  • crystal oscillator की frequency तापमान-संवेदनशील होती है, और CPU heat के अनुसार कुछ ppm के स्तर पर बदलती है
    • दिन और रात के तापमान परिवर्तन के अनुसार frequency drift होती है
  • Grafana monitoring के नतीजों में CPU तापमान बदलने पर लगभग ±1ppm का frequency offset देखा गया
    • RMS offset का औसत 86ns स्तर पर था, यानी सुधार की गुंजाइश मौजूद थी

खोज: स्थिर तापमान बनाए रखने का असर

  • CPU तापमान को स्थिर रखने पर frequency stability बेहतर हो सकती है, यह पुष्टि हुई
  • समाधान दो हिस्सों में बना
    1. CPU core isolation – chronyd और PPS interrupts को सिर्फ CPU 0 पर assign करना
    2. thermal stabilization – बाकी cores को लगातार चलाकर तापमान स्थिर रखना
  • 17 नवंबर 2025 को 09:10 पर thermal stabilization system सक्रिय करते ही frequency oscillation तुरंत घट गई

समाधान 1: CPU core pinning और real-time priority सेटिंग

  • CPU 0: सिर्फ chronyd और PPS interrupts के लिए
  • CPU 1–3: सामान्य कार्य और thermal load बनाए रखने के लिए
  • boot पर अपने-आप चलने वाली optimization script तैयार की गई
    • CPU frequency scaling mode को performance पर fix करना
    • PPS IRQ(200) को CPU 0 पर pin करना
    • chronyd को real-time priority (SCHED_FIFO 50) पर सेट करना
    • ksoftirqd/0 process की priority बढ़ाना
  • script को /etc/rc.local या systemd service के रूप में register किया जा सकता है

समाधान 2: PID control-आधारित thermal stabilization

  • CPU तापमान को स्थिर रखने के लिए PID control loop का उपयोग किया गया
    • target temperature: 54°C
    • CPU 1–3 पर 3 worker processes MD5 hash computation से load बनाते हैं
    • PID output के अनुसार computation time और idle time को adjust किया जाता है
  • PID parameters
    • Kp=0.05, Ki=0.02, Kd=0.0
    • तापमान परिवर्तन धीमा होने के कारण derivative term (Kd) को 0 रखा गया
  • नतीजे में CPU तापमान ±0.2°C की सीमा में स्थिर रखा गया

परिणाम: frequency stability में सुधार

  • frequency variability में 81% कमी, standard deviation में 77% कमी, RMS offset में 49% कमी
  • औसत RMS offset: 85.44ns → 43.54ns
  • median RMS offset: 80.13ns → 37.93ns
  • CPU तापमान 54°C पर बनाए रखने की स्थिति में ±0.14ppm की frequency stability हासिल हुई
  • कमरे के तापमान में बदलाव (18.9~22.2°C) के बावजूद स्थिरता बनी रही

सेटअप प्रक्रिया

  • पूर्व तैयारी: GPS PPS-आधारित NTP सर्वर बनाना जरूरी
  • ज़रूरी packages इंस्टॉल करें
    • linux-cpupower, python3, util-linux
  • boot optimization script /usr/local/bin/pps-optimize.sh लिखें और systemd में register करें
  • thermal control script /usr/local/bin/time_burner.py लिखें और service के रूप में register करें
    • ExecStart=/usr/bin/python3 /usr/local/bin/time_burner.py -t 54.0 -n 3
  • verification commands
    • CPU governor: performance की पुष्टि
    • chronyd का CPU pinning और priority जाँचें
    • chronyc tracking से RMS offset मापें (उदाहरण: 35ns स्तर)

monitoring और troubleshooting

  • real-time monitoring: watch -n 1 "chronyc tracking"
  • service status जाँचें: sudo systemctl status time-burner.service
  • PID tuning
    • तापमान oscillation होने पर Kp घटाएँ, stabilization में देरी हो तो Ki बढ़ाएँ
    • target temperature को 50~60°C रेंज में adjust किया जा सकता है
  • ऊँचा CPU usage (लगभग 90%) जानबूझकर किया गया व्यवहार है

trade-offs

  • power consumption में वृद्धि: लगातार 3–4W खपत (सालाना लगभग 15–25kWh)
  • heat increase: 54°C बनाए रखना, सुरक्षित सीमा के भीतर
  • CPU resources का उपयोग: 4 cores में से 3 cores इस्तेमाल
    • NTP-समर्पित डिवाइस के लिए उपयुक्त, multi-service environment के लिए अनुपयुक्त

लागू होने वाले क्षेत्र

  • precision time synchronization, scientific instruments, distributed systems research, network testing आदि
  • सामान्य उपयोग के लिए यह अधिक हो सकता है, लेकिन कम लागत वाले high-precision experimental environment बनाने में उपयोगी है

आगे के सुधार की दिशा

  • adaptive PID tuning से मौसमी तापमान बदलाव का सामना
  • hardware-based cooling control (PWM fan आदि) से power efficiency बेहतर करना
  • OCXO (oven-controlled crystal oscillator) लगाने पर thermal drift हटाई जा सकती है

निष्कर्ष

  • CPU core pinning और PID-controlled thermal management के मेल से ultra-precision NTP server बनाया गया
  • frequency stability में 81% सुधार, RMS offset 38ns तक हासिल
  • प्रयोग ने thermal management और real-time scheduling के संबंध को साबित किया
  • यह project व्यावहारिकता से ज़्यादा तकनीकी खोज और सीखने के मूल्य पर केंद्रित है

1 टिप्पणियां

 
GN⁺ 2025-11-27
Hacker News राय
  • अगर CPU0 से बचें और kernel command line में idle=poll सेट करें, तो बेहतर precision मिल सकती है
    CPU0 पर बाकी interrupts इकट्ठे होते हैं, इसलिए high timing precision वाले कामों के लिए यह उपयुक्त नहीं है
    • मैं भी सहमत हूँ। हमारी Debian-आधारित OS distribution में भी frequency scaling disable करना, core pinning जैसी मिलती-जुलती optimizations की जाती हैं
      CPU0 पर बहुत से system tasks होते हैं जिन्हें हटाया नहीं जा सकता, इसलिए दूसरे core को isolated core की तरह इस्तेमाल करना कहीं बेहतर है
      हमारे isolated core की scheduler latency बहुत स्थिर है: minimum 1µs, average 5µs, maximum 59µs
    • बढ़िया टिप है। आज बाद में इसे खुद आज़माने का सोच रहा हूँ
  • WWVB transmitter में तापमान परिवर्तन रोकने के लिए सैकड़ों पानी की बोतलों से उपकरण को insulated किया जाता है
    संबंधित लेख: Spare Time – JILA
    • वह पेज अलग से शेयर करने लायक है। 4 atomic clocks चलाना, और UPS का दो car batteries और दो headlights से बना होना, यह सच में प्रभावशाली है
      पानी की बोतलों से बना thermal mass भी दिलचस्प है
    • मैं भी ऐसा ही तरीका इस्तेमाल करता हूँ। insulated shed में desk के नीचे पानी स्टोर करता हूँ ताकि रात भर वह जमे नहीं
      यह कुछ वैसा ही है जैसे sleeping bag के अंदर warm stone रखना
  • मैं Austin (austinsnerdythings.com) हूँ। कल रात पोस्ट लिखकर सोया, और उठकर देखा तो HN पर #1 थी, यह देखकर हैरान रह गया
    मेरा LEA-M8T 16Hz पर time pulse generate करता है, और chrony config में dpoll=-4 सेट किया है। 16 सेकंड के अंतराल पर 256 samples इकट्ठे करके stability बेहतर हुई
    डेस्क के बगल में एक BH3SAP GPSDO भी है। Claude ने firmware modify करके flywheel mode जोड़ा, जिससे GPS PPS न होने पर भी pulse generate होती रहती है
    साथ ही TSIP (Trimble protocol) output support करने के लिए भी update किया है। इसके बारे में अगली पोस्ट में लिखने वाला हूँ
    टिप्पणियों के जवाब भी जल्द दूँगा, और सवाल हमेशा स्वागत योग्य हैं
    • अच्छी पोस्ट के लिए धन्यवाद। मेरा भी कुछ ऐसा ही setup है, इसलिए यह काफ़ी उपयोगी लगा
      16Hz pulse से वास्तव में कितना फ़र्क पड़ता है, यह जानने की जिज्ञासा है। और data को influxdb में कैसे डालते हैं, यह भी जानना चाहूँगा। मैं collectd इस्तेमाल करता हूँ, लेकिन जानकारी कम मिलती है
    • प्रोजेक्ट बढ़िया है। क्या आपने Raspberry Pi को case में रखा है?
      अगर कोई metal case हो, तो heater या air conditioner के periodic temperature changes से अधिक स्थिर परिणाम मिल सकते हैं
  • अगर low-cost Pi oscillator crystal को TCXO से बदल दें, तो frequency कहीं अधिक stable मिल सकती है
    संबंधित दस्तावेज़: Raspberry Pi StackExchange – oscillator replacement
    सिर्फ इससे ही drift 4~5 गुना कम हो जाती है। दूसरी techniques के साथ मिलाकर करें तो और बेहतर है
    • वह पोस्ट कई बार पढ़ चुका हूँ। Pi4 के लिए OCXO वाले audiophile HAT भी बिकते हैं
      लेकिन soldering skill कमज़ोर होने की वजह से खुद बदलने का आत्मविश्वास नहीं है
    • TCXO की कीमत उम्मीद से कम है। Abracon के कुछ products 2 डॉलर से भी कम थे
  • यह लगभग SBC-scale OCXO जैसा है। सोच रहा हूँ कि बड़ा heatsink लगाने या oscillator के आसपास thermal mass जोड़ने से मदद मिलेगी या नहीं
    सिर्फ NTP server सेट करने जैसे काम में भी सीखने को बहुत कुछ है
    • मैं Flirc metal case की सिफारिश करता हूँ। CPU case body से tightly coupled रहता है, जिससे बड़ा thermal mass बनता है
      fan के बिना भी शानदार passive cooling मिलती है
    • मैं भी इसी तरह सोच रहा हूँ। CPU और oscillator के ऊपर metal block रखने से thermal inertia बढ़ सकती है
      तापमान अगर धीरे-धीरे बदले, तो clock drift भी धीरे बदलेगी, इसलिए correction आसान होगा
      हालाँकि छोटा heatsink उल्टा ambient temperature changes के प्रति ज़्यादा sensitive बना सकता है
    • मैं Pi के case में insulation जोड़ने पर भी विचार कर रहा हूँ
      इससे कमरे के तापमान में अचानक बदलाव (खिड़की खोलना, shower के बाद नमी आदि) कम हो सकते हैं, और CPU को बेवजह heat burn नहीं करनी पड़ेगी
      आखिरकार लक्ष्य तापमान को स्थिर रखना है
    • लेकिन बहुत ज़्यादा heat dissipation उल्टा नुकसानदेह भी हो सकती है
      दूसरे cores पहले से maximum temperature के करीब चल रहे होते हैं, और तापमान के अनुसार clock speed अपने-आप adjust करते हैं
      बहुत अधिक cooling इस self temperature control mechanism में बाधा डाल सकती है
  • crystal पर resistor और foam insulation लगाकर उसे सीधे गर्म करने का तरीका भी है
    GPIO से नियंत्रित होने वाला transistor जोड़कर PID control से तापमान स्थिर रखा जा सकता है
    • यह तरीका लगभग 100 साल से इस्तेमाल हो रहा है। 1950s के crystal oven छोटे metal box के अंदर लगभग 75°C पर बनाए रखे जाते थे
      ऐसे crystals इस्तेमाल किए जाते थे जिन्हें इस तरह cut किया जाता था कि temperature coefficient लगभग 0 के करीब रहे, इसलिए वे stable होते थे
      आधुनिक उपकरण भी अब तक यही संरचना इस्तेमाल करते हैं, और पूरी तरह stable होने में लगभग 5 मिनट लगते हैं
    • मैंने भी पहले Pi को packing foam पर रखकर experiment किया था
      ambient temperature changes कम हुए, लेकिन आखिरकार उसे temperature-controlled chamber में रखना ही सबसे पक्का समाधान है
  • सिर्फ CPU को गरम करके तापमान बनाए रखने से बेहतर क्या microcontroller और precision oscillator का इस्तेमाल नहीं होगा?
    उदाहरण के लिए Ethernet वाले STM32 board को NTP server की तरह इस्तेमाल करें, तो शायद अधिक stable होगा
    • मेरे पास भी वह है। eBay से 70 डॉलर में लिया हुआ BH3SAP GPSDO, जिसमें modified firmware के साथ flywheel mode सपोर्ट है
      यह Pi को NTP signal दे सकता है, और STM32 भी संभव है, लेकिन इसमें मूल रूप से Ethernet feature नहीं है
    • आम तौर पर NTP एक time-sensitive process है, इसलिए SoC की तुलना में MCU कहीं अधिक stable होता है
      RTLinux में external pin state के साथ scheduler को sync करने की सुविधा भी है
      लेकिन processors बढ़ने पर metastability की समस्या आती है
      Pi, FPGA (Zynq) की तरह real-time guarantee नहीं देता
  • SoC का तापमान स्थिर रखने के लिए जानबूझकर load देना मेरे दिमाग में नहीं आया था
    लेकिन power consumption कम है, इसलिए complex cooling system के बजाय थोड़ी power waste करके समस्या हल करना व्यावहारिक लगता है
  • 2022 में इस विषय पर एक paper आया था: USENIX NSDI22 – Najafi
    • दिलचस्प paper था। temperature response curve modeling के जरिए CPU को गरमाने के बजाय समस्या को ज़्यादा elegant तरीके से हल किया गया
    • लेकिन वह paper सिर्फ server के अंदर temperature sensors की विविधता देखने तक सीमित है
      दो PPS signals से jitter detect करने का तरीका पुराना है, और tempco learning भी कई दशक पुरानी तकनीक है
      असल सवाल यह है कि सीखी गई tempco वास्तव में कितनी accurate है, इसकी validation उसमें नहीं है