macOS 上 nettop 的工作原理(以及为什么你需要图形界面)
macOS 上 nettop 的友好导览:它能看到什么、看不到什么,以及哪里该交给图形化带宽监控。
- Developer tools
- macOS
- Network monitoring
- Tutorial
打开终端输入 nettop。一秒之内你就有了一个 top 风格的实时显示,每个在做网络 I/O 的 Mac 进程——入字节、出字节、它们走的路由、它们用的协议。这是你不知道自己已经有的工具,找到它之后你想为什么自己之前打开活动监视器的网络标签页。这是 macOS 上 nettop 的巡礼,真正有意义的标志,以及 nettop 走到尽头的地方。
剧透:nettop 对一次性查看很好。它对"Slack 昨天下午 3 点在做什么?"不好。那是一个建在同一组内核计数器上的 UI 填补的空缺。
macOS 上 nettop 实际是什么
nettop 随 macOS 自带,住在 /usr/bin/nettop,至少从 10.7 起就在那。它是一个小命令行前端,建在活动监视器和 Instruments 用的同一组内核 API 之上——主要是带 socket 和 stats 变体的 proc_pidinfo,加上按路由的计数器。多数用法不需要 root。它不抓包。它不需要安装器。
无标志运行:
nettop你会看到类似:
Processes
Google Chrome.40621 tcp4 34.117.x.x.443 Established
Google Chrome.40621 tcp4 142.250.x.x.443 Established
Slack Helper.41218 tcp4 52.5.x.x.443 Established
...按 q 退出,? 看帮助,r 切换速率 vs 合计,d 切换增量模式。
值得知道的标志
nettop 有很多标志。多数是噪声。下面这些是我实际用的。
-m 看模式
-m route 显示按路由流量——能看你在走本地网络、VPN 隧道、还是默认路由。
-m tcp 和 -m udp 过滤到一个协议。
-m process 是默认值,多数情况下你想要的。
-P 进程选择器
-P 让 nettop 跑一次 dump 静态快照,而不是实时刷新。在脚本化或管道到其他工具时你想要这个。
nettop -P -L 1那让 nettop 在非交互模式下跑一个样本然后退出。配合 -J 限制列(下面更多)做干净日志输出。
-L 日志模式
-L <count> 让 nettop 在日志模式下跑给定数量样本然后退出。-L 0 永远跑,每个间隔 dump 一行样本。默认间隔是 1 秒;用 -s 改。
nettop -L 60 -s 1 -P -J bytes_in,bytes_out,interface,state那捕获每秒一个样本持续 60 秒,只带你在乎的列,然后退出。管道到文件留待后续分析。
-J 选列
-J 接逗号分隔的列名列表。有用的列:
bytes_in、bytes_out— 自进程启动以来的合计rx_dupe、rx_ooo— TCP 重传和乱序包re-tx— 重传rtt_avg— 往返时间,对发现慢网络有用rcvsize、tx_win— socket 缓冲区状态interface— 哪个接口(en0、utun0、lo0)state— 连接状态(Established、TimeWait、Listen)
完整列表在 man nettop。约 30 个列;多数情况下 bytes_in,bytes_out,interface,state 就够了。
-x 看 XML
-x 输出 plist XML 格式——可解析,读起来痛苦,但如果你想把 nettop 喂进另一个脚本就有用。实操中通过 -J 和 -L 出来的列输出通常更好处理。
-k 隐藏
-k <column> 隐藏你不在乎的列。-J 的反面。在你想保留实时显示但削减噪声时交互式用。
读输出
关于 macOS 上 nettop 报告的数字几件事要知道:
合计是从进程启动以来,不是你启动 nettop 以来。 像 cloudd 这种长寿进程即使在安静系统上也可能显示几百 MB。用增量模式(交互式 d,或从 -L 日志输出算增量)看实际速率。
每行是一个流,不是一个进程。 一个开了 40 个标签的 Chrome 进程可能有 40+ 行。自己按 PID 聚合——nettop 不会。
辅助进程按它们的辅助名出现。 Google Chrome Helper (Renderer)、Slack Helper、com.docker.backend。没有归并。你看到原始内核视图。
路由可能令人意外。 走 VPN 隧道的连接会显示接口 utun0 或类似,不是 en0。如果你看到一个不认识的接口上的流量,值得调查。
nettop 失手的地方
作为一个免费、内置工具,nettop 真的有用。但有真实限制。
没历史
退出 nettop 数据就没了。没有日志文件、没有滚动窗口、没有持久化状态。如果尖峰发生时你没看着,你没看到。-L 日志模式如果在你想捕获的事件之前设好就有帮助,但那是计划,不是调试。
不归并辅助
如指出的,你看到 Google Chrome Helper (GPU)、(Plugin)、(Renderer) 等作为单独行。脑内把 30 个短寿渲染进程加起来既乏味又易错。
仅终端
实时 nettop 会话占一个终端窗口。如果你想在写代码时一眼瞄"现在有没有东西在用带宽?",得切上下文。没有菜单栏小工具、没有通知、没有 tray 图标。
列名混淆
re-tx、rtt_var、tx_dupe——列以内核 TCP 统计命名,不为人类。man 页是你的朋友,但学习曲线真实。
没有按应用或类别过滤
你不能说"只给我看 Chrome 和它的辅助"或"给我看除系统进程外的所有"。你过滤靠管道到 grep,能用但不愉快。
没有告警
如果你想知道一个应用什么时候突然开始用 50 MB/s,nettop 不会告诉你。你得把它包在一个轮询脚本里做样本差并与阈值比。
看 ova 实战
一眼可瞄的菜单栏带宽监控——本地、签名、约 3 MB。
为什么 UI 帮上忙
多数时候你不想知道按流的 TCP 统计。你想知道:
- 现在有没有东西在用带宽?
- 是哪个应用?
- 过去一小时、一天、一周每个应用用了多少?
像 ova 这种菜单栏应用读跟 nettop 读的大致一样的内核数据,但在上面做三件事:
- 把辅助进程归并到父应用下,所以 "Slack" 是一行
- 本地存储历史,所以你能拖回去问"下午 2:47 发生了什么"
- 住在菜单栏里,所以你工作时一眼可瞄
那不比 nettop 好——是不一样。nettop 是某个时刻你伸手去拿的调试工具。带宽监控是环境意识。
把 nettop 和别的工具组合
nettop 跟少数其他内置工具配得很好。
nettop + lsof
nettop 给你看哪个 PID 在用带宽。lsof -p <PID> 给你看那个 PID 打开的每个文件和 socket。一起回答"这个应用在跟哪个远端通信?"
lsof -i -P -n -p 41218那列出 PID 41218 打开的每个 IPv4/IPv6 socket,带远程地址和端口。
nettop + log show
如果你怀疑系统服务行为不当,统一日志通常比 nettop 有更多上下文。在 nettop 里发现作恶进程后,跑:
log show --last 5m --predicate 'process == "cloudd"'…看 cloudd 同一时间在做什么。
nettop + tcpdump
当你需要知道线上实际是什么时,抓包是答案。nettop 告诉你 "Chrome 在以 12 MB/s 向 142.250.x.x 上传"。sudo tcpdump -i en0 host 142.250.x.x 告诉你那是 HTTP/2 还是 QUIC、SNI 是什么、回来什么响应码。
一个走完的例子
假设你笔电空闲时风扇响。调查链:
- 打开终端,跑
nettop -P -L 5 -s 2 -J bytes_in,bytes_out,interface。 - 读输出。假设
cloudd在 10 秒内显示 80 MB 上行。 - 跑
log show --last 1m --predicate 'process == "cloudd"' --info。 - 日志说 iCloud 在上传你今天早些时候手机上拍的照片。
- 决定要等过去、还是限速 iCloud、还是暂停上传。
整个序列约 90 秒。如果你前一天装了 ova,第 1 步会是"看菜单栏",你打开终端之前就已经知道 cloudd 是元凶。统一日志那一步还是适用。
收尾
macOS 上的 nettop 是一个小、快、内置、没人在做营销的工具。一旦你知道它存在,它就是"我需要看现在什么在用我的网络"的对的答案。它的限制真实——没历史、不归并、仅终端——但在它的范围里,免费的东西很难打。
要环境意识、可拖动历史、和不打命令的按应用归并,你想要菜单栏应用。ova 做那部分:约 3 MB,macOS 14+,Apple Silicon 和 Intel,约 1 Hz 采样,所有东西本地存磁盘。nettop 和 ova 解决相邻问题,多数 macOS 用户两个都有受益。