概述 — 这个页面做什么
基础设施 ▸ 连接与流量 ▸ 流量(/infra/traffic/net)是一个只读控制台,它把每台服务器的 网络 I/O 吞吐(入站/出站的字节数与数据包数)绘制成折线图,每张服务器卡片一张 ECharts 图表。
数据来源是旧版的 server_traffic 表(约 160 万行,legacy_glory 连接),由旧版采集器 check_tx.js 写入。该表按服务器 × 方向(入站/出站)累积每个窗口的 增量字节数与数据包数,但旧的 stats-design 界面始终只展示 server_status 的 traffic-out(单一的出站数据包增量)。本页面是第一个把 入/出 × 字节/数据包 完整数据集呈现出来的界面。
三个姊妹页面(端口连接、IP 连接、流量)共用同一个
TrafficController与SessionQueryService,但只有流量标签页读取的是server_traffic的吞吐时间序列,而不是会话快照(traffic_session_ct)。这也是它使用 区间(1h/6h/24h)窗口,而不是另外两个页面所用计时器(1/5/60 分钟)的原因。
何时使用
- 按时间追踪某台服务器上的 带宽尖峰或激增(夜间备份传输、大文件下载、DDoS 流入)。
- 通过 入:出 比率 判读一台服务器的性格(Web 服务器偏出站;备份接收端偏入站)。
- 对出站数据包/字节数突然跳高的节点,在深入 安全 ▸ 威胁 或 IP 调查弹窗 之前,把本页面作为第一道排查界面。
- 借助新鲜度 KPI 一眼看出 采集滞后(stale)的服务器。
页面布局
页首(顶部栏)
| 元素 | 说明 |
|---|---|
| 指标切换 | bytes | packets —— 同一份数据按字节/数据包刻度重新着色(无需请求服务器) |
| 区间切换 | 1h(60)| 6h(360)| 24h(1440)—— 显示窗口,单位为分钟。所选值保存到 localStorage |
| 时间戳 | 最新窗口时间(server_traffic 的 MAX + 显示时区偏移) |
| 刷新 | 立即重新取数(独立于 30 秒自动轮询) |
| 全屏 | 隐藏顶部导航并放大卡片网格(按 ESC 退出) |
KPI 条(流程:入 · 出 · 数据包 · 比率 → 热点 → 新鲜度)
| KPI | 含义 |
|---|---|
| 入站合计 | 各服务器 最新数据点 入站字节数之和 |
| 出站合计 | 各服务器最新数据点出站字节数之和 |
| 数据包合计 | 各服务器最后一个(入+出)数据包数之和 · 单位 /window(不是累计值) |
| 入:出 | out ÷ in(保留 1 位小数),以 1 : x 的形式显示。入站为 0 时显示 — |
| 流量最高者 | 最新出站字节数最大的服务器(热点) |
| 活跃服务器 | 最后一个数据点落在窗口末端 15 分钟以内的服务器数量 / total。低于总数时给出警告(黄色) |
刻度配色图例 + Y 轴刻度
线条/面积的颜色编码的是数值的 量级(ECharts visualMap piecewise)。数值跨过阈值时颜色随之改变,因此可以凭颜色感知量级。
| tone | bytes | packets |
|---|---|---|
| info | < 1MB |
< 1K |
| good | 1–10MB |
1–10K |
| warn | 10–100MB |
10–100K |
| crit | > 100MB |
> 100K |
- 方向由线条形状编码:出站=实线+较重的面积,入站=虚线+浅色面积。此外还可通过表头箭头(↓ 入 / ↑ 出)与提示框区分。
- Y 轴刻度切换:
linear(默认,最小值固定为 0 → 面积如实呈现)|log(把 KB–MB 压缩到同一条轴上,使入站与出站都可见)。所选值保存到localStorage。
服务器流量卡片
每张卡片对应一台服务器。表头显示主机名以及当前的入站/出站字节数;主体是一张 200px 的 <metric-chart>(ECharts,动态导入)折线图。
- 拖拽排序:使用手柄(⋮)重新排列卡片;顺序保存在
infr:order:traffic-net下。 - Masonry 布局 + 每页 12 张卡片。
- 固定时间轴:每张卡片都把 X 轴固定到
win.since ~ win.until(共享窗口)。采集滞后的服务器会如实地渲染为 左侧的一小段,而不会把寥寥几个点拉伸成横贯整幅的虚假曲线。
使用方法
- 选择区间 —— 追查尖峰用
1h,观察日常规律用24h。 - 切换指标 —— 看带宽负载用
bytes,看连接/PPS 特征用packets。 - 对数轴 —— 对于入出差距很大的服务器(出站 ≫ 入站的 Web 节点),
log能让两条曲线都保持可见。 - 重排卡片 —— 把关注的服务器拖到最前(保存在浏览器中)。
- 追查热点 —— 当发现 KPI
Top服务器或 crit(红色)曲线时,跳转到 端口连接 / IP 连接,查明是哪个 IP/端口造成的。
提示框会显示
HH:MM表头以及各系列的数值(入/出)。即使卡片很窄,时间轴标签也会自动隐藏以避免重叠(hideOverlap)。
数据来源
server_traffic(legacy_glory · 只读)
| 列 | 用途 |
|---|---|
server_name, server_index |
服务器标识 |
time_window_start |
采集窗口起始时刻(相隔约 300 秒 = 5 分钟) |
direction |
inbound | outbound |
delta_bytes_count |
本窗口的字节增量 |
delta_packet_count |
本窗口的数据包增量 |
源查询(TrafficRepository::serverTraffic)使用参数绑定,只扫描一个 狭窄的窗口(不写死常量,也不做字符串拼接):
SELECT server_name, server_index, time_window_start, direction,
delta_packet_count, delta_bytes_count
FROM server_traffic
WHERE time_window_start >= :since -- (最新窗口)− 区间
ORDER BY time_window_start
LIMIT 6000;
锚点 = MAX(time_window_start)(走索引的 MAX → 开销很低)。since = anchor − range minutes。
分钟分桶归一化(锯齿修正)
采集器
check_tx.js在其循环内部对入站和出站分别调用 各自的new Date()打时间戳,因此在同一个 5 分钟周期内time_window_start的取值会相差 1–2 秒(例如入站:02、出站:03)。按精确时间戳分组时,每个时刻只能捕获入/出中的一个,另一个则保持为 0 —— 于是产生 锯齿状图表。
修正:SessionQueryService::reshapeNet 会把时间戳取整到 分钟桶(round(ts/60)*60),使入站与出站合并为同一个数据点。窗口间隔(300 秒)远大于分桶粒度(60 秒),因此相邻窗口绝不会撞在一起。
显示时区偏移
由于旧版数据库的存储时间可能与显示时间不一致(实测约有 9 小时偏差),数值会经由 OpsPolicy::trafficTzOffsetSec() 做 仅用于显示 的偏移(时间戳、时间轴、系列时间戳)。SQL 边界(min/max)不做偏移 —— 查询使用旧版的原始时间。
缓存 · 轮询
- 服务端
Cache::remember('infr:traffic:net:v1:<range>', 30, …)—— 30 秒缓存。 - 前端每 30 秒自动轮询一次(
/infra/traffic/net/live?range=<minutes>)。
访问权限
- 只读页面。 不涉及写入、封禁或其他破坏性操作。
- 由于属于基础设施角色区域,它对 最低 user_level 1(demo=1)开放;staff(5)与 admin(10)当然也有访问权限。
- 该路由由
infr.auth中间件保护(需要会话认证)。 - 数据源凭据仅来自
config('database.connections.legacy_glory')(即.env)—— 控制器/服务中没有写死任何凭据。
疑难排查与常见问题
Q. 我只看到“暂无流量采样”。
这说明 server_traffic 中没有近期窗口。请检查采集器 check_tx.js 是否在运行,以及 legacy_glory 连接是否有效。当 latestTrafficWindow()(MAX)为 null 时,卡片为空且 KPI 显示 0。
Q. 某台服务器只在左侧画出很短的一段。
这是设计使然。时间轴被固定到共享窗口,因此采集滞后的服务器会如实地绘制到它最后一次观测为止,呈现为 左侧的一小段。它同时会在 Active servers KPI 中被计为不活跃(最后一个数据点落在窗口末端 15 分钟之外)。
Q. 某一个方向的曲线看起来像锯齿。
分钟分桶归一化能修正大多数情况,但如果采集窗口本身就不规则,仍可能残留一些锯齿。切换到 log 轴可以使其平滑。
Q. 这些数值是累计值吗?
不是。delta_* = 每个窗口(约 5 分钟)的增量。这也是 Total packets KPI 标注 /window 的原因。它们不是累计计数器。
Q. 时间差了好几个小时。
显示时区通过 OpsPolicy 的 traffic_tz_offset 设置进行校正(参见 运维策略)。
相关内容
- 端口连接 —— 按端口/服务器的 TCP 状态分布 + 排名靠前的源 IP
- IP 连接 —— 按服务器的远端对端 IP × 端口强度 + IP 深入调查弹窗
- 服务器(负载时间序列) —— 负载/CPU/内存时间序列,采用同样的 ECharts
<metric-chart>模式 - 健康状态(节点健康) —— 各节点的 CPU 环形图 + 服务圆点
- 运维策略 ——
traffic_tz_offset与受监控端口等全局设置
