- 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
Hacker News yorumları
2019 model MacBook Pro i9 kullanıyordum; termal throttling tespit fonksiyonunu herhalde şöyle basitçe yazabilirdiniz
Ş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ı
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
İ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
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
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
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?
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
Varsayılan ayarlarda sıcaklık 90 derecenin üstüne çıktığı için daha muhafazakâr bir ayar yaptım
GitHub bağlantısı
Bazen bir süreç kontrolden çıkıp throttling'e neden oluyor; siz fark edene kadar pilin yarısı gitmiş oluyor
Ö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
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
Sanırım dediğinde haklısın
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
Site trafik patlaması yüzünden çökmüş gibi görünüyor
Depo: angristan/MacThrottle
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
Şarj olurken daha çok ısındığı için throttling kötüleşiyordu; oturumdan önce şarj edince sorun çözüldü
Sonraki nesillerde neden daha büyük güç adaptörleri çıktığını o zaman anlamıştım
Sonuçta sıcaklık doğrudan kontrol değişkeni değil mi?
CPU kullanımı ve sistem güç tüketimini menü çubuğunda göstermek anormallikleri hemen fark etmeyi sağlıyor
exelban/stats
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
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
ProcessInfo.processInfo.thermalStatekullanırken durumun güncellenmediğini görmüştümAma şu an kullandığım thermald bildirim yönteminde böyle bir sorun yok
@_silgen_nameile neden Darwin API'sini doğrudan tanımladığınızı merak ediyorumimport Darwinile erişilemiyor mu?import Darwinile bu API'nin açığa çıkmadığı görülüyor gibi