macOS-Netzwerknutzungsdaten exportieren
So exportieren und analysieren Sie macOS-Netzwerknutzungsdaten: integrierte Befehle, gängige Formate und nützliche Einzeiler.
- Developer tools
- macOS
- Bandwidth
- Tutorial
Sie haben die Spitze endlich erwischt. Drei Tage lang haben Sie sich gefragt, warum Ihr Heim-Internet-Verbrauch zu zufälligen Stunden hochsprang, und Sie haben endlich ein Tool im richtigen Moment offen, um es zu sehen. Was nun? Sie wollen diese Daten aus dem Live-UI heraus und in etwas, das Sie analysieren, mit einem Kollegen teilen oder gegen ein Server-Log korrelieren können. Die Fähigkeit, macOS-Netzwerknutzungsdaten zu exportieren, zählt mehr, als Leute glauben, und macOS hat anständige Optionen, sobald Sie wissen, wo Sie suchen.
Dieser Beitrag geht durch die praktischen Pfade: nettop -L für kurze Aufzeichnungen, das Unified Log für systemseitige Netzwerkereignisse, Sampling-Skripte für CSV und wo ova seine Daten auf Disk speichert.
Warum macOS-Netzwerknutzung überhaupt exportieren
Ein paar reale Fälle:
- Anomalien-Untersuchung — Sie sahen einen 2-GB-Upload um 3 Uhr morgens, Sie wollen den Quellprozess über die Nacht graphen.
- Kapazitätsplanung — Sie sind an einer kostenpflichtigen oder gedeckelten Verbindung (Starlink Roam, Hotel-Wi-Fi, Mobilfunk-Tether) und wollen wissen, was sicher anbleiben kann.
- Performance-Debugging — Ihr Server-Team fragt, wann die langsamen Anfragen begannen, und Sie wollen client-seitige Netzwerknutzung über deren Server-Logs legen.
- Bandbreiten-Budgetierung pro Projekt — Sie rechnen Kunden stündlich ab und wollen einen Plausibilitätscheck, was deren Build-Pipelines gestern hochgeladen haben.
- Neugier — Sie wollen einfach Ihre eigenen Daten anschauen.
Für all das reicht „Activity Monitor öffnen und starren" nicht. Sie brauchen Daten auf Disk in einem Format, das Sie manipulieren können.
Option 1: nettop-Log-Modus
Der einfachste Export-Pfad ist eingebaut. nettop -L <Anzahl> läuft im Log-Modus für <Anzahl> Samples, dumpt jedes Sample als Textzeile und beendet sich. Kombiniert mit -J zum Wählen der Spalten und -s zum Setzen des Intervalls bekommen Sie sauberen Output, den Sie in eine Datei pipen können.
nettop -L 600 -s 1 -P -J bytes_in,bytes_out,interface,state \
> ~/Desktop/nettop-10min.txtDas sind 600 Samples in Ein-Sekunden-Intervallen — zehn Minuten Aufzeichnung. Jedes Sample listet jeden aktiven Prozess mit den angeforderten Spalten.
Der Output ist nicht ganz CSV — er hat einen Header pro Sample, Leerzeilen zwischen Samples und Prozessnamen mit Leerzeichen. Aber er ist parsebar. Ein kurzes awk- oder Python-Skript verwandelt ihn in eine saubere Tabelle.
Limits des nettop-Loggings
- Es erfasst nur, während es läuft. Wenn Sie wissen wollten, was gestern passierte, haben Sie Pech.
- Es meldet standardmäßig kumulativ-seit-Prozessstart; Deltas berechnen Sie selbst.
- Hilfsprozesse erscheinen als separate Zeilen (keine Zusammenfassung).
- Das Sample-Format ist kein erstklassiges CSV; rechnen Sie damit, einen Parser zu schreiben.
Für Ad-hoc-Aufzeichnungen eines spezifischen Zeitfensters — „ich pushe gleich auf GitHub, lass mich fünf Minuten drumherum aufzeichnen" — ist nettop -L großartig. Für laufende Daten wollen Sie etwas anderes.
Option 2: das Unified Log
macOSs Unified Log erfasst strukturierte Ereignisse aus System-Frameworks, einschließlich Networking. CFNetwork (die URLSession-Schicht) und Network.framework emittieren beide Log-Zeilen für Verbindungs-Lebenszyklus, TLS-Handshake, Retries und Fehler. Sie können diese im Nachhinein extrahieren.
Um zu sehen, was gerade da ist, fragen Sie für die letzte Stunde ab:
log show --last 1h --predicate 'subsystem == "com.apple.CFNetwork"' \
--info --debugUm in eine Datei zu exportieren:
log show --last 24h --predicate 'subsystem == "com.apple.CFNetwork"' \
--style compact > ~/Desktop/cfnetwork-day.logNützliche Predicates:
subsystem == "com.apple.CFNetwork"— URLSession-Anfragen, TLS, Redirectssubsystem == "com.apple.network"— Network.framework-Pfadänderungen, Verbindungszustandprocess == "YourApp"— auf eine App beschränkeneventMessage CONTAINS "443"— Textsuche in Log-Nachrichten
Das Unified Log behält grob die letzten paar Tage Systemereignisse, je nach Volumen. Es ist nicht für Byte-Buchhaltung designt — es ist für Ereignis-Auditing designt. Aber wenn Ihre Frage „ist die Verbindung zu api.example.com um 14:23 fehlgeschlagen" lautet, weiß es das Unified Log.
log show vs log stream
log show liest das historische Log. log stream beobachtet neue Ereignisse live. Nutzen Sie log stream, wenn Sie ein Terminal laufen lassen und Ereignisse beobachten wollen, wie sie passieren:
log stream --predicate 'subsystem == "com.apple.network"' --level debugPipen Sie mit >> in eine Datei, um eine rollende Aufzeichnung anzuhängen.
Option 3: ein eigenes Sampling-Skript
Wenn Sie CSV-Output von Pro-Prozess-Bandbreite wollen — das eigentliche Ziel der meisten Leute — können Sie das in 20 Zeilen Shell bauen. Die Idee: alle N Sekunden pollen, kumulative Byte-Zähler differenzieren, CSV emittieren.
#!/usr/bin/env bash
# Naiver Pro-Prozess-Bandbreitensampler.
INTERVAL=5
echo "timestamp,pid,process,delta_in,delta_out"
declare -A prev_in prev_out
while true; do
ts=$(date +%s)
while IFS=, read pid name in_bytes out_bytes; do
pi=${prev_in[$pid]:-0}
po=${prev_out[$pid]:-0}
di=$((in_bytes - pi))
do_=$((out_bytes - po))
if (( di > 0 || do_ > 0 )); then
echo "$ts,$pid,$name,$di,$do_"
fi
prev_in[$pid]=$in_bytes
prev_out[$pid]=$out_bytes
done < <(nettop -P -L 1 -J pid,interface,bytes_in,bytes_out 2>/dev/null \
| awk 'NR>2 {print $2","$1","$3","$4}')
sleep $INTERVAL
doneDas ist eine Skizze — Produktionscode würde Prozess-Exits, Hilfsprozess-Zusammenfassung, Log-Rotation und die Tatsache, dass nettops Output-Format nervig zu parsen ist, handhaben — aber es zeigt die Form. Sie sampeln, Sie diffen, Sie emittieren CSV. Lassen Sie es unter caffeinate oder als launchd-Agent laufen, wenn es Sleep überleben soll.
Sehen Sie ova in Aktion
Ein auf einen Blick erfassbarer Menüleisten-Bandbreitenmonitor — lokal, signiert, ~3 MB.
Option 4: ovas lokale Datenbank
Ein zweckgebauter Bandbreitenmonitor erspart Ihnen, das Skript oben zu schreiben. ova führt eine SQLite-Datenbank in:
~/Library/Application Support/ova/Die Inhalte sind dieselben Zeitreihendaten, die Sie im UI sehen: Pro-App-Bytes ein und aus, gesampelt mit grob 1 Hz, mit unter ihrer übergeordneten App zusammengefassten Hilfsprozessen. Sie ist lokal, kein Cloud-Sync, keine Telemetrie. Die Datei gehört Ihnen.
Weil sie SQLite ist, kann alles, was SQLite lesen kann, sie lesen: das sqlite3-CLI, Pythons sqlite3-Modul, DB Browser für SQLite oder eine schnelle Abfrage in DuckDB. Sie können:
- Die ganze Historie mit einem Befehl in CSV exportieren
- Aggregationen ausführen („welche App hat diese Woche die meiste Bandbreite genutzt, pro Stunde")
- Gegen Ihre eigenen Logs joinen (Build-Pipelines, Server-Zugriffslogs, Kalenderereignisse)
- Es zu Ihrem normalen Backup-Ziel sichern
Ein typischer Export nach CSV mit sqlite3:
sqlite3 -header -csv \
~/Library/Application\ Support/ova/<file>.sqlite \
"SELECT timestamp, app, bytes_in, bytes_out FROM samples \
WHERE timestamp > strftime('%s','now','-7 days') \
ORDER BY timestamp" > ~/Desktop/last-week.csvPraktische Rezepte, Joins und Privatsphäre
Sobald Sie eine CSV haben — aus jeder Quelle — zahlen sich ein paar Abfragen aus.
Top-Apps pro Woche
SELECT app,
SUM(bytes_in) / (1024*1024) AS mb_down,
SUM(bytes_out) / (1024*1024) AS mb_up
FROM samples
WHERE timestamp > strftime('%s','now','-7 days')
GROUP BY app
ORDER BY (mb_down + mb_up) DESC
LIMIT 20;Erzählt fast immer eine klare Geschichte. Browser oben, Sync-Apps in der Mitte, Systemdienste unten.
Stündliche Heatmap
SELECT strftime('%H', timestamp, 'unixepoch', 'localtime') AS hour,
SUM(bytes_in + bytes_out) / (1024*1024) AS mb
FROM samples
WHERE timestamp > strftime('%s','now','-30 days')
GROUP BY hour
ORDER BY hour;Zeigt Ihnen, wann Ihr Verkehr spitzt. Für die meisten: 9 Uhr, 13 Uhr und 16 Uhr, mit einem langen Schwanz von Cloud-Sync über Nacht.
Anomalie-Erkennung
SELECT app,
date(timestamp, 'unixepoch', 'localtime') AS day,
SUM(bytes_out) / (1024*1024) AS mb_up
FROM samples
GROUP BY app, day
HAVING mb_up > 500
ORDER BY mb_up DESC;Markiert jeden App-Tag mit mehr als 500 MB Upload. Eine Handvoll ist normal (Time Machine zu Netzwerkziel, Photo-Sync, große Datei-Transfers). Eine ganze Liste unbekannter Apps lohnt eine Untersuchung.
Quellen kombinieren
Der stärkste Workflow nutzt mehrere Quellen gleichzeitig.
- ova für Byte-Buchhaltung — was wurde genutzt, von welcher App, wann
- Unified Log für Ereignisse — wann starteten Verbindungen, schlugen fehl, retryten
tcpdumpfür die Leitung — wenn etwas wirklich mysteriös ist
Sie können sie über Zeitstempel joinen. Wenn ova einen 200-MB-Upload von cloudd um 3:14 Uhr morgens zeigt, zeigt das Unified Log, was cloudd synchronisierte, und (falls Sie ein Paket-Capture liefen hatten) tcpdump zeigt den Ziel-IP-Bereich, der bestätigt, dass es iCloud war.
Eine Anmerkung zur Privatsphäre
Alles, was Netzwerkdaten exportiert, kann Informationen leaken, die Sie nicht teilen wollten. Hostnamen, sogar Pfade im Unified Log, können verraten, welche Dienste Sie nutzen. Bevor Sie Logs an einen Kollegen senden oder in einen Chat einfügen:
- IP-Adressen entfernen, falls sie Ihr Heimnetzwerk identifizieren
- Hostnamen redigieren, die persönliche Dienste verraten
- Prozessnamen entfernen, die Apps verraten, für die Sie nicht werben wollen
Das ist auch, warum lokal-nur-Tools zählen. ova schickt Ihre Daten nirgendwo — sie bleiben auf Ihrer Disk. Was Sie exportieren ist Ihre Entscheidung.
Fazit
Um macOS-Netzwerknutzungsdaten zu exportieren, haben Sie mehrere vernünftige Pfade: nettop -L für kurze Aufzeichnungen, das Unified Log für Ereignis-Auditing, eigene Sampling-Skripte für volle Kontrolle und einen lokalen SQLite-gestützten Monitor wie ova für laufende Pro-App-Buchhaltung. Wählen Sie nach dem, ob Sie Ereignisse oder Bytes brauchen und wie lang ein Fenster Ihnen wichtig ist.
Für einen Niedrig-Aufwand-Pfad, der kontinuierlich erfasst und Ihnen erlaubt, später abzufragen, installieren Sie ova — etwa 3 MB, macOS 14+, Apple Silicon und Intel, samplet mit grob 1 Hz. Die Daten leben in Ihrem ~/Library/Application Support/ova/-Verzeichnis in SQLite, sodass jedes Analyse-Tool, das Sie schon kennen, sie lesen kann.