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`,看看你家网络到底在忙什么。** 我猜第一个让你惊讶的,可能是某个你早就忘记的软件后台更新。