baize 使用指南

nettools · 配置驱动的网络质量持续监控工具

Usage Guide — 涵盖安装、配置、运行模式及典型使用场景。

← 返回首页

目录

1. 概述

Client Server baize 是百度系统部物理网络黑盒监控团队开发的配置驱动网络质量持续监控工具。与 bitflip 的命令行参数模式不同,baize 使用 JSON 配置文件,支持在同一进程中同时运行 Client 和 Server,适合大规模部署和长期运行场景。

百度物理网络内部使用的 baize 工具既支持配置文件,也支持定时拉取数据库节点的配置数据,开源版做了简化,只支持配置文件。同时内部版还会将数据推送到 Kafka 中供聚合程序处理,开源版默认输出到日志中,但已提供了接口可以各种实现。

核心特性:

配置驱动

  • JSON 配置文件
  • 支持注释和热加载
  • 便于版本管理
  • 自动化部署友好

单进程双角色

  • Client + Server 共存
  • 共享 pprof 和日志
  • 统一信号管理
  • 减少部署实例数

运维友好

  • 日志按天轮转
  • 自动清理过期日志
  • 内置 pprof 调试
  • 优雅退出 + panic 恢复

2. 使用场景

baize 在百度大规模物理网络中广泛应用于以下场景:

集群间高频探测

  • 大规模集群间的网络质量持续监控
  • 高频探测(默认 5000 pps)快速暴露间歇性丢包
  • 多端口覆盖 ECMP 路径,定位具体故障链路

LCC 机房探测

  • 跨 LCC 机房的网络质量监测
  • 机房间链路丢包和 bitflip 实时发现
  • 配置驱动,便于批量部署到多机房节点

ADC/DC 网络改造监控

  • 网络设备割接、升级期间持续监控
  • 改造前后质量对比,量化改造效果
  • 自动检测改造引入的丢包和改包问题

专线监控

  • 运营商专线质量持续监测
  • 专线丢包、延迟异常实时告警
  • 为 SLA 评估提供数据支撑

回切验证

  • 故障恢复后流量回切的网络质量验证
  • 确认回切路径无丢包、无 bitflip
  • 对比回切前后丢包率变化

临时点对点监控

  • 故障排查时的临时端到端探测
  • 最小配置即可启动(仅需双方 IP)
  • 验证后可快速停止,无需复杂清理

3. 与 bitflip 的区别

baize 和 bitflip 底层使用相同的 sonar 探测引擎,但面向不同的使用场景:

特性bitflipbaize
配置方式命令行参数JSON 配置文件
进程角色单一角色(client 或 server)支持单进程同时运行 client + server
适用场景临时探测、快速排查长期部署、持续监控
日志管理标准输出按天轮转文件 + 自动清理
pprof不支持内置 pprof HTTP 服务
探测能力丢包 + bitflip 检测相同(共享 sonar 引擎)
退出限制到达 count/duration 自动退出ExitOnReachLimit=false,持续运行
Tip:如果需要临时测试网络质量,使用 bitflip 更便捷;如果需要 7×24 小时持续监控,使用 baize 更合适。

4. 安装

从源码编译

# 克隆仓库
git clone https://github.com/baidu/nettools.git
cd nettools

# 编译全部工具
make compile

# 或单独编译 baize
go build -o baize ./cmd/baize/

使用 GoReleaser 构建发行版

# 本地测试构建 (snapshot)
make snapshot

# 正式发布 (需要 git tag + GITHUB_TOKEN)
git tag v1.0.0
make deploy
Tip:GoReleaser 自动为 Linux/macOS 的 AMD64 和 ARM64 架构构建二进制文件。产物位于 dist/ 目录。

支持的平台

操作系统架构支持
LinuxAMD64
LinuxARM64
macOSAMD64
macOSARM64

5. 快速开始

1. 创建配置文件

# 使用示例配置作为起点
cp baize.example.json baize.json

# 编辑配置,填入实际 IP 地址
vim baize.json

2. 启动 baize

# 使用默认配置文件 baize.json
sudo ./baize

# 指定配置文件路径
sudo ./baize -c /etc/baize/baize.json
Note:Client 角色需要 sudo 权限来设置 IP TOS/DSCP 值。如果仅运行 Server 角色,可能不需要 root 权限。

3. 最小配置示例

仅启动 Client:

{
  "client": {
    "client_addr": "10.0.0.1",
    "server_addrs": "10.0.0.2"
  }
}

仅启动 Server:

{
  "server": {
    "server_addr": "10.0.0.2",
    "client_addrs": "10.0.0.1"
  }
}

同时启动 Client 和 Server(互探模式):

{
  "pprof_addr": ":6060",
  "log_dir": "/var/log/baize",
  "log_max_age_days": 7,
  "client": {
    "client_addr": "10.0.0.1",
    "server_addrs": "10.0.0.2"
  },
  "server": {
    "server_addr": "10.0.0.1",
    "client_addrs": "10.0.0.2"
  }
}

6. 配置文件详解

baize 使用 JSON 格式的配置文件,默认路径为 baize.json,可通过 -c 参数指定。

顶层配置

字段类型默认值说明
pprof_addrstring""pprof HTTP 服务监听地址(如 :6060),为空则不启动
log_dirstring""日志文件目录,为空则输出到 stderr
log_max_age_daysint7日志文件保留天数(≤0 时默认 7 天)
clientobjectnullClient 角色配置,为 null 则不启动 Client
serverobjectnullServer 角色配置,为 null 则不启动 Server
Note:clientserver 至少需要配置一个,否则程序启动后会立即退出。

完整配置示例

{
  "pprof_addr": ":6060",
  "log_dir": "/var/log/baize",
  "log_max_age_days": 7,
  "client": {
    "client_addr": "10.0.0.1",
    "server_addrs": "10.0.0.2",
    "tos": 64,
    "client_port_range": "43500,43599",
    "server_port_range": "43600,43609",
    "rate_in_span": 5000,
    "span": "1s",
    "delay": "3s",
    "msg_len": 1024,
    "count": 0,
    "send_duration": "0s",
    "verbose": false
  },
  "server": {
    "server_addr": "10.0.0.2",
    "client_addrs": "10.0.0.1",
    "tos": 64,
    "client_port_range": "43500,43599",
    "server_port_range": "43600,43609",
    "rate_in_span": 5000,
    "span": "1s",
    "delay": "3s",
    "msg_len": 1024,
    "verbose": false
  }
}

7. Client 配置

字段类型默认值说明
client_addrstring""客户端 IP 地址(本机)
server_addrsstring""服务端 IP 地址,多个用逗号分隔
tosint0IP TOS/DSCP 值
client_port_rangestring""客户端源端口范围,格式 min,max
server_port_rangestring""服务端目的端口范围,格式 min,max
rate_in_spanint640每个 span 内的发包速率(pps)
spanstring"0s"统计时间窗口,Go duration 格式(如 1s5s
delaystring"0s"统计处理延迟,等待在途报文(如 3s
msg_lenint0消息体大小(不含 32 字节头部)
countint0最大发包数(0 = 不限制)
send_durationstring"0s"最大发送时长(0 = 不限制)
verboseboolfalse丢包时打印详细端口信息
Tip:baize 的 Client 设置了 ExitOnReachLimit=false,即使配置了 countsend_duration

多 Server 探测

server_addrs 支持逗号分隔的多个地址,Client 会同时向所有 Server 发送探测报文:

{
  "client": {
    "client_addr": "10.0.0.1",
    "server_addrs": "10.0.0.2,10.0.0.3,10.0.0.4"
  }
}

8. Server 配置

字段类型默认值说明
server_addrstring""服务端监听 IP 地址(本机)
client_addrsstring""允许的客户端 IP 地址,多个用逗号分隔
tosint0IP TOS/DSCP 值
client_port_rangestring""客户端源端口范围,格式 min,max
server_port_rangestring""服务端监听端口范围,格式 min,max
rate_in_spanint640每个 span 内的发包速率
spanstring"0s"统计时间窗口
delaystring"0s"统计处理延迟
msg_lenint0消息体大小
verboseboolfalse丢包时打印详细端口信息
Note:Server 配置中 client_addrs 用于过滤和识别合法的 Client 报文。多个地址用逗号分隔。

9. 使用示例

基本部署:仅 Client

{
  "log_dir": "/var/log/baize",
  "client": {
    "client_addr": "10.0.0.1",
    "server_addrs": "10.0.0.2",
    "rate_in_span": 5000,
    "span": "1s",
    "delay": "3s"
  }
}

基本部署:仅 Server

{
  "log_dir": "/var/log/baize",
  "server": {
    "server_addr": "10.0.0.2",
    "client_addrs": "10.0.0.1",
    "rate_in_span": 5000,
    "span": "1s",
    "delay": "3s"
  }
}

互探模式:双向监控

两台机器各自运行 baize,互为 Client 和 Server,实现双向网络质量监控:

# 机器 A (10.0.0.1) 的配置
{
  "pprof_addr": ":6060",
  "log_dir": "/var/log/baize",
  "log_max_age_days": 7,
  "client": {
    "client_addr": "10.0.0.1",
    "server_addrs": "10.0.0.2",
    "rate_in_span": 5000,
    "span": "1s",
    "delay": "3s",
    "msg_len": 1024,
    "tos": 64
  },
  "server": {
    "server_addr": "10.0.0.1",
    "client_addrs": "10.0.0.2",
    "rate_in_span": 5000,
    "span": "1s",
    "delay": "3s",
    "msg_len": 1024,
    "tos": 64
  }
}

高精度探测:多端口 + 高速率

{
  "client": {
    "client_addr": "10.0.0.1",
    "server_addrs": "10.0.0.2",
    "client_port_range": "43500,43599",
    "server_port_range": "43600,43609",
    "rate_in_span": 10000,
    "span": "1s",
    "delay": "3s",
    "msg_len": 1024,
    "tos": 128
  }
}

多目标探测

{
  "client": {
    "client_addr": "10.0.0.1",
    "server_addrs": "10.0.0.2,10.0.0.3,10.0.0.4",
    "rate_in_span": 5000,
    "span": "1s",
    "delay": "3s"
  }
}

调试模式:开启 pprof + verbose

{
  "pprof_addr": ":6060",
  "log_dir": "/var/log/baize",
  "client": {
    "client_addr": "10.0.0.1",
    "server_addrs": "10.0.0.2",
    "rate_in_span": 5000,
    "span": "1s",
    "delay": "3s",
    "verbose": true
  }
}

启动后可通过 pprof 分析运行时状态:

# 查看 goroutine 状态
go tool pprof http://localhost:6060/debug/pprof/goroutine

# 查看 CPU profile
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30

# 查看内存分配
go tool pprof http://localhost:6060/debug/pprof/heap

10. 日志管理

当配置了 log_dir 时,baize 会将日志写入文件并自动管理轮转和清理:

日志文件命名

/var/log/baize/
├── baize.log          # symlink → 指向当天日志
├── baize.log.20260601 # 6月1日日志
├── baize.log.20260602 # 6月2日日志
├── baize.log.20260603 # 6月3日日志
└── baize.log.20260604 # 6月4日日志(当天)

轮转机制

  • 按天轮转:每天零点后首次写入时自动创建新日志文件。
  • symlink 更新:baize.log 始终指向当天日志文件,方便实时查看(tail -f baize.log)。
  • 自动清理:超过 log_max_age_days 的日志文件在轮转时自动删除。

配置示例

{
  "log_dir": "/var/log/baize",
  "log_max_age_days": 7
}
Tip:如果 log_dir 为空,日志输出到 stderr,适合容器化部署中由日志收集器统一采集。
Note:log_max_age_days 设为 0 或负数时,默认保留 7 天。清理仅在日志轮转时触发,不会在运行中频繁检查。

11. FAQ

Q: baize 和 bitflip 该选哪个?

临时探测用 bitflip(命令行参数,开箱即用);长期持续监控用 baize(配置文件驱动,内置日志轮转和 pprof)。

Q: 可以在同一台机器上同时运行 Client 和 Server 吗?

可以。baize 支持在配置文件中同时配置 clientserver,它们会在同一进程中以独立 goroutine 运行。注意端口范围不能冲突。

Q: 配置文件修改后需要重启吗?

是的,baize 不支持热加载配置。修改配置文件后需要重启进程。推荐使用 systemd 等进程管理工具:

sudo systemctl restart baize

Q: 如何优雅停止 baize?

发送 SIGINT (Ctrl+C) 或 SIGTERM 信号。程序会取消所有 goroutine 并等待 1 秒让在途报文回来后退出。如果使用 systemd,systemctl stop baize 会发送 SIGTERM。

Q: 为什么 Client 需要 sudo?

Client 需要设置 socket 的 IP_TOS 选项来标记 DSCP 值,某些系统需要特权才能设置非默认 TOS。

Q: 如何查看运行时性能数据?

配置 pprof_addr 后,可通过 Go pprof 工具分析 goroutine、CPU、内存等性能数据。详见"使用示例 - 调试模式"章节。

Q: server_addrs 和 client_addrs 支持多个地址吗?

支持,用逗号分隔。例如 "server_addrs": "10.0.0.2,10.0.0.3"。Client 会向所有列出的 Server 发送探测。

Q: duration 格式支持哪些?

使用 Go 的 time.ParseDuration 格式,如 "1s""5s""1m""1h"。无效格式会被忽略并打印警告日志。

Q: 日志文件会无限增长吗?

不会。日志按天轮转,超过 log_max_age_days(默认 7 天)的日志会在轮转时自动删除。