bandwhich
> bandwhich — 实时监控网络带宽占用,快速定位“谁在吃网速”。
写这篇东西的起因,是我最近在家办公时,总感觉视频会议卡成PPT。打开任务管理器一看,CPU、内存都正常,但网络占用那一栏直接飙满。Windows自带资源监视器虽然能看,但那个界面实在让人提不起劲去深挖。后来我翻到了一个叫bandwhich的命令行工具,用了两周,彻底治好了我的“网速焦虑症”。这东西就是那种“用过就回不去”的小工具,今天好好聊聊它。
### 这个工具到底干什么的?
简单说,bandwhich是一个终端里的网络带宽监控器。它能告诉你三件事:
1. **哪个进程**正在疯狂下载或上传(比如你的Chrome开了多少个标签页在偷跑)
2. **连接了哪些远程IP**(是CDN服务器,还是某个奇怪的海外地址)
3. **每个网络接口**(Wi-Fi、网线、VPN隧道)的实时流量
它解决的核心痛点就是:**当网络变慢时,你不需要靠猜,也不需要装一堆臃肿的图形化软件,直接在终端敲一行命令,就能看到实时的“流量排行榜”**。对于开发者、运维、或者任何喜欢用终端控制电脑的人来说,这简直是刚需。
### 下载方式
官方主页在这:[bandwhich GitHub仓库](https://github.com/imsnif/bandwhich)
所有安装包和源码都在这里。它支持Linux、macOS、Windows,甚至能在树莓派上跑。
### 安装方法
安装方式因系统而异,但都挺简单的。我按平台说:
**macOS(用Homebrew)**
这是最爽的,一行命令搞定:
```bash
brew install bandwhich
```
**Linux(用发行版包管理器或cargo)**
Ubuntu/Debian用户可以直接用apt,但版本可能比较旧。推荐用cargo(需要先装Rust):
```bash
sudo apt install cargo # 如果没装Rust
cargo install bandwhich
```
或者用snap(部分发行版):
```bash
snap install bandwhich
```
**Windows(用scoop或手动下载)**
如果你用scoop包管理器,很简单:
```bash
scoop install bandwhich
```
否则,去GitHub的[Releases页面](https://github.com/imsnif/bandwhich/releases)下载Windows的预编译exe文件,扔到系统PATH路径里就行。
**树莓派/ARM设备**
同样用cargo安装,或者用Docker跑(官方有镜像)。我试过在树莓派4B上编译,大概两分钟搞定。
### 基础使用教程
安装完,打开终端,输入:
```bash
sudo bandwhich
```
**注意:** 在Linux和macOS上,因为要读取网络接口的原始数据,必须用sudo或root权限。Windows上不需要,但得确认你的终端有管理员权限。
运行后,你会看到一个实时更新的终端界面,大概长这样(我手打一个示例):
```
bandwhich v0.22.0
Interface: en0 (Wi-Fi) ↑ 1.2 MB/s ↓ 3.4 MB/s
PID Process Remote Address Download Upload
1234 chrome 142.250.80.14:443 2.1 MB/s 0.3 MB/s
5678 iTerm2 8.8.8.8:53 0.5 MB/s 0.0 MB/s
9012 Discord 104.16.0.1:443 0.8 MB/s 0.1 MB/s
3456 Dropbox 52.84.0.1:443 0.0 MB/s 0.8 MB/s
```
**怎么看这个界面?**
- 最上面一行:当前监控的网络接口名、上行和下行总速度。
- 下面的表格:按“下载速度”从大到小排序的进程列表。每一行显示PID、进程名、它正在连接的远程IP和端口、以及该连接的实时下载/上传速度。
**常用快捷键:**
- `q` 退出。
- `h` 显示帮助(其实就那么几个键)。
- `s` 按上传速度排序(默认按下载排)。
- `n` 按进程名排序。
- `p` 只显示特定进程(比如只显示chrome)。
**如何定位“罪魁祸首”?**
比如你发现总下载速度飙到10MB/s,但自己明明没下载东西。看一眼列表,发现一个叫`backup_agent`的进程在疯狂上传。这就是某个云同步工具的后台进程。直接kill掉它(`sudo kill -9 PID`),或者去设置里关掉自动同步。
### 进阶技巧
如果你觉得基础模式已经够香了,那下面这几个玩法能让你更爽:
#### 1. 过滤特定网络接口
如果你有多个网卡(比如Wi-Fi+以太网+VPN),可以用`-i`指定监控哪个:
```bash
sudo bandwhich -i eth0 # 只监控有线网卡
sudo bandwhich -i utun4 # 监控某个VPN隧道(比如Tailscale)
```
这对排查“VPN到底在不在走流量”特别有用。
#### 2. 只显示特定进程或用户
用`-p`参数过滤进程名(支持模糊匹配):
```bash
sudo bandwhich -p chrome # 只看Chrome的流量
```
或者用`-u`过滤用户ID(Linux上):
```bash
sudo bandwhich -u 1000 # 只看UID为1000的用户的进程
```
这样当服务器上多个用户跑任务时,能快速定位是谁在占带宽。
#### 3. 输出到文件或管道(无头模式)
默认是交互式界面,但可以用`--raw`或`--json`输出纯文本/JSON,方便集成到脚本或日志系统:
```bash
sudo bandwhich --raw # 输出类似 tcpdump 的格式
sudo bandwhich --json | jq '.' # 输出JSON,用jq格式化
```
比如我写了个小脚本,每5分钟跑一次`bandwhich --json >> network_log.json`,然后结合Grafana做历史流量图。
#### 4. 在SSH远程会话中使用
如果你远程登录到一台服务器,想监控它的网络,直接用`bandwhich`就行。但注意:SSH连接本身也会被列出来(因为SSH也走网络)。可以用`-p`排除SSH进程:
```bash
sudo bandwhich -p 'sshd' # 排除SSH进程,只看其他应用
```
或者更狠一点,用`-e`排除某些IP段(比如排除本地局域网):
```bash
sudo bandwhich -e 192.168.1.0/24 # 不显示内网流量
```
#### 5. 结合iftop或nethogs
bandwhich侧重进程级监控,而`iftop`侧重连接级(显示每个IP对的流量),`nethogs`则是老牌进程监控工具。我通常这么组合:
- 先用bandwhich找到“哪个进程在吃带宽”。
- 再用iftop看那个进程连了哪些IP(比如发现Chrome连了某个CDN节点在疯狂下载)。
- 最后用`lsof -i`找到具体连接,甚至直接杀掉。
#### 6. 自定义刷新间隔
默认每秒刷新一次,但如果你觉得太闪眼,可以用`-t`调整:
```bash
sudo bandwhich -t 2 # 每2秒刷新一次
```
### 一些注意事项
- **权限问题**:Linux上必须sudo,macOS上也是(除非你给终端特殊权限)。Windows上记得以管理员身份运行终端。
- **虚拟接口**:如果你用Docker或虚拟机,可能会看到一大堆`veth`接口。用`-i`指定物理接口即可。
- **性能影响**:bandwhich本身很轻量,读取的是系统提供的网络统计接口(比如Linux的`/proc/net`),基本不会影响网络性能。但在超高带宽(万兆)环境下,CPU占用会稍微高一点,但远低于图形化工具。
### 最后说两句
bandwhich不是那种花里胡哨的工具,它就像一把瑞士军刀——朴实、锋利、随时待命。对于经常和网络打交道的开发者、运维,甚至只是普通用户想搞清楚“为什么我的网这么卡”,它都能帮你省下大量排查时间。
如果你觉得Windows任务管理器或者macOS的活动监视器不够直观,或者你本身就是终端控,那bandwhich绝对值得你花三分钟安装试试。相信我,当你第一次用它在同事面前精准指出“是Dropbox在同步大文件导致会议卡顿”时,那种感觉,比装了个RGB键盘还爽。
**对了,别忘了安装后先跑个`sudo bandwhich`,看看你家网络到底在忙什么。** 我猜第一个让你惊讶的,可能是某个你早就忘记的软件后台更新。