返回博客
·10 分钟阅读·productdevbook

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_inbytes_out — 自进程启动以来的合计
  • rx_duperx_ooo — TCP 重传和乱序包
  • re-tx — 重传
  • rtt_avg — 往返时间,对发现慢网络有用
  • rcvsizetx_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 Helpercom.docker.backend。没有归并。你看到原始内核视图。

路由可能令人意外。 走 VPN 隧道的连接会显示接口 utun0 或类似,不是 en0。如果你看到一个不认识的接口上的流量,值得调查。

nettop 失手的地方

作为一个免费、内置工具,nettop 真的有用。但有真实限制。

没历史

退出 nettop 数据就没了。没有日志文件、没有滚动窗口、没有持久化状态。如果尖峰发生时你没看着,你没看到。-L 日志模式如果在你想捕获的事件之前设好就有帮助,但那是计划,不是调试。

不归并辅助

如指出的,你看到 Google Chrome Helper (GPU)(Plugin)(Renderer) 等作为单独行。脑内把 30 个短寿渲染进程加起来既乏味又易错。

仅终端

实时 nettop 会话占一个终端窗口。如果你想在写代码时一眼瞄"现在有没有东西在用带宽?",得切上下文。没有菜单栏小工具、没有通知、没有 tray 图标。

列名混淆

re-txrtt_vartx_dupe——列以内核 TCP 统计命名,不为人类。man 页是你的朋友,但学习曲线真实。

没有按应用或类别过滤

你不能说"只给我看 Chrome 和它的辅助"或"给我看除系统进程外的所有"。你过滤靠管道到 grep,能用但不愉快。

没有告警

如果你想知道一个应用什么时候突然开始用 50 MB/s,nettop 不会告诉你。你得把它包在一个轮询脚本里做样本差并与阈值比。

看 ova 实战

一眼可瞄的菜单栏带宽监控——本地、签名、约 3 MB。

下载 macOS 版

为什么 UI 帮上忙

多数时候你不想知道按流的 TCP 统计。你想知道:

  1. 现在有没有东西在用带宽?
  2. 是哪个应用?
  3. 过去一小时、一天、一周每个应用用了多少?

ova 这种菜单栏应用读跟 nettop 读的大致一样的内核数据,但在上面做三件事:

  • 把辅助进程归并到父应用下,所以 "Slack" 是一行
  • 本地存储历史,所以你能拖回去问"下午 2:47 发生了什么"
  • 住在菜单栏里,所以你工作时一眼可瞄

那不比 nettop 好——是不一样。nettop 是某个时刻你伸手去拿的调试工具。带宽监控是环境意识。

实时 + 历史在一处
ova 在你菜单栏显示当前速率,背后是完整可拖动时间线。nettop 显示实时速率。ova 还把昨天下午 3 点保留可用。

把 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 是什么、回来什么响应码。

一个走完的例子

假设你笔电空闲时风扇响。调查链:

  1. 打开终端,跑 nettop -P -L 5 -s 2 -J bytes_in,bytes_out,interface
  2. 读输出。假设 cloudd 在 10 秒内显示 80 MB 上行。
  3. log show --last 1m --predicate 'process == "cloudd"' --info
  4. 日志说 iCloud 在上传你今天早些时候手机上拍的照片。
  5. 决定要等过去、还是限速 iCloud、还是暂停上传。

整个序列约 90 秒。如果你前一天装了 ova,第 1 步会是"看菜单栏",你打开终端之前就已经知道 cloudd 是元凶。统一日志那一步还是适用。

收尾

macOS 上的 nettop 是一个小、快、内置、没人在做营销的工具。一旦你知道它存在,它就是"我需要看现在什么在用我的网络"的对的答案。它的限制真实——没历史、不归并、仅终端——但在它的范围里,免费的东西很难打。

要环境意识、可拖动历史、和不打命令的按应用归并,你想要菜单栏应用。ova 做那部分:约 3 MB,macOS 14+,Apple Silicon 和 Intel,约 1 Hz 采样,所有东西本地存磁盘。nettop 和 ova 解决相邻问题,多数 macOS 用户两个都有受益。