- MacThrottle adalah aplikasi berbasis SwiftUI yang memberi tahu secara visual di bilah menu ketika Mac membatasi performa akibat panas berlebih - open source
- Membandingkan API
ProcessInfo.thermalState di macOS dengan perintah powermetrics untuk menelusuri cara mendeteksi kondisi termal sistem yang sebenarnya secara akurat
- Pada akhirnya diimplementasikan metode yang memanfaatkan notifikasi yang dipublikasikan
thermald ke sistem notifyd milik Darwin untuk membaca status termal tanpa hak akses root
- Aplikasi ini mencakup grafik suhu dan kecepatan kipas, ikon berwarna berdasarkan status, serta fitur notifikasi macOS, dan juga mendukung berjalan otomatis saat login
- Sebagai alat untuk memantau status manajemen termal Apple Silicon Mac secara real-time, ini menyediakan sarana diagnosis yang berguna bagi developer dan power user
Mengenali masalah thermal throttling pada Mac
- Saat menggunakan layar eksternal 4K 120Hz pada M2 MacBook Air, terjadi penurunan performa dan jeda respons
- Karena tidak ada kipas, kebisingan tidak bisa dijadikan indikator, tetapi konsumsi daya menurun saat penggunaan CPU berada di 100%
- Thermal throttling didiagnosis dengan mengonfirmasi penurunan frekuensi CPU dan daya melalui iStat Menus dan MX Power Gadget
- Fenomena yang sama juga terjadi pada M4 Max MacBook Pro, dan disebut terkait batas desain termal pada model 14 inci
- Efisiensi daya Apple Silicon tetap tinggi, tetapi penulis ingin menemukan cara untuk mendeteksi kondisi termal secara langsung
Memeriksa kondisi termal secara terprogram di macOS
- macOS mengekspos kondisi termal dengan beberapa cara, tetapi kurang konsisten
- Cara yang direkomendasikan Apple adalah menggunakan
ProcessInfo.thermalState dari Foundation
- Contoh output:
nominal, fair, serious, critical
- Perintah
powermetrics -s thermal yang memerlukan hak akses root juga memberikan informasi yang sama,
tetapi tingkat klasifikasi statusnya berbeda antara kedua cara tersebut
- Contoh:
fair mencakup dua status di powermetrics, yaitu moderate dan heavy
- Pada saat throttling benar-benar terjadi,
powermetrics menampilkannya sebagai heavy, tetapi di ProcessInfo tidak bisa dibedakan
Memanfaatkan thermald dan sistem notifikasi Darwin
- Data
powermetrics berasal dari daemon thermald,
dan thermald memublikasikan status tekanan termal saat ini sebagai event sistem notifyd
- Status dapat diperiksa dengan perintah
notifyutil -g com.apple.system.thermalpressurelevel
- Tingkat tekanan termal yang didefinisikan di header
OSThermalNotification.h:
nominal, moderate, heavy, trapping, sleeping
- Dengan memanggil
notify_register_check dan notify_get_state dari kode Swift,
diimplementasikan fitur pembacaan kondisi termal real-time tanpa hak akses root
Pengembangan aplikasi MacThrottle
- Membuat aplikasi khusus bilah menu dengan SwiftUI dan MenuBarExtra
- Status ditampilkan lewat warna ikon termometer (hijau→merah)
- Ikon Dock dinonaktifkan dengan mengatur
LSUIElement di Info.plist ke true
Pendekatan awal: helper root powermetrics
- Pada awalnya, untuk menggunakan
powermetrics yang memerlukan hak akses root,
disusun proses helper dengan LaunchDaemon dan skrip bash
/usr/local/bin/mac-throttle-thermal-monitor menulis status ke file /tmp setiap 10 detik
- Aplikasi lalu membacanya secara berkala untuk ditampilkan
Peningkatan: menggunakan notifikasi IPC thermald
- Beralih ke cara berlangganan event
notifyd secara langsung
- Tidak memerlukan hak akses root, dan kode menjadi lebih sederhana
Menampilkan suhu dan kecepatan kipas
- Menampilkan suhu CPU/GPU dan kecepatan kipas dalam bentuk grafik
- Pada awalnya, saat memakai API privat IOKit, suhu tampil lebih rendah dari kondisi sebenarnya (~80°C)
- Dengan merujuk pada proyek open source Stats, implementasi dialihkan ke antarmuka SMC
- Perlu memakai key yang berbeda untuk tiap generasi SoC (
Tp0D, Tf0E, dll.)
- Jika SMC tidak berfungsi, sistem melakukan fallback ke IOKit
Implementasi grafik di bilah menu
- Grafik menampilkan 3 jenis informasi secara bersamaan
- Warna latar: kondisi termal (hijau~merah)
- Garis penuh: suhu CPU
- Garis putus-putus: rasio kecepatan kipas
- Data dikumpulkan tiap 2 detik, dengan riwayat selama 10 menit
- Tooltip disediakan lewat
onContinuousHover,
dan dengan menambahkan .drawingGroup, grafik dirender via GPU agar tetap mulus bahkan di layar 120Hz
Notifikasi macOS dan auto-run
- Ditambahkan fitur pengiriman notifikasi saat kondisi termal berubah
- Notifikasi dapat dikirim pada transisi status tertentu atau saat pemulihan
- Mendukung pengaturan berjalan otomatis saat login lewat API
SMAppService
- Dikendalikan dengan metode
register() / unregister() / status
Distribusi dan penggunaan
- Karena tidak memiliki akun Apple Developer, notarization resmi tidak dimungkinkan
- Saat instalasi dari rilis GitHub, diperlukan persetujuan manual di
Privacy and Security
- Pada sebagian Mac, aplikasi hanya bisa dijalankan jika dibangun langsung dengan Xcode
- Cara instalasi dan build dijelaskan di README GitHub
Kesimpulan
- MacThrottle adalah alat ringan untuk memantau status thermal throttling Apple Silicon Mac secara real-time
- Berjalan tanpa hak akses root, dan melalui umpan balik visual, notifikasi, serta fitur grafik,
alat ini memberi visibilitas terhadap kondisi termal sistem bagi developer dan pengguna dengan beban kerja tinggi
1 komentar
Komentar Hacker News
Saya pernah memakai MacBook Pro i9 model 2019, dan fungsi deteksi thermal throttling rasanya bisa sesederhana ini
Memang bercanda, tapi cukup mengecewakan karena saya membeli CPU i9 yang mahal, namun performanya justru lebih buruk daripada i7
Saya tidak tahu alasannya, tetapi setelah begitu throttling-nya hilang
Meski begitu, saya tetap memakainya karena sudah terbiasa dengan workflow berbasis macOS dan Logic
Saya mungkin bisa pindah ke Linux, tetapi untuk saat ini mesin ini masih lumayan layak dipakai
Setiap kali saya memakai dua monitor eksternal dan Adobe Creative Suite, throttling-nya parah sekali, dan pad ini menyelesaikannya
Kekurangannya, bagian bawahnya jadi panas sehingga sulit dipakai di pangkuan, tetapi saya sama sekali tidak menyesal
Sekarang saya sudah pindah ke M3 MacBook Air (24GB RAM) dan sangat puas
Kalau masih ada yang memakai model 2019, saya sangat merekomendasikan mempertimbangkan modifikasi thermal pad VRM
Di Dell pun begitu diganti dari i9 ke i7 hasilnya jauh lebih baik
Pada akhirnya kami tertipu pemasaran “angka lebih besar = CPU lebih bagus”
Setelah pindah ke M1 Max, rasanya seperti dunia yang benar-benar berbeda
Sekarang saya sudah upgrade ke M3 Max, dan Apple Silicon sepertinya akan awet untuk waktu lama
Kipas langsung berputar begitu boot, dan saat perangkat Thunderbolt disambungkan juga sering terjadi kernel panic
M1 Max MBP yang saya pakai sekarang benar-benar stabil
Proyeknya terlihat cukup bagus
Hanya saja, pengembangan di macOS makin sulit, dan walaupun throttling bisa terdeteksi, saya masih ragu apa yang sebenarnya bisa dilakukan
Bukankah kita juga tidak bisa mengatur kecepatan kipas atau melakukan undervolting?
Fan curve bawaannya terlalu lambat sehingga throttling terjadi lebih dulu
Di Apple Silicon, jika memakai High Power Mode, kipas akan berputar lebih cepat
Sekarang saya sudah tidak memakai curve kustom, tetapi di 14" M4 Max suaranya cukup berisik
Karena MacBook Air tidak punya kipas, yang bisa dilakukan ya hanya mendinginkannya
Dengan pengaturan default, suhunya naik sampai di atas 90 derajat, jadi saya set lebih konservatif
Tautan GitHub
Kadang ada proses yang liar dan menyebabkan throttling, dan sebelum saya sadar, baterainya sudah berkurang setengah
Masalah seperti ini sering terjadi saat banyak aplikasi berjalan di latar belakang
Jika dimasukkan ke Homebrew, Anda bisa mendapat code signing dan notarization gratis
Akan sangat bagus kalau didistribusikan seperti itu
Hipotesis saya, masalahnya bukan CPU melainkan kontroler USB yang membuat panas menjadi jenuh
Sepertinya bukan CPU/GPU yang terlalu panas, melainkan bodinya kepanasan sehingga pembuangan panas terhambat dan akhirnya terjadi throttling
Perlu dicoba eksperimen dengan adaptor atau monitor lain
Sepertinya Anda benar
Saat tersambung ke monitor 4K 144Hz lalu menjalankan Zoom atau beberapa stream video, panasnya jadi tinggi
Rasanya bukan karena kontroler USB, melainkan sekadar karena bebannya besar
Sepertinya situsnya mati karena lonjakan trafik
Repositorinya ada di angristan/MacThrottle
Di iStat Menus, kalau CPU 100% tetapi penggunaan daya rendah, itu bisa dianggap throttling,
tetapi gejala yang sama juga bisa terjadi saat terhubung ke charger USB-C berdaya rendah
Akan bagus jika ditambahkan fitur untuk mendeteksi daya charger
Karena dipakai sambil mengisi daya, suhu naik dan throttling jadi parah, tetapi masalahnya selesai kalau saya mengisi penuh sebelumnya sebelum sesi dimulai
Setelah itu saya paham kenapa pada generasi berikutnya muncul adaptor daya yang lebih besar
Bukankah suhu adalah variabel kontrol utamanya?
Kalau penggunaan CPU dan daya sistem ditampilkan di menu bar, tanda-tanda aneh bisa langsung terlihat
exelban/stats
Saya menyadarinya saat melihat penggunaan CPU tinggi tetapi dayanya justru turun
Saya berharap MacBook Air M5 berikutnya memakai pendingin Vapor Chamber
Saat ini sepertinya Apple lebih memprioritaskan kebisingan minimum daripada pembuangan panas
Karena itu saya memaksa menaikkan kecepatan minimum kipas
Begitu bodi mencapai kesetimbangan termal dengan lingkungan, kapasitas pembuangannya akan mentok
Kalau ada kipas, pelat tembaga dan aliran udara sebenarnya sudah cukup untuk mengatasinya
Pada akhirnya ini soal kekekalan energi
Sepertinya ada bug notifikasi thermal pressure
Saya penasaran apakah aplikasi ini juga mengalami masalah seperti itu
Isu terkait
ProcessInfo.processInfo.thermalStateNamun, pada metode notifikasi thermald yang saya pakai sekarang, masalah seperti itu tidak ada
Saya penasaran kenapa Darwin API dideklarasikan langsung dengan
@_silgen_nameApakah itu memang tidak bisa diakses hanya dengan
import Darwin?import Darwin