April 29, 2020 - (Updated June 2, 2020)
For the past three years, I have been using an iMac 5K (Late 2015, full specs below) as my primary workstation for everything I do, from video editing and content production to late-night gaming. It’s a wonderful machine, but I’ve sometimes been frustrated by the performance limitations of the hardware, despite the decent (for 2015 standards, anyways) core spec list¹:
After extensive testing, I can conclude that the cooling Apple puts in these machines would be adequate for getting almost-full performance out of their parts, but one small software-enforced limitation prevents them from doing so. The purpose of this article is to walk you through my findings specifically of the iMac 5K’s cooling properties, then a solution that should work to alleviate thermal throttling better than any other article I’ve found on the internet (probably also on other Mac models, albeit to a lower extent).
The problem stems from the heatsink design, which we can see from iFixit’s various repair guides and photos of the bare part, is shared between the CPU and the GPU, with a single heat pipe going to each chip.
Not shown in this photo is the 12V blower fan, which pulls air through the heatsink and exhausts it through a laughably small vent at the back of the computer. Intake is done through a series of thin grilles on the bottom edge of the computer, which is also where the speakers fire out of (straight into your desk instead of at your face 😐).
The Intel Core i7-6700K CPU in this computer has a TDP of 91W. The AMD M395X has a self-reported TDP of 125W according to data collected by Passmark (neither Apple nor AMD release the specs for this part). Neither of these parts ever reaches those power draw numbers in this computer, for any period of time. That appears to be a result of both firmware tweaking on Apple’s part to limit power consumption, and throttling because of the weak thermal design.
In a pure CPU load, the CPU reaches nearly 100º fast, drawing up to around 80W at peak, then settling in at around 50W, with the system fan relaxedly spinning up to 2850 RPM afterwards and staying there. In the opposite situation, where the CPU is idle and the GPU is taxed, the GPU will initially draw ~90W before dropping to ~60W sustained, with a die temperature of up to 108ºC. Pretty toasty! In a full GPU load scenario, the system fan will hover around 2300 RPM in macOS, and variably ramp up to 2850 RPM in Windows (Windows generally seems to ramp up/down the fan much more aggressively than macOS). All monitoring was done at room temperature with HWMonitor, smcFanControl in macOS, and Macs Fan Control in Windows.
Those GPU numbers in particular are interesting, possibly most of all because the system fan often refuses to reach its maximum speed under a solely GPU load, despite the GPU hitting >105ºC and throttling hard as we’ll see in a moment.
The power consumption lowering over time suggests the system is throttling, for thermal or power reasons.On the CPU, I’ve seen core clock speeds throttle as low as 3.4GHz according to Intel Power Gadget. That’s about a 15% degredation in performance! This isn’t too weird for a Mac though, plenty of MacBooks especially throttle more than that, and it doesn’t affect system responsiveness.
The GPU is where things really start to get funky. As I mentioned before, the GPU hits up to 108ºC under load and then seemingly quickly throttles. But by how much does this affect performance? Unlike the CPU, according to my own testing in a variety of games, workloads and benchmarks, the answer is significantly. Under macOS it’s hard to get a clear picture of what’s going on, since there’s no way to view detailed GPU stats like clock speeds, and performance degrades so quickly that it’s hard to get a baseline reading without throttling. I tend to notice games starting out great but beginning to stutter significantly within seconds, then if the game is graphically intense enough, frame counts will settle in at around ~30% below peak on average after a few minutes. It effectively makes a lot of games (newer and not-so-new) unplayable, especially considering the M395X is no great performer to begin with. This is what initially sent me on this journey of idly analyzing the thermal behaviours of the iMac.
Testing in Windows makes everything much clearer, since we can monitor GPU stats like frame rate, clock and memory speeds, and temperature with something like MSI Afterburner, which is what I used here. Before we get into the numbers though, there’s the issue of drivers to clear up. Apple releases their own drivers for use with Windows for their computers, but support for said drivers is often lacking. In particular, the Apple-validated versions of AMD’s drivers for the GPU are outdated and don’t run properly on the latest versions of Windows 10. Some of my preliminary results were obtained on older versions of Windows 10 with the official Apple drivers, but all the hard numbers seen below used unofficial patched drivers from BootCampDrivers.com. These drivers modify the installer of AMD’s most recent official driver releases so that they will recognize and install for the custom GPUs in Apple’s computers. I highly recommend using them if you’re attempting to run Windows on your AMD GPU-powered Mac system. My results pertaining to the thermal throttling behaviours of the M395X were consistent across different driver versions, official and un-official. With that out of the way, onto the numbers!
The M395X has a core base clock of 909MHz, and no boost clock like on more recent GPUs. Using MSI Afterburner, we can monitor the core clock speed and more while games are running. Depending on the workload, the GPU clock speed will decrease as the temperature increases, and throttle down to around the low-400’s of MHz! In many games, I saw clock speeds occasionally dip into the mid-300’s! That’s insane! That would suggest that performance will be roughly halved in normal gaming workloads! Or in other words, it is being halved, and so there’s room for it to be twice as good as it is now. 😉
So we’ve discovered that the GPU in the iMac 5K frequently throttles during normal gaming use, occasionally as low as to roughly a third of its nominal clock speed. We also know that in these GPU-only workloads, the system fan hardly spins up! So it seems like the obvious solution would be to increase the system fan speed manually! We can do this with a piece of excellent open-source freeware called smcFanControl, which unfortunately seems to have been abandoned since its last release in mid-2018, but luckily it still works on current versions of macOS. The app comes with a GUI that lets you set the minimum fan speed enforced by the System Management Controller, or SMC, and create custom profiles that can even automatically activate when the system’s charging state changes (in the case of portables only, of course).
Using that, we can force the iMac to run its fan at its maximum speed of 2850 RPM all the time, and observe the resulting performance gains.
This improves things considerably! In the Unigine Valley benchmark running under macOS 10.15.3, we see an improvement of around 18% by pegging the fan speed at max this way.
Still though, even when we do this, gaming performance is not what it should be, with frame rates still stuttering significantly as the GPU desperately tries to maintain a steady temperature. We can see sustained power usage on the GPU go up a bit with the increase in performance, but it’s obvious the GPU is still being choked for cooling.
Last summer, we had a heat wave come through Vancouver, and without air conditioning, temperatures in my house soared to the high 20’s most days. During this, I was editing what would eventually be a 60-second action short film called Magic Punch, playing some games, and generally enjoying my summer with a very hot-running iMac. It was during this period of extreme indoor temperatures that I noticed my iMac doing something odd: exceeding its so-called “maximum" fan speed under load. For nearly three years I had used this iMac and never had I seen the fan speed go higher than 2850 RPM, which indeed, smcFanControl confirms is the usual maximum fan speed the SMC will go up to. But watching the fan speed while rendering and transcoding large 4K files on the hottest days of the summer, I saw the speed go as high as the mid-3150’s of RPM. It seemed that the computer monitored ambient temperatures and would temporarily raise the maximum fan speed in hot climates. This gave me an idea: if the “maximum” fan speed could be violated for short bursts, who’s to say it couldn’t be violated permanently? And how far does the fan speed really go?
I knew it was possible to manually set a Mac’s fan speed higher than the maximum, as I had tentatively tried it on my 13-inch MacBook Pro Late 2013 back when that was my primary computer. Using smcFanControl’s command line interface, it’s possible to modify the SMC’s memory to manipulate the behaviour of the system fan(s) directly. This setting will remain in effect until a complete system shutdown.
Some googling for experiences of people who had tried this previously yielded only forum posts from newbies asking “what if you did this?” and frequenters replying something to the effect of “don’t, your computer will light on fire and kill everyone you love.” So. The traditional wisdom would say this is a bad idea. Take everything from here on out as an educational experiment and not advice.
Slowly, tentatively, I nudged the speed up. After some time running the fan at 3300RPM, then 3500RPM, I saw no ill effect, and in fact did see modest improvements to performance.
At some point, I figured that the fan is probably rated at 12V (now I know that this hunch was correct) and that the rail supplying it is probably also 12V, so really the most I could do by pushing the fan speed up was run the fan at its rated voltage. This would mean that the danger of running the fan so high it quickly burns out wouldn't really exist — assuming I was right. Emboldened by this educated assumption, I decided to throw caution to the wind and see how fast the fan in this thing really goes.
The limit, as it turns out, is around 4470 RPM. It won’t go faster than that speed even if I set a higher value, which presumably means if I set 4470 RPM as the target speed, the fan should be running at its rated full 12V. Why Apple didn’t set this as the default maximum fan speed, I have only one guess: the first thing that you notice immediately at this speed is the noise! And I thought MacBooks got loud! I don’t blame them for not wanting their normally extremely quiet computers to get this loud during normal use. It actually moves a decent amount of air out of the 3-inch wide grille just below the stand mount, but gaming with passive headphones is probably a no-go with this. Anyways, now let’s see about performance...
(“Darwin" means macOS in this case. Some screenshots below also refer to my Windows 10 installation as “Windows 8,” not sure why.)
Now that’s more like it! What you’re looking at here is a whopping 45% increase in performance! And before you ask, yes, this is consistent across both macOS and Windows. Restarting the computer doesn’t clear the SMC, so we can set the fan speed in macOS and then reboot into Windows for possible performance gains there as well. Have a look at these Windows 10 results using the April 2020 BootCampDrivers.com release (the latest as of writing):
The numbers speak for themselves. You can see in the screenshots that when the fan was run close to its actual max fan speed of ~4470 RPM, GPU clocks were close to twice as high (the top run varied between ~410 and ~550 MHz, while the bottom varied from ~822 to ~909 MHz), actually hitting the max clock of the GPU! What’s actually most important here are the minimum FPS numbers, which rose by just a hair over 80%. In games, this means a much smoother-feeling gaming experience. Titles like The Witcher 3 which are unplayable at 1080p with the stock fan curve suddenly become perfectly reasonable, even with texture quality turned up to high thanks to the M395X’s actually-decent 4GB of VRAM.
CPU also improves by a hair, but far less than GPU. Cinebench R20 in macOS sees the CPU score climb to ~2070 points, up from ~1950 points. Hardly worth mentioning when put next to the GPU numbers.
Here are some performance metrics in real games, running under Windows 10³:
Here we see that average frame rates in a bunch of games released between 2010 and 2015 go from various degrees of unplayable to fully playable with the forced fan speed. On average, frame rates increased 110%! The Witcher 3 increased by a whopping 136%! Now a look at performance under macOS:
Here we can see that games don’t seem to benefit as much from the higher fan speed under macOS. Whether this disparity is down to less aggressive throttling to begin with on macOS, or some other platform difference, is unclear. Still, here we’re seeing average frames per second increases of 38%.
For fun, let’s also look at export times of a complex edit of one of my short films, Film Police, utilizing Prores footage in Premiere Pro under macOS:
Not quite the drastic improvement we saw in games, but still significant at around a 15% improvement. This is to be expected given Premiere’s heavy reliance on CPU performance instead of GPU compute. Again, the increased noise doesn’t make pegging the fans this high all that appealing in real world use, but it could be handy for long renders.
So you’re ready to give this a try on your own - great! The best way to start is to download and open smcFanControl. You only need to open it once to generate the preferences file we’re going to be editing in the next step.
Quit smcFanControl from the menu bar. Download and open Prefs Editor by Thomas Tempelmann, then search for and open the “com.eidac.smcFanControl2” preferences file. Find the value “Maxspeed” for each of the fans you want to boost, and increase it by, say, fifty percent. The actual number doesn’t matter much here, we’re just trying to find the actual maximum speed of the fan by setting the target speed higher than the fan is capable of, then seeing how fast it actually goes. There’s no danger here, since the computer will not feed the fan a voltage higher than it’s rated for.
Re-open smcFanControl, then go to preferences. Whack the fan speed slider all the way to the right, to your new “Maxspeed" value. Click save and watch the menu bar stats for the fan’s current fan speed. If it settles in below the “Maxspeed" value you set, that’s the actual maximum speed of the fan; feel free to edit “Maxspeed” again to reflect this newfound actual maximum speed. If the fan hits your “Maxspeed” value just fine, you’ve probably still got some headroom left, so open up Prefs Editor and increase the value again, then quit and relaunch smcFanControl and repeat. Once you’ve found the actual maximum fan speed and gotten smcFanControl to let you use it, you’re set!
You can also use the smcFanControl command line interface to manually force a target speed if this GUI method doesn’t work for you. The same set-and-check process for determining the maximum fan speed applies.
Any fan speed you select in smcFanControl will persist across reboots, but not through a complete system shutdown. If you want to use your new maxiumum fan speed in a Boot Camp Windows installation, simply set your fan speed in macOS and reboot into Windows.
As I mentioned at the top, these guidelines should apply to most modern Macs. smcFanControl should work just fine on every Mac model (except possibly the newer models with the T2 security chip, since it changes how the SMC reports the fan values and might break certain functionality — check the smcFanControl issues page for discussion on using it with the T2). Note that Macs Fan Control doesn’t play nice with either of these methods; particularly if you’re using the command line method above, it will overwrite your custom fan speed as soon as you open the app. If you set your custom fan speed via the command line, want to use it in Windows, and have Macs Fan Control installed, make sure it is not set to run at boot.
I’ve been running the fan in my iMac 5K at up to its actual maximum ~4470 RPM, whenever I’m playing games or have a long render I need to finish quickly, for the past 6 months or so. It really does make a night and day difference to GPU performance, especially when gaming in Windows. In that time, no explosions have befallen my trusty workstation, nor burned out fans or any other ill effect. It’s admittedly anecdotal evidence, so I wouldn’t recommend trying what I’ve done here on your own computer unless you’re willing to accept the small risk of hardware damage.
I hope this will help someone take full advantage of the hardware in their shiny aluminium box of heat. If it helped you, feel free to give me a shout @ben_macphail.
Update 2020-05-20: A previous version of this article suggested modifying smcFanControl from source code to override the fan speed limit. It has been replaced by the how-to section above — thanks to “ole” on the BootCampForums.com forum for the tip on modifying smcFanControl’s preferences! The maximum fan speed for the iMac 5K was also misreported — in reality it varies between 4350 and 4480 RPM in my experience. I regret the error and have updated the article.
Update 2020-06-02: Added mention of the CLI version of smcFanControl to the how-to section, and clarified Macs Fan Control’s behaviour with the above methods.
¹ This was the top-spec config for this model at the time, except for RAM and storage. I quickly doubled the RAM myself and have a bunch of USB hard drives and SSDs for storage expansion.
² Apple’s website at the time claimed that this processor when put into this computer would be able to utilize Intel Turbo Boost to go up to 4.2GHz, but I have never seen the actual clock speeds of the cores go past the base 4.0GHz. Considering this behaviour is consistent across both macOS and Windows, I suspect Turbo Boost was disabled in firmware for reasons unknown (power? thermals?). This would mean that Apple was falsely advertising clock speeds they themselves made sure the system would never be able to hit. Oof.
³ The numbers for the Witcher 3 here are kinda fudgy since the game would crash whenever I started recording performance metrics with MSI Afterburner. Instead I stared at the FPS graph and took a guess. The frame rate was actually the most stable out of all the games here, so I’m confident these numbers are accurate plus-or-minus a couple frames per second. Grain of salt though. Tomb Raider numbers were collected with the in-game benchmark mode.