5 poin oleh GN⁺ 2025-12-29 | 1 komentar | Bagikan ke WhatsApp
  • 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

 
GN⁺ 2025-12-29
Komentar Hacker News
  • Saya pernah memakai MacBook Pro i9 model 2019, dan fungsi deteksi thermal throttling rasanya bisa sesederhana ini

    function isThermalThrottling() {
      return true;
    }
    

    Memang bercanda, tapi cukup mengecewakan karena saya membeli CPU i9 yang mahal, namun performanya justru lebih buruk daripada i7

    • Saya juga memakai model yang sama, dan masalahnya hanya bisa teratasi kalau mengisi daya lewat port kanan
      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
    • Saya juga pernah memakai model i9 2019, dan setelah menempelkan thermal pad pada modul VRM, rasanya seperti komputer baru sepenuhnya
      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
    • Sebenarnya saya rasa i9 sendiri memang CPU yang tidak cocok untuk laptop
      Di Dell pun begitu diganti dari i9 ke i7 hasilnya jauh lebih baik
      Pada akhirnya kami tertipu pemasaran “angka lebih besar = CPU lebih bagus”
    • Saya juga mengalami masalah yang sama, terutama saat menghubungkan dua monitor eksternal
      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
    • Laptop itu adalah komputer terburuk yang pernah saya pakai
      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?

    • Dalam kasus saya, saya mengatur fan curve sendiri dengan iStat Menus
      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
    • Saya memakai Macs Fan Control untuk menyesuaikan RPM kipas berdasarkan suhu CPU
      Dengan pengaturan default, suhunya naik sampai di atas 90 derajat, jadi saya set lebih konservatif
      Tautan GitHub
    • Aplikasi seperti ini memang sangat dibutuhkan, dan akhirnya sekarang ada
      Kadang ada proses yang liar dan menyebabkan throttling, dan sebelum saya sadar, baterainya sudah berkurang setengah
    • Pada akhirnya yang bisa dilakukan hanya menutup aplikasi atau berhenti sejenak
      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

    • Informasi yang bagus. Saya jadi penasaran apakah ada juga cara signing gratis untuk Windows
    • Oh, saya tidak tahu. Saya kira itu tergantung pengaturan pengembang, jadi sepertinya perlu saya cari tahu
  • 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

    • Saya juga memakai i9 2019, dan setelah mengganti port pengisian daya, throttling-nya hilang
      Sepertinya Anda benar
    • Saya belum sepenuhnya paham, tetapi M2 Air saya juga punya gejala mirip
      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
    • Fenomena seperti ini disebut thermal soaking
  • Sepertinya situsnya mati karena lonjakan trafik
    Repositorinya ada di angristan/MacThrottle

    • Sudah saya perbaiki. Cloudflare Workers disetel ke mode fail closed, jadi trafiknya terblokir
  • 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

    • Saya juga pernah mengalami hal yang sama saat menjalankan sesi D&D dengan M1 MacBook Air
      Karena dipakai sambil mengisi daya, suhu naik dan throttling jadi parah, tetapi masalahnya selesai kalau saya mengisi penuh sebelumnya sebelum sesi dimulai
    • Dulu saya pernah kehabisan output adaptor daya sehingga saat bermain game baterainya terkuras sampai mati
      Setelah itu saya paham kenapa pada generasi berikutnya muncul adaptor daya yang lebih besar
    • Kalau begitu, saya jadi penasaran kenapa throttling tidak bisa dinilai hanya dari suhu inti
      Bukankah suhu adalah variabel kontrol utamanya?
    • iStat Menus memang menampilkan daya charger, tetapi saya masih tetap penasaran kenapa fenomena seperti ini bisa terjadi
  • Kalau penggunaan CPU dan daya sistem ditampilkan di menu bar, tanda-tanda aneh bisa langsung terlihat
    exelban/stats

    • Saya juga pertama kali curiga ada throttling dengan cara itu
      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

    • Vapor Chamber memang bagus untuk penyebaran panas sesaat, tetapi pada akhirnya panas tetap diteruskan ke bodi aluminium
      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

    • Saya juga pernah melihat status tidak diperbarui saat memakai ProcessInfo.processInfo.thermalState
      Namun, pada metode notifikasi thermald yang saya pakai sekarang, masalah seperti itu tidak ada
  • Saya penasaran kenapa Darwin API dideklarasikan langsung dengan @_silgen_name
    Apakah itu memang tidak bisa diakses hanya dengan import Darwin?

    • Sepertinya memang API tersebut tidak diekspos hanya lewat import Darwin