macOS Yosemite and above utilize AWDL (Apple Wireless Direct Link) to handle data transfers to other AWDL-enabled devices (Macs, Macbooks, iPhones, etc.) over the Wifi Radio, without the need for a common underlying Access Point.
However, whenever AWDL is active (Bonjour discovery and any Airdrop, Airplay, and GameKit links and transfers), it will lock the Wifi radio for small intervals. For Bonjour discovery specifically, this comes to an effective packet spooling time of about 50-100ms, once per second (active transfers will be higher).
Obviously, this will create unacceptable latency spikes for low-latency desktop streaming apps. To disable the AWDL interface, use the following command in Applications > Utilities > Terminal (this requires you to be logged in as an Administrator and enter your password):
sudo ifconfig awdl0 down
sudo - run as root
ifconfig - configure network interface parameters
awdl0 - the virtual interface device used for AWDL
down - disable the interface
Note that this will prevent all users on the system from using Airplay, Airdrop, GameKit, etc. To reverse, use sudo ifconfig awdl0 up
.
macOS may reenable the interface upon a restart. If you want to keep it off automatically, you can write an Automator application to execute that command, then put it into your Login Items (though it will ask for your password every time). To execute it as root automatically, you may have to write a launchd
daemon property XML.
Additional reading:
https://arxiv.org/abs/1808.03156
man 8 ifconfig
To a lesser extent, the Location Service Wifi scan will also lock the Wifi radio, albeit no more than around once every 5 minutes. To disable it as well:
Settings > Security & Privacy > Privacy > Location Services > Uncheck
Note that this turns off geolocation completely, including for Find My Mac.
In combination with jc and jq, I created this function in Fish to fix this problem while using Parsec. This function toggles
awdl0
status between active and inactive.This is more manual than permanently disabling it of course, but I do want to keep these features active when I am not playing.
I am using the raw path to
ifconfig
because my local brew is shadowing it with the GNU version.jc
is a command line tool (with packages in some languages like Python) that parses known popular CLI tool output to JSON, which makes it easy to read the status from theifconfig
output withjq
Of course, it should be trivial to transform this function into another shell or language; I do recommend installing
jc
andjq
, as it is easier and more readable this way than usinggrep
, but it shouldn't be too hard either if using PCRE2.This variant should also toggle Location Services, but I am not 100% sure that it works, since the associated setting in Privacy Settings stays the same...