配置
流量统计
面板上有三个流量数字:
| 数字 | 从哪来 | 什么时候归零 |
|---|---|---|
| 总流量 | hub 侧累加 | 永不归零,也永不回退 |
| 本月流量 | 同上,另存一份 | 跨过这个节点的重置日 |
| 今日流量 | 同上 | 跨过 hub 本地时区的零点 |
为什么由 hub 累加
网卡流量来自内核计数器,它每次开机从零开始。直接显示的话,机器一重启,总流量就归零。
所以 agent 只上报内核计数器的当前读数和一个每次开机都会变的 boot_id,由 hub 累加,agent 保持无状态。
只计入 hub 看着增长的部分
读不出计数器 → 整行不动,不计流量也不改基线
boot_id 和上次一样 → delta = max(当前读数 - 上次读数, 0)
其余情况 → delta = 0,只重新对基线「其余情况」有三种:节点第一次上报、同一次开机内读数变小(某块网卡消失了)、boot_id 变了(重启了,或改了下文的统计网卡)。三种都只重新对基线,因为两种出错方式的代价差几个数量级:
- 按差值计入而判断错了:一次多出一整个 lifetime 计数器(几百 GB),总流量只增不减,只能手工改回
- 重新对基线:只丢掉开机到首次上报之间的量,通常几十秒、几百 KB
boot_id 变化时不计流量还有一个原因:同一条安装命令可能被装到了第二台机器上,两个 agent 用同一个 token
互相顶替,hub 每秒看到两个 boot_id 来回切换。按差值计入的话,实测每来回一次多出 180 GB。
agent 掉线期间的流量会补上
agent 停着的时候内核照样计数,重连后的第一次差值包含了这一段。流量确实跑了,商家也会算。
前提是机器没重启:掉线期间重启过,boot_id 变了,那一段没有基线可减。
哪些网卡计入
默认规则是同一份线路上的字节只数一次,大多数机器不用配置:
- lo、容器和虚拟机的网卡、隧道(WireGuard、Tailscale、tun、sit、gre、vxlan 等)不计
- 网桥、bond、VLAN、macvlan 这类叠在别的网卡上的设备不计,只计它们底下的那块
- 除了看名字,还按内核给出的链路信息判断,自己起名的网桥和隧道也认得出
- PPPoE 只认 OpenWrt 的
pppoe-wan。pppd 拨号的ppp0默认照计,因为 LTE 拨号时它是唯一的链路;用 pppd 拨 PPPoE 的机器会把拨号口和底下的网卡各算一遍,需要按下文指定
agent 启动时会打印一行,列出此刻计入的网卡:
# systemd
journalctl -u monitor-agent | grep "counting traffic"
# OpenRC
grep "counting traffic" /var/log/monitor-agent.logbash转发流量的机器要手动指定
软路由、桥接了软路由的宿主机上,一个包会先后经过 WAN 口和 LAN 口两块真网卡,按默认规则会算两遍。哪块面向运营商只有你知道,需要手动指定。
面板和 hub 的安装命令里都没有这个选项。agent 自己认 --iface 和 MONITOR_IFACE,所以要在机器上改配置文件:
# 改 MONITOR_IFACE= 这一行,没有就加一行
vi /opt/monitor/agent.env
# systemd
systemctl restart monitor-agent
# OpenRC
rc-service monitor-agent restartbashservice 文件用 EnvironmentFile(OpenRC 用 start_pre 载入)读这个文件,所以加一行就够了,不用改
ExecStart。
面向运营商的一般是默认路由所在的那块:
# dev 后面就是网卡名
ip route show defaultbash| 机器 | MONITOR_IFACE |
|---|---|
| PPPoE 拨号 | 拨号口,OpenWrt 叫 pppoe-wan,pppd 叫 ppp0 |
| DHCP 或静态 IP 上网的软路由 | WAN 口,如 eth1 |
| PVE 宿主机上桥接了软路由 | 接运营商的那块物理口,如 enp1s0 |
| PVE 宿主机只算自己、不算 guest | vmbr0 |
写法:
| 值 | 含义 |
|---|---|
eth1,eth2 | 只统计列出的网卡,默认规则不再生效 |
-eth0 | 从本来会计入的网卡里去掉这一块,如软路由的 LAN 口;排除优先于列出 |
| 空 | 恢复默认规则 |
只认完整的网卡名。eth* 这类通配没有特殊含义,会被当成一个普通名字,匹配不到任何网卡:如果它是唯一一项,结果就是什么都不统计,且没有任何提示。
面板里的安装命令重装或升级时,会把 /opt/monitor/agent.env 重写成只有 hub 地址和 token 两行,MONITOR_IFACE 随之丢失,装完要再加一次。
改了之后 hub 重新对基线:从这一刻起按新的网卡累加,已有的总流量不变,新旧两组网卡读数之差不会被当成流量。网卡增减、被重新归类时也一样。
月度周期按商家的重置日算
每个节点有自己的每月重置日(1–31),在编辑节点里设。
- 今天 ≥ 本月的重置日 → 周期从本月的重置日开始
- 否则 → 从上月的重置日开始
- 重置日超过当月天数就落到当月最后一天(设 31 号,2 月落到 28 或 29 号)
重置不靠定时任务,而是在节点下一次上报时触发,所以离线很久的节点重新上线时会从正确的周期开始。
读取时也会再判断一次周期:在周期边界之前掉线的节点,库里存的是上一周期的数字,读出来是 0,不会把上个月的用量当成这个月的。
每月额度
编辑节点里的每月额度(GB)留空或填 0 表示不限。计算方式决定拿哪个数去对额度,流量通知也按它算:
| 计算方式 | 拿去对额度的数 | 适用 |
|---|---|---|
| 上下行相加 | 上行 + 下行 | 大多数商家 |
| 取较大值 | 上行、下行中较大的一个 | 按较大方向计费 |
| 仅上行 | 上行 | 只限上行 |
| 仅下行 | 下行 | 只限下行 |
今日流量按本地时区
日边界和月边界都按 hub 所在机器的本地时区算,不按 UTC。Docker 部署要设 TZ,否则按 UTC 算,见
Docker 部署。
手工校正
在编辑节点里展开流量校正,按 GB 填入总流量或本月流量,用于换机器、迁移或修正一次误算。
只提交改过的项,没改的继续正常累计,不会把打开表单那一刻的数写回去。改本月的值时,hub 同时把周期记为当前周期,否则刚填的数会被当成上个周期的读成 0。
累计值不是从历史明细算出来的,调小保留天数不影响任何流量数字。