没错,现在是 2015 年 1 月 2 日。就在新年的第二天,我的 VPS 流量用完了。
我的 VPS 是每个月 1 日重置,也就是说才一天 VPS 就跑了整整 1TB 的流量。很奇怪到底是哪个进程在作妖,于是决定找一个方法来追踪 VPS 的流量使用情况。
追踪流量使用情况的软件有很多,比如 nthlogs
和 vnstat
。eBPF 是最近才出现的新技术,因为能够在内核空间运行,所以性能非常好。Linux 内核的计数器也能满足我的需求,因此我选择使用 eBPF 来追踪 VPS 的流量使用情况。
Linux 内核有几个计数器,能够按照进程统计流量的使用情况,包括:
netif_receive_skb
net_dev_queue
napi_gro_receive_entry
net_dev_xmit
只要在这几个地方插入 eBPF tracepoint,再定期打印出来即可。
1 | #!/usr/bin/bpftrace |
赋予执行权限,然后运行,即可每 15 秒输出一次流量使用情况。
1 | sudo chmod +x netstat.bt |
如果需要后台运行,可以用 Systemd 管理。
1 | mkdir /srv/ebpf/netstat |
然后在 /etc/systemd/system/ebpftrace@.service
中写入:
1 | [Unit] |
最后启动服务:
1 | systemctl enable --now ebpftrace@netstat |