macOS will tell you your network speed, but only if you go and ask. Activity Monitor has a Network tab with data in and out per process, and it is genuinely good once it is open.
The problem is that by the time you have opened it, whatever you wanted to catch has usually stopped. A number in the menu bar answers a different question: is something using my connection right now, and roughly how much.
Putting it up there
AirStats is free and open source and does this. In settings, turn on one of three menu bar metrics depending on how much space you want to give it:
- Network (up and down). Both rates in one item. What most people want.
- Download only. Half the width, and the direction you usually care about.
- Upload only. Worth its own item if you back up, sync, or push large things and want to notice when it starts.
You can choose the unit too, since bytes per second and bits per second are both defensible and people are religious about which one they want.
Open the panel and there is more: per interface counters, totals since boot, Wi-Fi link quality and your addresses.
What the numbers are
Throughput is a rate, computed from interface byte counters over the interval between two samples. That has one consequence worth knowing: a rate is always an average over a window, so a very short burst that starts and finishes inside one interval shows up smaller and wider than it really was. Every network readout on every platform works this way.
The totals are simpler, they are the counters themselves. You can check those yourself against the kernel:
netstat -ib -I en0That is exactly how the readings were verified when I benchmarked the app: 3.1 GB down and 6.0 GB up, matching exactly. The rest of the accuracy checks are here.
The Wi-Fi part is the expensive part
One implementation detail, because it affects what you should expect to see.
Link quality, signal strength and channel do not come from a counter. They come from CoreWLAN, which is a round trip to another process for each property, and a full read of those measures around 7 ms when the machine is idle and up to 20 ms when it is busy. That is far more than everything else in the network collector costs put together.
So signal strength refreshes on its own slower cadence and is cached in between, while the throughput counters keep updating every sample. Your speed numbers are live. Your RSSI is a few seconds stale, on purpose, because it moves slowly and paying 20 ms a second for it would be a bad trade.
That is the kind of decision that separates a monitor you can leave running from one you notice. If you want the rest of them, the sampling design is written up here.