1 puan yazan GN⁺ 2025-11-27 | 1 yorum | WhatsApp'ta paylaş
  • Raspberry Pi tabanlı NTP sunucusunda frekans dalgalanmasını azaltmak için CPU çekirdeği sabitleme ile termal kararlılığı birleştiren deney sonuçları tanıtılıyor
  • CPU sıcaklık değişimlerinin kristal osilatörde frekans kaymasına yol açtığı gözlemlendi ve bunu sabit sıcaklıkta tutarak kararlılık sağlandı
  • PID kontrollü time burner süreci ile CPU 54°C’de tutulurken, frekans dalgalanmasında %81 azalma ve standart sapmada %77 düşüş elde edildi
  • CPU 0 yalnızca chronyd için ayrılıp diğer çekirdeklerle termal yük korunarak NTP ofseti ortalama 38ns seviyesine iyileştirildi
  • Hassas zaman senkronizasyonu veya bilimsel cihazlar gibi aşırı doğruluk gereken ortamlarda düşük maliyetli yüksek hassasiyetli zamanlama sunucusu kurma olasılığı gösterildi

Sorun: Sıcaklık değişiminden kaynaklanan zamanlama kararsızlığı

  • Raspberry Pi’nin dinamik frekans ölçekleme (DVFS) özelliği güç verimliliği açısından avantajlı olsa da hassas zaman senkronizasyonu için dezavantajlı
    • CPU yüküne göre saat frekansı değiştiğinde sistem saatinin tik hızı da dalgalanıyor
  • Kristal osilatörün frekansı sıcaklığa duyarlı ve CPU’nun ürettiği ısıya göre birkaç ppm düzeyinde değişebiliyor
    • Gündüz ve gece sıcaklık değişimine bağlı frekans kayması oluşuyor
  • Grafana izleme sonuçlarında, CPU sıcaklığı değişimine bağlı olarak yaklaşık ±1ppm frekans ofseti gözlemlendi
    • Ortalama RMS ofset 86ns seviyesindeydi ve iyileştirme payı vardı

Bulgular: Sabit sıcaklık korumanın etkisi

  • CPU sıcaklığı sabit tutulduğunda frekans kararlılığının artırılabileceği doğrulandı
  • Çözüm iki parçadan oluşuyor
    1. CPU çekirdeği izolasyonu – chronyd ve PPS kesmeleri yalnızca CPU 0’a atanıyor
    2. Termal kararlılık – diğer çekirdekler sürekli çalıştırılarak sıcaklık sabit tutuluyor
  • 17 Kasım 2025 09:10’da termal kararlılık sistemi etkinleştirildiğinde frekans salınımı hemen azaldı

Çözüm 1: CPU çekirdeği sabitleme ve gerçek zamanlı öncelik ayarı

  • CPU 0: yalnızca chronyd ve PPS kesmeleri için
  • CPU 1–3: genel işler ve termal yükün korunması için
  • Açılışta otomatik çalışan bir optimizasyon betiği yapılandırıldı
    • CPU frekans ölçekleme modu performance olarak sabitleniyor
    • PPS IRQ(200) CPU 0’a sabitleniyor
    • chronyd gerçek zamanlı öncelik (SCHED_FIFO 50) ile çalıştırılıyor
    • ksoftirqd/0 sürecinin önceliği artırılıyor
  • Betik /etc/rc.local içine veya bir systemd servisi olarak kaydedilebiliyor

Çözüm 2: PID kontrollü termal kararlılık

  • CPU sıcaklığını sabit tutmak için PID kontrol döngüsü kullanılıyor
    • Hedef sıcaklık: 54°C
    • CPU 1–3 üzerinde çalışan 3 worker süreci MD5 hash hesaplamasıyla yük üretiyor
    • PID çıktı değerine göre hesaplama süresi ile bekleme süresi ayarlanıyor
  • PID parametreleri
    • Kp=0.05, Ki=0.02, Kd=0.0
    • Sıcaklık değişimi yavaş olduğu için türev terimi (Kd) 0 olarak bırakıldı
  • Sonuç olarak CPU sıcaklığı ±0.2°C aralığında kararlı biçimde tutuldu

Sonuçlar: Frekans kararlılığında artış

  • Frekans oynaklığında %81 azalma, standart sapmada %77 düşüş, RMS ofsette %49 azalma
  • Ortalama RMS ofset: 85.44ns → 43.54ns
  • Medyan RMS ofset: 80.13ns → 37.93ns
  • CPU sıcaklığı 54°C’de tutulurken ±0.14ppm aralığında frekans kararlılığı sağlandı
  • Ortam sıcaklığı değişimine (18.9~22.2°C) rağmen kararlılık korundu

Kurulum adımları

  • Ön hazırlık: GPS PPS tabanlı bir NTP sunucusunun kurulmuş olması gerekiyor
  • Gerekli paketlerin kurulması
    • linux-cpupower, python3, util-linux
  • Açılış optimizasyon betiği /usr/local/bin/pps-optimize.sh hazırlanıp systemd’ye kaydediliyor
  • Termal kontrol betiği /usr/local/bin/time_burner.py hazırlanıp servis olarak ekleniyor
    • ExecStart=/usr/bin/python3 /usr/local/bin/time_burner.py -t 54.0 -n 3
  • Doğrulama komutları
    • CPU governor: performance kontrolü
    • chronyd CPU sabitlemesi ve öncelik ayarının doğrulanması
    • chronyc tracking ile RMS ofset ölçümü (ör. 35ns seviyesi)

İzleme ve sorun giderme

  • Gerçek zamanlı izleme: watch -n 1 "chronyc tracking"
  • Servis durumu kontrolü: sudo systemctl status time-burner.service
  • PID ayarı
    • Sıcaklık salınımı varsa Kp düşürülür, kararlılık gecikiyorsa Ki artırılır
    • Hedef sıcaklık 50~60°C aralığında ayarlanabilir
  • Yüksek CPU kullanımı (yaklaşık %90) kasıtlı bir davranıştır

Ödünleşimler

  • Güç tüketimi artışı: sürekli 3–4W tüketim (yıllık yaklaşık 15–25kWh)
  • Daha fazla ısı üretimi: 54°C’de tutuluyor, güvenli aralık içinde
  • CPU kaynak kullanımı: 4 çekirdeğin 3’ü kullanılıyor
    • Yalnızca NTP’ye adanmış cihazlar için uygun, çok servisli ortamlar için uygun değil

Uygulama alanları

  • Hassas zaman senkronizasyonu, bilimsel cihazlar, dağıtık sistem araştırmaları, ağ testleri vb.
  • Genel kullanım için fazla uç bir yaklaşım olsa da düşük maliyetli yüksek hassasiyetli deney ortamı kurmak açısından faydalı

Gelecekteki iyileştirmeler

  • Uyarlamalı PID ayarı ile mevsimsel sıcaklık değişimlerine uyum sağlama
  • Donanım tabanlı soğutma kontrolü (PWM fan vb.) ile güç verimliliğini artırma
  • OCXO (fırın kontrollü kristal osilatör) kullanılması halinde termal kaymanın ortadan kaldırılabilmesi

Sonuç

  • CPU çekirdeği sabitleme ile PID kontrollü termal yönetimin birleşimi sayesinde ultra hassas NTP sunucusu oluşturuldu
  • Frekans kararlılığı %81 iyileşti, RMS ofset 38ns seviyesine ulaştı
  • Deney, termal yönetim ile gerçek zamanlı zamanlayıcının ilişkisini ortaya koydu
  • Bu proje pratiklikten çok teknik keşif ve öğrenme değeri odaklı

1 yorum

 
GN⁺ 2025-11-27
Hacker News görüşleri
  • CPU0'dan kaçınıp çekirdek komut satırında idle=poll ayarlanırsa daha iyi hassasiyet elde edilebilir
    CPU0'da diğer kesmeler toplandığı için, yüksek zamanlama hassasiyeti gerektiren işler için uygun değildir
    • Ben de aynı fikirdeyim. Bizim Debian tabanlı OS dağıtımımızda da frekans ölçeklemeyi devre dışı bırakma, çekirdek sabitleme gibi benzer optimizasyonlar yapıyoruz
      CPU0'da taşınamayan pek çok sistem işi var; bu yüzden başka bir çekirdeği yalıtılmış ada (isolated core) olarak kullanmak çok daha iyi
      Yalıtılmış çekirdeğimizde zamanlayıcı gecikmesi minimum 1µs, ortalama 5µs, maksimum 59µs civarında ve oldukça kararlı
    • İyi ipucu. Bugün daha sonra bizzat denemeyi düşünüyorum
  • WWVB verici istasyonunda sıcaklık değişimlerini önlemek için ekipman yüzlerce su şişesiyle yalıtılıyor
    İlgili yazı: Spare Time – JILA
    • O sayfa ayrıca paylaşılmayı hak ediyor. 4 atomik saat işletirken UPS'in iki araba aküsü ve iki far ampulünden oluşması gerçekten etkileyici
      Su şişeleriyle oluşturulan ısıl kütle (thermal mass) de ilginç
    • Ben de benzer bir yöntem kullanıyorum. Yalıtılmış depoda masanın altında su depoluyorum ki gece boyunca donmasın
      Tıpkı uyku tulumunun içine sıcak taş koymanın etkisi gibi
  • Ben Austin (austinsnerdythings.com). Dün gece yazıyı paylaşıp yattım, uyandığımda HN'de 1 numara olduğunu görmek şaşırtıcıydı
    Benim LEA-M8T cihazım 16Hz'de time pulse üretiyor ve chrony yapılandırmasında dpoll=-4 olarak ayarlı. 16 saniyelik aralıklarla 256 örnek toplanınca kararlılık artıyor
    Masamın yanında bir BH3SAP GPSDO da var. Claude firmware'i değiştirip GPS PPS olmasa bile pulse üretmeyi sürdüren flywheel mode ekledi
    Ayrıca TSIP (Trimble protokolü) çıktısını destekleyecek şekilde güncelledi. Buna bir sonraki yazıda değineceğim
    Yorumlara da yakında cevap yazacağım; sorular her zaman memnuniyetle karşılanır
    • Güzel yazı için teşekkürler. Benim de benzer bir kurulumum var, çok faydalı oldu
      16Hz pulse'un pratikte ne kadar fark yarattığını merak ediyorum. Bir de veriyi influxdb'ye nasıl aktardığını öğrenmek isterim. Ben collectd kullanıyorum ama bilgi az
    • Proje harika. Acaba Raspberry Pi'yi bir kasaya koydun mu diye merak ettim
      Metal bir kasa bile varsa, ısıtıcı veya klimanın döngüsel sıcaklık değişimlerine karşı daha kararlı sonuçlar verebilir
  • Düşük maliyetli Pi osilatör kristalini TCXO ile değiştirirseniz frekans çok daha kararlı olur
    İlgili belge: Raspberry Pi StackExchange – oscillator değişimi
    Yalnızca bu yöntemle bile drift 4 ila 5 kat azalıyor. Başka tekniklerle birlikte kullanılırsa daha da iyi
    • O yazıyı birkaç kez okudum. Pi4 için OCXO'lu, odyofil sınıfı bir HAT da satılıyor
      Ama lehim becerime pek güvenmediğim için kendim değiştirmeye cesaret edemiyorum
    • TCXO fiyatı şaşırtıcı derecede düşük. Bazı Abracon ürünleri 2 doların altındaydı
  • Bu, SBC ölçeğinde bir OCXO. Daha büyük bir heatsink takmanın ya da osilatör çevresine ısıl kütle (thermal mass) eklemenin yardımcı olup olmayacağını merak ediyorum
    Sadece bir NTP sunucusu kurma işinden bile öğrenilecek çok şey var
    • Flirc metal kasayı tavsiye ederim. CPU kasa gövdesine temas ederek büyük bir ısıl kütle oluşturuyor
      Fansız bile mükemmel pasif soğutma sağlıyor
    • Ben de benzer düşünüyorum. CPU ve osilatörün üzerine metal blok koyup ısıl atalet artırılabilir gibi görünüyor
      Sıcaklık yavaş değişirse clock drift de daha yavaş değişir, dolayısıyla telafi etmesi kolaylaşır
      Ancak küçük bir heatsink tersine ortam sıcaklığı değişimlerine karşı daha hassas hale getirebilir
    • Pi kasasına yalıtım malzemesi eklemeyi de düşünüyorum
      Oda sıcaklığındaki ani değişimleri (pencere açılması, duştan sonra oluşan nem vb.) yumuşatabilir ve CPU'nun gereksiz yere ısı üretmesini azaltabilir
      Sonuçta amaç ısıyı sabit tutmak
    • Ama fazla ısı yayımı ters etki de yaratabilir
      Diğer çekirdekler zaten maksimum sıcaklığa yakın çalışıyor ve sıcaklığa göre saat hızını otomatik ayarlıyor
      Aşırı soğutma bu dahili sıcaklık kontrol mekanizmasını bozabilir
  • Kristale direnç ve köpük yalıtım ekleyip doğrudan ısıtmak da bir yöntem
    GPIO ile kontrol edilebilen bir transistör eklenerek PID kontrolü ile sıcaklık sabit tutulabilir
    • Bu neredeyse 100 yıldır kullanılan bir yöntem. 1950'lerdeki crystal oven tasarımları küçük bir metal kutunun içinde yaklaşık 75°C'de tutuluyordu
      Sıcaklık katsayısı (temperature coefficient) 0'a yakın olacak şekilde kesilmiş kristaller kullanıldığı için kararlıydılar
      Modern ekipmanlar da hâlâ benzer yapı kullanıyor ve tamamen kararlı hale gelmeleri yaklaşık 5 dakika sürüyor
    • Ben de geçmişte Pi'yi ambalaj köpüğü üzerine koyma deneyi yapmıştım
      Ortam sıcaklığı değişimlerini azalttı ama sonuçta onu sıcaklık kontrollü bir haznenin içine koymak en kesin çözüm
  • Sırf sıcaklığı sabit tutmak için CPU'yu zorlamak yerine, mikrodenetleyici ve hassas osilatör kullanmak daha iyi olmaz mı diye düşünüyorum
    Örneğin ethernet bağlı bir STM32 kartını NTP sunucusu olarak kullanmak daha kararlı olabilir
    • Bende de ondan var. eBay'den 70 dolara aldığım BH3SAP GPSDO, değiştirilmiş firmware ile flywheel mode destekliyor
      Pi'ye NTP sinyali verebiliyor; STM32 de mümkün ama varsayılan olarak ethernet işlevi yok
    • Genel olarak NTP zamana duyarlı bir süreç olduğu için, MCU'lar SoC'lere göre çok daha kararlı
      RTLinux'ta zamanlayıcıyı harici pin durumuna göre senkronize eden özellikler de var
      Ama işlemci sayısı arttıkça metastability sorunları ortaya çıkıyor
      Pi, FPGA (Zynq) gibi gerçek zaman garantisi sunmuyor
  • SoC sıcaklığını sabit tutmak için bilinçli olarak yük bindirme fikri aklıma gelmemişti
    Ama güç tüketimi düşük olduğu için, karmaşık bir soğutma sistemi yerine biraz enerji israfıyla çözmek mantıklı görünüyor
  • 2022'de bununla ilgili bir makale vardı: USENIX NSDI22 – Najafi
    • İlginç bir makaleydi. Sıcaklık tepki eğrisi modelleme ile CPU'yu zorlamak yerine sorunu daha zarif biçimde çözüyor
    • Ama o makale sadece sunucu içindeki sıcaklık sensörü çeşitliliğini gözlemlemek düzeyinde kalıyor
      İki PPS sinyaliyle jitter algılama yöntemi eski bir teknik ve tempco learning de onlarca yıldır var
      Asıl eksik olan, öğrenilen tempco'nun gerçekte ne kadar doğru olduğuna dair doğrulama