MacBook Pro with shot battery, possible to prevent CPU throttling?

I have a late-2013 MacBook Pro 15" which still has the original battery. It's at 1,144 charging cycles, and a few days ago the battery health was at about 50%, though since then it plunged to 4%.

The output of pmset -g batt:

Now drawing from 'AC Power'
 -InternalBattery-0 (id=xxxxxxx)    100%; charged; 0:00 remaining (Poor/Good)
    failure: "Permanent Battery Failure" present: true

(Just yesterday, the output was the same except for failure: "Fuse Blown".)

The output from System Information:

Battery Information:

  Model Information:
  Serial Number:    [redacted]
  Manufacturer: SMP
  Device Name:  bq20z451
  Pack Lot Code:    0
  PCB Lot Code: 0
  Firmware Version: 702
  Hardware Revision:    1
  Cell Revision:    1206
  Charge Information:
  Charge Remaining (mAh):   308
  Fully Charged:    Yes
  Charging: No
  Full Charge Capacity (mAh):   319
  Health Information:
  Cycle Count:  1144
  Condition:    Replace Now
  Battery Installed:    Yes
  Amperage (mA):    0
  Voltage (mV): 11090

The battery/power icon on the menu bar also indicates Condition: Replace Now.

According to a series of other posts (1, 2, 3, 4, 5), when the battery is detected as dead or removed, the CPU is throttled to its slowest possible speed. This is what happened to me two days ago: after a restart (due to taking out the power adapter a few seconds before closing the lid), the computer was running very very slowly and iStat Menus was always showing a CPU clock speed of 800 MHz.

Now, I understand the battery is shot and needs replacing, and I have ordered a new one, but it won't arrive overnight. I need to keep using the laptop in the meanwhile as it is the only computer I have. It's really painful to work with the CPU permanently throttled to 800 MHz, and I'm looking for a temporary fix.

As I understood from other answers, this might be impossible, but funnily enough, I was fiddling around with this yesterday, and at some point, the computer suddenly felt snappy again (this happened at about the same time I was using pmset to change hibernatemode from 3 to 25, but it's probably not related). Checking iStat Menus, the CPU was no longer being throttled. This is exactly what I needed to hold out for the period until the battery arrives.

Unfortunately, this morning the laptop rebooted again. This is despite the fact that I closed the lid on the computer, waited until the fans stopped, and only then took out the power adapter, but still, when I connected the power adapter again and opened the lid, it had rebooted. Now the CPU is stuck at 800 MHz again and the computer is again unusable.

My question is: since it came out of throttling once (although I'm not sure what happened, or what I did, that was responsible), is there anything I can do to make it come out of throttling again?


Solution 1:

Please note that this can damage your device.. you've been warned. Continue at your own risk

In short, IOPlatformPlugin is power management, CPU scaling, idle frequency (and others). How much the following helps is arguable.

  1. Disable SIP in recovery (CMD+R on boot), open terminal (CMD+3 i think), csrutil disable
  2. Reboot into MacOS, move /System/Library/Extensions/IOPlatformPlugin.kext to / or somewhere else sudo mv /System/Library/Extensions/IOPlatformPlugin.kext / (terminal)
  3. Rebuild cache sudo kextcache -i /, reboot
  4. Re-enable SIP in recovery csrutil enable

Solution 2:

Possible Solution 1: The proposed solution by Henry Gross-Hellsen is the most common one. It didn't work for me, but there are quite a few people responding that it worked for them.

I removed the entire IOPlatformPlugin.kext, but still CPU is reported as 0.80Ghz (800Mhz). Confirmed the kext removed, and on rebuild of kext sudo kextcache -i / it complained it was missing.

My only reasoning for this is it matters what device you're trying this on. The people who report it has worked for them either are on MacBook Air or MacBook~ that are much older than mine (mine is 2015). Or they don't mention what their device is at all, so hard to say it'll work on "newer" macs.

Relevant link: https://eclecticlight.co/2019/02/25/playing-with-fire-dealing-with-slow-hot-macs/ That hasn't been posted much. But it explains that most of the kext being removed are for 2013 and older machines. Which could explain why it didn't make a difference for me on my 2015 MacBook Pro.

Possible Solution 2: What does work for me, and you touched upon it, if I let my Mac go into default Energy Saver settings naturally, I get speeds back again. This is 100% reproducible for me.

The only issue I have is I can't mimic this through pmset. I still have the kext removed from 'Solution 1' above, not sure if it has a impact on why this works.

I won't investigate this further into getting the right pmset settings to trigger this manually and then having startup script because like all the people who have this question, we quickly get a replacement and move on. But I hope this information is useful for others who need a quick fix without feeling too much urgency in getting a new battery / computer.

=======================

Another interesting find is https://volta.garymathews.com/ which is a app (probably loads a kext) that is doing the opposite of what we're trying to accomplish (undervolting or underclocking the CPU to save power). But it's interesting since if this is possible, then preventing it should also be possible.

On the website it reads:

Only compatible with Haswell and Broadwell processors (Macbooks from 2013 - 2015). This functionality has been prevented on later generations.

Have not tried it as we aren't trying to save power, but use more than 800Mhz.