5 puan yazan GN⁺ 2025-12-29 | 1 yorum | WhatsApp'ta paylaş
  • MacThrottle, Mac aşırı ısınma nedeniyle performansı sınırladığında bunu menü çubuğunda görsel olarak bildiren SwiftUI tabanlı bir uygulama - açık kaynak
  • macOS’un ProcessInfo.thermalState API’si ile powermetrics komutunu karşılaştırarak, sistemin gerçek termal durumunu doğru biçimde algılamanın yollarını inceliyor
  • Sonuç olarak, thermald’ın Darwin notifyd sistemine yayımladığı bildirimleri kullanarak root yetkisi olmadan termal durumu okuyan bir yöntem uygulanmış
  • Uygulama; sıcaklık·fan hızı grafikleri, duruma göre renkli simgeler ve macOS bildirimleri içeriyor; ayrıca oturum açıldığında otomatik çalışmayı da destekliyor
  • Apple Silicon Mac’lerin termal yönetim durumunu gerçek zamanlı izlemeyi sağlayan bir araç olarak, geliştiriciler ve power user’lar için faydalı bir tanılama aracı sunuyor

Mac’te termal throttling sorununu fark etmek

  • M2 MacBook Air’de harici 4K 120Hz ekran kullanılırken performans düşüşü ve tepki gecikmesi yaşanıyor
    • Fan olmadığı için sesle fark etmek mümkün değil, ancak CPU kullanımı %100 iken güç tüketiminin düştüğü görülüyor
  • iStat Menus ve MX Power Gadget ile CPU frekansı ve güç düşüşü doğrulanarak termal throttling teşhis ediliyor
  • Aynı durum M4 Max MacBook Pro’da da görülüyor; bunun 14 inç modelin termal tasarım sınırlarıyla ilgili olduğu belirtiliyor
  • Apple Silicon’un güç verimliliği hâlâ yüksek olsa da, termal durumu doğrudan algılamanın bir yolu aranıyor

macOS’ta termal durumu programatik olarak kontrol etmek

  • macOS, termal durumu çeşitli şekillerde açığa çıkarıyor ancak tutarlılık yetersiz
  • Apple’ın önerdiği yöntem, Foundation içindeki ProcessInfo.thermalState kullanımına dayanıyor
    • Çıktı örnekleri: nominal, fair, serious, critical
  • Root yetkisi gerektiren powermetrics -s thermal komutu da benzer bilgiyi sağlıyor,
    ancak iki yöntemin durum sınıflandırma ayrıntı düzeyi farklı
    • Örneğin fair, powermetrics tarafındaki moderate ve heavy durumlarının ikisini birden kapsıyor
  • Gerçek throttling anı powermetrics içinde heavy olarak görünürken, ProcessInfo ile bunu ayırt etmek mümkün değil

thermald ve Darwin bildirim sisteminden yararlanmak

  • powermetrics verisi thermald daemon’undan geliyor ve
    thermald, mevcut termal basınç durumunu notifyd sistem olayı olarak yayımlıyor
  • notifyutil -g com.apple.system.thermalpressurelevel komutuyla durum kontrol edilebiliyor
  • OSThermalNotification.h başlık dosyasında tanımlanan termal basınç seviyeleri:
    • nominal, moderate, heavy, trapping, sleeping
  • Swift koduyla notify_register_check ve notify_get_state çağrılarak
    root yetkisi olmadan gerçek zamanlı termal durum okuma özelliği uygulanmış

MacThrottle uygulamasını geliştirmek

  • SwiftUI ve MenuBarExtra kullanılarak yalnızca menü çubuğunda çalışan bir uygulama yapılmış
    • Termometre simgesinin rengiyle durum gösteriliyor (yeşil→kırmızı)
    • Dock simgesini kapatmak için Info.plist içindeki LSUIElement değeri true olarak ayarlanıyor

İlk yaklaşım: powermetrics root helper’ı

  • Başlangıçta root yetkisi gerektiren powermetrics kullanımını mümkün kılmak için
    LaunchDaemon ve bash script’i ile bir yardımcı süreç kurulmuş
    • /usr/local/bin/mac-throttle-thermal-monitor, her 10 saniyede bir durumu /tmp dosyasına yazıyor
    • Uygulama da bu dosyayı düzenli aralıklarla okuyup gösteriyor

İyileştirme: thermald IPC bildirimlerini kullanmak

  • Doğrudan notifyd olaylarına abone olan bir yapıya geçilmiş
    • Root yetkisi gerekmiyor, kod da sadeleşiyor

Sıcaklık ve fan hızı gösterimi

  • CPU/GPU sıcaklığı ve fan hızı grafik olarak gösteriliyor
  • Başlangıçta IOKit özel API’leri kullanıldığında sıcaklık gerçekte olduğundan daha düşük gösterilmiş (~80°C)
  • Açık kaynak Stats projesi incelenerek SMC arayüzüne geçilmiş
    • SoC nesline göre farklı anahtarların (Tp0D, Tf0E vb.) kullanılması gerekiyor
  • SMC çalışmazsa IOKit’e fallback yapılıyor

Menü çubuğu grafiğinin uygulanması

  • Grafik aynı anda 3 bilgiyi gösteriyor
    • Arka plan rengi: termal durum (yeşil~kırmızı)
    • Düz çizgi: CPU sıcaklığı
    • Kesikli çizgi: fan hızı oranı
  • Veriler 2 saniye aralıklarla toplanıyor ve 10 dakikalık geçmiş tutuluyor
  • onContinuousHover ile tooltip sağlanıyor,
    ayrıca .drawingGroup eklenerek GPU render ile 120Hz ekranda da akıcı görüntüleme sağlanıyor

macOS bildirimleri ve otomatik başlatma

  • Termal durum değiştiğinde bildirim gönderme özelliği eklenmiş
    • Belirli durum geçişlerinde veya toparlanma anında bildirim verilebiliyor
  • SMAppService API’si ile oturum açıldığında otomatik çalıştırma ayarı destekleniyor
    • register() / unregister() / status metodlarıyla kontrol ediliyor

Dağıtım ve kullanım

  • Apple Developer hesabı olmadığı için resmî notarization yapılamıyor
    • GitHub release’inden kurulumda Privacy and Security içinden elle onay vermek gerekiyor
    • Bazı Mac’lerde çalıştırmak için doğrudan Xcode ile derlemek gerekebiliyor
  • Kurulum ve build yöntemleri GitHub README’sinde açıklanmış

Sonuç

  • MacThrottle, Apple Silicon Mac’lerde termal throttling durumunu gerçek zamanlı izleyebilen hafif bir araç
  • Root yetkisi olmadan çalışıyor ve görsel geri bildirim·bildirimler·grafikler sayesinde
    geliştiricilere ve yüksek performanslı iş yükleriyle çalışan kullanıcılara sistemin termal durumunu fark etme imkânı sunuyor

1 yorum

 
GN⁺ 2025-12-29
Hacker News yorumları
  • 2019 model MacBook Pro i9 kullanıyordum; termal throttling tespit fonksiyonunu herhalde şöyle basitçe yazabilirdiniz

    function isThermalThrottling() {
      return true;
    }
    

    Şaka bir yana, pahalı bir i9 CPU alıp da i7'den daha düşük performans görmek epey hayal kırıklığı yaratmıştı

    • Ben de aynı modeli kullanıyorum; sorunu sadece sağ taraftaki porttan şarj ederek çözebilmiştim
      Nedenini bilmiyorum ama böyle yapınca throttling ortadan kalkmıştı
      Yine de macOS ve Logic tabanlı iş akışına alışık olduğum için kullanmaya devam ediyorum
      Linux'a geçebilirim ama şu an hâlâ gayet iş görür bir makine
    • Ben de 2019 i9 modelini kullanıyordum; VRM modülüne termal pad ekleyince resmen yepyeni bir bilgisayara dönüştü
      İki harici monitör ve Adobe Creative Suite kullandığım her seferinde throttling çok kötü oluyordu, bu pad bunu çözdü
      Tek dezavantajı alt kasanın ısınıp diz üstünde kullanmayı zorlaştırması ama hiç pişman değilim
      Şimdi M3 MacBook Air (24GB RAM) kullanıyorum ve çok memnunum
      Hâlâ 2019 modeli kullanan varsa VRM termal pad modunu kesinlikle düşünmesini tavsiye ederim
    • Aslında i9'un başlı başına dizüstü için uygunsuz bir CPU olduğunu düşünüyorum
      Dell'de de i9'u i7 ile değiştirince durum çok daha iyi olmuştu
      “Büyük sayı = daha iyi CPU” pazarlamasına kanmış olduk
    • Ben de aynı sorunu yaşadım, özellikle iki harici monitör bağlıyken çok kötüydü
      Sonra M1 Max'e geçince bambaşka bir dünyaya geçmiş gibi oldum
      Şimdi M3 Max'e yükselttim; Apple Silicon uzun süre dayanacak gibi görünüyor
    • O dizüstü kullandığım en kötü bilgisayar
      Açılır açılmaz fanlar dönmeye başlıyordu, Thunderbolt cihaz bağlayınca da sık sık kernel panic oluyordu
      Şu an kullandığım M1 Max MBP ise kusursuz derecede stabil
  • Proje oldukça iyi görünüyor
    Ama macOS'ta geliştirme gitgide zorlaşırken throttling'i tespit etseniz bile gerçekten ne yapabileceğiniz belirsiz
    Fan hızını ayarlayamıyorsunuz, undervolt da yapılamıyor, değil mi?

    • Ben kendi adıma iStat Menus ile fan eğrisini manuel ayarlıyordum
      Varsayılan eğri çok yavaş kaldığı için önce throttling başlıyordu
      Apple Silicon'da High Power Mode kullanınca fanlar daha hızlı dönüyor
      Şu anda özel eğri kullanmıyorum ama 14" M4 Max'te epey gürültülü
      MacBook Air'da fan olmadığı için yapabileceğiniz tek şey ısının düşmesini beklemek
    • Ben Macs Fan Control kullanarak CPU sıcaklığına göre fan RPM'ini ayarlıyorum
      Varsayılan ayarlarda sıcaklık 90 derecenin üstüne çıktığı için daha muhafazakâr bir ayar yaptım
      GitHub bağlantısı
    • Tam da böyle bir uygulamaya ihtiyaç vardı; sonunda gelmiş
      Bazen bir süreç kontrolden çıkıp throttling'e neden oluyor; siz fark edene kadar pilin yarısı gitmiş oluyor
    • Sonuçta yapabileceğiniz tek şey uygulamayı kapatmak ya da biraz ara vermek
      Özellikle arka planda çok sayıda uygulama çalışırken bu sorun sık yaşanıyor
  • Homebrew'e eklerseniz ücretsiz kod imzalama ve notarization alabilirsiniz
    O şekilde dağıtılması gerçekten güzel olurdu

    • Güzel bilgi. Acaba Windows için ücretsiz imzalama yöntemi de var mı merak ettim
    • Aa, bunu bilmiyordum. Geliştirici ayarlarına göre değişiyor sanıyordum; araştırmam gerekecek
  • Benim hipotezim sorunun CPU değil, ısıyı doyuma ulaştıran USB denetleyicisi olduğu yönünde
    CPU/GPU değil, gövdenin kendisi aşırı ısınıyor; ısı atımı tıkanınca sonunda throttling ortaya çıkıyor gibi görünüyor
    Farklı adaptörler veya monitörlerle denemek gerekir

    • Ben de 2019 i9 kullanıyorum; şarj portunu değiştirince throttling kayboldu
      Sanırım dediğinde haklısın
    • Tam olarak çözdüğümü söyleyemem ama benim M2 Air'da da benzer belirtiler var
      4K 144Hz monitöre bağlayıp Zoom ya da birden fazla video akışı açınca ciddi şekilde ısınıyor
      Bunun USB denetleyicisinden çok doğrudan yüksek yükten kaynaklandığını düşünüyorum
    • Bu olaya thermal soaking deniyor
  • Site trafik patlaması yüzünden çökmüş gibi görünüyor
    Depo: angristan/MacThrottle

    • Düzelttim. Cloudflare Workers fail closed moduna ayarlı olduğu için trafiği engelliyormuş
  • iStat Menus'ta CPU %100 görünürken güç tüketimi düşükse throttling var diye düşünebilirsiniz,
    ama düşük güçlü bir USB-C şarj cihazına bağlıyken de aynı durum yaşanabiliyor
    Şarj cihazı gücünü algılayan bir özellik eklemek iyi olabilir

    • Ben de M1 MacBook Air ile bir D&D oturumu sırasında aynı sorunu yaşadım
      Şarj olurken daha çok ısındığı için throttling kötüleşiyordu; oturumdan önce şarj edince sorun çözüldü
    • Eskiden güç adaptörü çıkışı yetersiz olduğu için oyun oynarken pilin tükenip cihazın kapandığı olmuştu
      Sonraki nesillerde neden daha büyük güç adaptörleri çıktığını o zaman anlamıştım
    • O halde neden yalnızca çekirdek sıcaklığıyla throttling tespit edilemediğini merak ediyorum
      Sonuçta sıcaklık doğrudan kontrol değişkeni değil mi?
    • iStat Menus şarj cihazı gücünü gösteriyor ama bunun neden yaşandığı hâlâ net değil
  • CPU kullanımı ve sistem güç tüketimini menü çubuğunda göstermek anormallikleri hemen fark etmeyi sağlıyor
    exelban/stats

    • Ben de throttling'den ilk kez böyle şüphelenmiştim
      CPU kullanımı yüksekken güç tüketiminin düştüğünü görünce durumu anladım
  • Bir sonraki MacBook Air M5'te Vapor Chamber soğutma olmasını isterdim
    Şu anda Apple sanki ısı dağıtımından çok gürültüyü en aza indirmeye öncelik veriyor
    Bu yüzden minimum fan hızını zorla yükseltiyorum

    • Vapor Chamber ani ısı dağılımı için iyi olabilir ama sonuçta ısı alüminyum gövdeye aktarılıyor
      Gövde ortamla termal dengeye ulaştığında yayabileceği ısı miktarı sınırına dayanıyor
      Fan varsa bakır plaka ve hava akımıyla bu zaten yeterince çözülebilir
      Sonuçta mesele enerjinin korunumu
  • Sanırım thermal pressure bildirimi ile ilgili bir bug var
    Uygulamada böyle bir sorun yaşayıp yaşamadığınızı merak ediyorum
    İlgili issue

    • Ben de ProcessInfo.processInfo.thermalState kullanırken durumun güncellenmediğini görmüştüm
      Ama şu an kullandığım thermald bildirim yönteminde böyle bir sorun yok
  • @_silgen_name ile neden Darwin API'sini doğrudan tanımladığınızı merak ediyorum
    import Darwin ile erişilemiyor mu?

    • Gerçekten de yalnızca import Darwin ile bu API'nin açığa çıkmadığı görülüyor gibi