Back to blog
·11 min read·productdevbook

Bandwidth Monitoring for Developers and Sysadmins on Mac

A practical bandwidth-monitoring setup for developers and sysadmins on macOS: per-process visibility, scripting hooks, and debugging tactics.

  • Developer tools
  • macOS
  • Network monitoring
  • Sysadmin

A test suite that should take 90 seconds is taking 14 minutes, and CI is timing out. The local run is slow too. You attach a profiler — CPU is fine. Memory is fine. Then you notice the test fixture is making a few hundred outbound HTTPS requests per run because someone added a real-API call to the setup hook three months ago, and now every PR is hammering a sandboxed endpoint that just got rate-limited. Bandwidth monitoring would have caught it on day one.

For developers and sysadmins on Mac, network observability is one of those skills that compounds. Once you know which tool answers which question, you stop wasting hours on problems that are actually a rogue process doing something obvious. This post is the working stack: when to reach for tcpdump, when for Wireshark, when for nettop, when for a per-app monitor like ova, and how to combine them. If you've been searching for bandwidth monitor developers mac, the goal here is the practical decision tree, not the marketing tour.

The four levels, briefly

The diagnostic tools span four levels of abstraction:

  1. Packet bytestcpdump. Every byte on the wire, plus headers. The lowest level. Good for capturing then analyzing.
  2. Packet inspection — Wireshark. tcpdump's data, decoded into readable protocol layers. Great for understanding what a connection is doing.
  3. Live per-processnettop. macOS-native, shows current connections and rates per process.
  4. Per-app aggregate over time — ova. Menu bar app, scrubable history, helper-process folding.

The trick to using these well is matching the level to the question. If you ask "how much bandwidth did our test suite use last week," tcpdump is the wrong answer; ova or a similar per-app history tool is the right one. If you ask "why is this specific HTTPS connection slow," nettop won't tell you — you need Wireshark.

tcpdump: the bytes-on-the-wire view

tcpdump is on every Mac. It's the right tool when:

  • You suspect a specific protocol issue (TLS handshake failures, retransmits, fragmentation).
  • You need to capture traffic for later analysis.
  • You're working on a server-class machine where GUI tools aren't available.

A useful default capture:

sudo tcpdump -i en0 -n -s 0 -w capture.pcap
  • -i en0 — capture on Wi-Fi interface (use en1 for ethernet on Macs with both, or check ifconfig).
  • -n — don't resolve hostnames (much faster).
  • -s 0 — capture the full packet, not just headers.
  • -w capture.pcap — write to a pcap file readable by Wireshark.

To filter:

sudo tcpdump -i en0 -n 'host api.example.com and port 443'
sudo tcpdump -i en0 -n 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0'

The first captures only traffic to a specific hostname on HTTPS. The second captures only TCP connection setup/teardown — useful for counting connections without drowning in payload bytes.

Wireshark: protocol decode

Wireshark reads pcap files and decodes them into a readable hierarchy: Ethernet frame, IP packet, TCP segment, TLS record, HTTP request. Free, local, no cloud component. Install via Homebrew:

brew install --cask wireshark

The display filter language is the magic. A few high-impact filters:

  • http.response.code >= 400 — show failed HTTP responses.
  • tcp.analysis.retransmission — show TCP retransmits, often a sign of network congestion or peer issues.
  • tls.handshake.type == 1 — show TLS Client Hellos (one per connection).
  • dns and dns.qry.name contains "example.com" — show DNS queries for a specific domain.

Wireshark is overkill for "how much bandwidth did Slack use today" but exactly right for "why does this particular connection time out at 30 seconds when others succeed." It's also the right tool when you have a captured pcap from a client machine and need to investigate after the fact.

nettop: the live per-process view

nettop ships with macOS. It's the closest built-in equivalent to a per-app live monitor:

sudo nettop -P -m route

Useful flags:

  • -P — group by process.
  • -m route — show route information (which interface).
  • -x — show byte counts (not just rates).
  • -c <interval> — periodic refresh, e.g. -c 2.
  • -J bytes_in,bytes_out,interface — pick specific columns to show.

nettop is text-only, refreshes its own screen, and works over SSH. It's the right tool when you need a quick "is anything weird right now" answer on a remote Mac (a CI runner, a colleague's machine you're SSH'd into for triage).

The downside: nettop has no history. The moment you exit, the data is gone.

ova: per-app history with helper folding

ova sits in the menu bar and provides what nettop doesn't: persistent history, scrubable timelines, and helper-process folding. Sampling at roughly 1 Hz, the data is written locally and stays until you delete it.

The two things ova does that the built-in tools don't:

  1. Helper-process folding. Chrome creates one helper PID per tab; Slack has its own helper architecture; Discord, Telegram, Electron apps in general do this. nettop shows them as separate rows ("Slack Helper (Plugin)", "Slack Helper (GPU)", etc.), which is technically correct but unreadable. ova folds them under "Slack" so the row is what you actually mean.
  2. Scrubable history. "What happened last Tuesday at 3 PM" is answerable by clicking and dragging on the timeline. nettop's answer is "I have no idea, I wasn't running."
Helper-process folding
ova groups every helper PID under its parent app so you read "Slack" instead of seven helper rows.

For a developer's day-to-day — "did the build hammer the registry," "which test pulled 4 GB," "what's that recurring spike at the top of every hour" — ova answers fast without ceremony. nettop is your fallback when you need "right now, with no installation."

Concrete examples

Debugging an API hammering

A team complains the staging API is slow. You suspect a client is in a retry loop. With ova in the menu bar on the offending dev's Mac, you scrub to the time of the slowness and see the team's CLI tool spiking 80 MB/s for 15 minutes. That's the lead. Open Wireshark on a 30-second capture and confirm: every request is getting a 503 and the client is retrying with a 100 ms backoff. The bug is in the retry policy — exponential, not constant — and now you know exactly what to fix.

Finding a runaway test process

CI is fine but local test runs are slow. Open ova, run the suite, scrub the spike. You see node pulling 200 MB during a 30-second window. tcpdump filtered to the suspicious port shows the test fixture is fetching live data from a real CDN every test, instead of using the recorded fixtures. Replace with a local fixture, suite drops back to 90 seconds.

Surprise outbound from a vendor library

A compliance review asks if the codebase phones home anywhere. Static analysis is partial; the only definitive answer is "watch the network during representative use." Run the app for an hour with ova; capture the same hour with tcpdump for verification. Cross-check the destinations seen in nettop's hostname column. Anything unexpected gets investigated. This kind of audit is hard without per-app history.

A runaway sync agent on a sysadmin's fleet

Internal Slack message: "my Mac feels slow." You SSH in, run sudo nettop -P -m route. A backup agent everyone forgot was installed is doing a full re-index, pulling 30 MB/s sustained. Kill the daemon, file a ticket to fix the schedule. Five-minute fix, would have been an hour without the right tool.

See ova in action

A glance-able menu bar bandwidth monitor — local, signed, ~3 MB.

Download for macOS

Scriptable hooks

For automation:

nettop in JSON-ish output

nettop -P -L 1 -k state,interface_name,rx_dupe,rx_ooo,re-tx,rtt_avg,rcvsize,tx_win,tc_class,tc_mgt,cc_algo,P,C,R,W -J bytes_in,bytes_out

This produces a single sample (the -L 1 flag) you can capture into a script. Pipe to awk or jq after some shaping.

Bandwidth thresholds

A quick "alert if any process exceeds X" script can be built around nettop:

sudo nettop -P -L 1 -J bytes_in,bytes_out -k state,interface_name,P,C,R,W \
  | awk 'NR>1 && ($2+$3) > 1000000 {print}'

(Crude, but functional.) For a production-quality version, look at iftop for traffic-by-host or bmon for interface-level.

tcpdump as a watchdog

sudo tcpdump -i en0 -n 'host suspicious.example.com' -w "/tmp/capture-$(date +%Y%m%d-%H%M).pcap" -G 3600 -W 24

Rotates a 1-hour capture file, keeps 24 of them. Useful for "I don't know when this happens but I want to catch it next time."

ova exports

ova writes its history locally. If you need to feed that into a dashboard or report, the export path is the right starting point — the data is yours, and there's no vendor sync layer in the middle.

Choosing the right bandwidth monitor developers mac workflows actually need

A short matrix:

QuestionRight tool
What's using my network right now?nettop, ova
What used my network at 3 PM yesterday?ova
Why is this specific TCP connection slow?Wireshark
Are there TLS handshake failures?Wireshark
What's the overall byte total for the last week?ova
Is process X talking to host Y?nettop, tcpdump
Capture for forensic review later?tcpdump → pcap
One-off remote diagnostic over SSH?nettop

The pattern is: nettop and ova for "what" and "when," tcpdump and Wireshark for "why" at the protocol level. Most developer-facing questions are answered without ever opening Wireshark — that's a lower-frequency tool reserved for genuinely confusing protocol problems.

Sysadmin-specific patterns

If you maintain a fleet of Macs (small team, design studio, video shop), the patterns are different:

  • Discovery first. Run sudo nettop -P -m route on each machine via SSH or remote management to see what's running. Look for unfamiliar processes — telltale signs of unwanted browser extensions, bundled adware, or forgotten beta software.
  • History on power users. For the heavy network users on the team (video editors uploading dailies, devs pushing big artifacts), a per-app history tool catches recurring issues without having to be there at the moment they happen.
  • Documented baseline. Capture nettop output for a "good" Mac and a "complaining" Mac. The diff is usually obvious.

What to do next

If you're starting from zero on a bandwidth monitor developers mac stack, install ova for the always-on history view, learn the three nettop incantations above, and bookmark Wireshark for when you need it. That's the working set. Most problems in a developer or sysadmin's day get solved at the per-app or per-process level; the packet-level tools are there for the harder cases that show up monthly, not daily.

The test suite hammering an API, the runaway sync agent, the CI runner that's secretly downloading 8 GB per build — these are all visible the moment you have the right tool open. The cost is a few minutes of setup. The payoff is the next time something is "slow for no reason" and the answer is in the menu bar instead of two hours of profiler hunting.