Part 2 of Same Prompts, Three Macs.
The previous post ended with timings I no longer trusted. The two Mac Studios were stacked, the M3 Ultra underneath and the M5 Ultra on top. During a long session on the M5 Ultra I ran this by hand:
sudo powermetrics --samplers thermal
It reported a thermal pressure level of Moderate, then Heavy, and went back to Nominal about 40 seconds after the load stopped. Thermal pressure is the level macOS reports as it starts limiting the chip to control heat: Nominal, Moderate, Heavy, Critical. The M3 Ultra had worked for hours at the bottom of that stack and nobody had sampled it. Every speed I had written down was now a number without its conditions.
So the runs were repeated with the level logged, and the machines were moved.
powermetrics needs root, and without it macOS reports nothing useful
(pmset -g therm printed no level). The runs were driven by Claude Code
over SSH, and I didn’t want to hand it the administrator password. I ran
this once on each Mac instead, replacing USER with the account name:
echo 'USER ALL=(root) NOPASSWD: /usr/bin/powermetrics' \
| sudo tee /etc/sudoers.d/powermetrics
sudo chmod 440 /etc/sudoers.d/powermetrics
That lets one account run one program as root without a password. The harness could then log a reading every five seconds beside each run:
sudo -n powermetrics --samplers thermal -i 5000 \
| grep --line-buffered -E 'Sampled system activity|pressure level' \
> thermal.log &
This is the narrow version of the access question from
Local Models and Tool Permissions: one read-only tool, in
place of a password or general sudo. Two caveats belong with it.
powermetrics can report more than temperature, including per-process
energy use, so the rule grants a read of system activity. And the logger
runs as root, so the harness can’t kill it directly; it ends the grep
that reads from it, and powermetrics exits by itself. Removing the file
undoes the rule.
Each run is the same 45 prompts per server from the previous post. The table gives the share of five-second samples at each level, and tokens per second for GLM 5.3 Flash and DeepSeek V4 Flash 0731 under DwarfStar.
| Machine | Placement | Moderate | Heavy | Tokens/s |
|---|---|---|---|---|
| M3 Ultra | Stacked, bottom | 32% | 0% | 22.8, 36.3 |
| M3 Ultra | Side by side | 0% | 0% | 22.8, 36.4 |
| M3 Ultra | Stacked again, bottom | 0% | 0% | 22.8, 36.4 |
| M5 Ultra | Stacked, top | 48% | 0% | 33.3, 55.8 |
| M5 Ultra | Side by side | 12% | 12% | 33.8, 56.6 |
| M5 Ultra | Stacked again, top | 32% | 20% | 33.7, 56.6 |
| M5 Max | Lid closed, flat | under 1% | 96% | 21.2, 26.2 |
| M5 Max | Lid open, flat | 5% | 91% | 23.4, 28.7 |
| M5 Max | Lid closed again | 5% | 92% | 20.4, 25.7 |
The first M5 Ultra row covers only its DwarfStar half, because logging started after its Llama half had run. The M5 Max is a MacBook Pro and ran DwarfStar only.
After the side-by-side runs I wrote down a tidy story. Stacking made the Mac Studios warmer and no slower: the M3 Ultra went from Moderate in 32% of samples to Nominal throughout, and its tokens per second didn’t change in the first decimal on any of the four servers. The M5 Ultra’s DwarfStar half went from Moderate to Nominal with 33.3 and 55.8 against 33.8 and 56.6.
The Heavy reading that started all this was not the stack either. The M5 Ultra reached Heavy only while the Llama app read a very long prompt, for two to four minutes at a time, and it did so standing apart as well. DwarfStar, with these two models, never pushed it past Moderate.
The laptop was the machine that heat limited. With the lid closed it sat at Heavy for 96% of the run. Opening the lid, still flat on the desk, moved that only to 91%, yet the run finished in 47 minutes 41 seconds against 52 minutes, and tokens per second rose by about 10%.
One run per placement is an anecdote. The M3 Ultra’s side-by-side run had also started from a rested machine, while its stacked run followed hours of other work, so “apart is cooler” and “rested is cooler” were the same observation. I restacked the Mac Studios, closed the laptop lid, waited for all three to read Nominal, and started the identical runs at the same moment.
The laptop result came back: 52 minutes 52 seconds closed, and tokens per second fell to the closed figures. Two closed runs now agree against one open run.
The M5 Ultra on top was warmer stacked, as before. Its DwarfStar half read Moderate for four and a half minutes where it had read Nominal apart, and Heavy rose from 12% of the run to 20%. Its speed didn’t change.
The M3 Ultra’s Moderate did not come back. At the bottom of the stack, with the M5 Ultra working above it, it stayed Nominal for all 679 samples. The first reading had followed hours of long-input tests, so it was more likely stored heat than the stack. My tidy story was wrong about the machine it started with.
For placement, the laptop runs with its lid open. The Mac Studios can be stacked as far as speed goes; side by side keeps the upper one cooler, and I keep them apart when there is room.
Some things I didn’t measure. I logged the pressure level, without fan speed or temperature in degrees, so I can’t say what the extra heat costs in noise or wear. I didn’t try the stack the other way up, or the laptop on a stand; I expect a stand with the lid open to be no worse than flat, and that is an expectation. And each placement has at most two runs.
A benchmark number without the machine’s thermal state and recent history is incomplete. I had been publishing mine that way. The next post uses the same harness, with the log running, to choose which models each Mac loads.
Entry dated November 11. The measurements were taken on November 11 and the post was assembled on November 12.