feat(go): add 100k ingest hardening baseline
This commit is contained in:
105
docs/ops/100k-capacity-baseline.md
Normal file
105
docs/ops/100k-capacity-baseline.md
Normal file
@@ -0,0 +1,105 @@
|
||||
# 100K 车辆接入容量基线
|
||||
|
||||
更新时间:2026-07-03
|
||||
|
||||
## 目标
|
||||
|
||||
支撑 100,000 台车辆接入,入口服务在高连接数和高帧率下保持可观测、可背压、可恢复。
|
||||
|
||||
## 初始容量假设
|
||||
|
||||
| 项 | 目标 |
|
||||
| --- | --- |
|
||||
| 连接车辆数 | 100,000 |
|
||||
| 平均帧间隔 | 10-30 秒 |
|
||||
| 平均入口 FPS | 3,000-10,000 |
|
||||
| 短时 burst FPS | 20,000 |
|
||||
| Gateway p99 parse + enqueue | < 50ms |
|
||||
| Redis 当前态延迟 | < 3s |
|
||||
| TDengine 历史写入 lag | 可观测且 burst 后下降 |
|
||||
| MySQL 当前态 | 异步,不能阻塞 Redis |
|
||||
|
||||
## 当前生产观测
|
||||
|
||||
当前 ECS `115.29.187.205` 在低负载下健康:
|
||||
|
||||
- JT808 连接约 242。
|
||||
- GB32960 连接约 2。
|
||||
- Kafka lag 为 0。
|
||||
- NATS ack pending 为 0。
|
||||
- Redis 写入约 0ms。
|
||||
- MySQL 投影约 1-2ms。
|
||||
- ECS load 约 `0.09 / 0.15 / 0.21`。
|
||||
- 可用内存约 6.6GB。
|
||||
- 根分区使用约 37%。
|
||||
|
||||
## 当前已知缺口
|
||||
|
||||
- `net.core.somaxconn=128`,无法作为 100K 连接生产基线。
|
||||
- Gateway 默认 `TCP_MAX_CONNECTIONS` 已调整为 `120000`,生产仍可通过环境变量覆盖。
|
||||
- 已新增可重复的 TCP 连接压测工具,后续需要用它跑 10K/50K/100K 阶段测试并记录结果。
|
||||
- 仍缺按协议维度的连接生命周期、读超时、parse/publish p95/p99 直方图。
|
||||
- TDengine history writer 当前逐消息插入,后续需要批量写入。
|
||||
- Kafka topic 当前 12 分区,100K 目标下需要结合实际 FPS 再评估分区数。
|
||||
|
||||
## ECS OS 参数建议
|
||||
|
||||
100K 连接目标需要至少以下系统参数作为起点:
|
||||
|
||||
```bash
|
||||
sysctl -w net.core.somaxconn=65535
|
||||
sysctl -w net.ipv4.tcp_max_syn_backlog=65535
|
||||
sysctl -w net.ipv4.ip_local_port_range="10000 65000"
|
||||
sysctl -w net.ipv4.tcp_tw_reuse=1
|
||||
```
|
||||
|
||||
systemd gateway 已配置 `LimitNOFILE=1048576`,需要持续保持。
|
||||
|
||||
## 验收指标
|
||||
|
||||
| 层 | 指标 | 目标 |
|
||||
| --- | --- | --- |
|
||||
| Gateway | `vehicle_gateway_active_connections` | 能稳定到阶段目标连接数 |
|
||||
| Gateway | `vehicle_gateway_connection_rejections_total` | 容量目标内不增长 |
|
||||
| Gateway | `vehicle_gateway_publish_total{status="ok"}` | 持续增长 |
|
||||
| Gateway | parse/publish duration | p99 小于容量目标 |
|
||||
| NATS bridge | `vehicle_bridge_nats_consumer_ack_pending` | 稳态为 0 |
|
||||
| NATS bridge | `vehicle_bridge_nats_consumer_pending` | burst 后下降 |
|
||||
| Kafka consumers | `vehicle_*_kafka_lag` | 稳态为 0,burst 后下降 |
|
||||
| Realtime Redis | `vehicle_realtime_store_update_duration_ms{store="redis"}` | 毫秒级 |
|
||||
| Realtime MySQL | async queue depth | 不持续增长 |
|
||||
|
||||
## 分阶段压测
|
||||
|
||||
压测入口:
|
||||
|
||||
```bash
|
||||
cd /opt/lingniu-go-native/current/go/vehicle-gateway
|
||||
|
||||
# 100 连接 smoke test
|
||||
go run ./cmd/load-sim \
|
||||
-protocol jt808 \
|
||||
-addr 127.0.0.1:808 \
|
||||
-connections 100 \
|
||||
-connect-rate 100 \
|
||||
-send-interval 10s \
|
||||
-duration 2m \
|
||||
-template 0200
|
||||
```
|
||||
|
||||
1. 100 连接 smoke test。
|
||||
2. 10,000 连接保持测试。
|
||||
3. 10,000 连接 + 1 FPS/连接短测。
|
||||
4. 50,000 连接保持测试。
|
||||
5. 100,000 连接保持测试。
|
||||
6. 按真实协议分布进行混合帧率测试。
|
||||
|
||||
每一阶段必须记录:
|
||||
|
||||
- active connections
|
||||
- gateway frame/publish counters
|
||||
- NATS pending 和 ack pending
|
||||
- Kafka lag
|
||||
- Redis/MySQL/TDengine 写入耗时
|
||||
- CPU/load/memory/file descriptors
|
||||
- 错误日志
|
||||
@@ -18,6 +18,7 @@ Go 版本车辆数据接入链路已经作为生产主链路运行在 ECS `115.2
|
||||
3. Kafka raw 供 TDengine 历史、Redis 实时、MySQL 当前态/统计消费。
|
||||
4. 尽量避免 Java 老链路、Xinda 相关链路和重复存储。
|
||||
5. 解析字段只投影一次,避免 TDengine/Redis/MySQL 各自重复 flatten。
|
||||
6. 新长期目标:朝 10W 车辆生产稳定运行优化,容量基线见 `docs/ops/100k-capacity-baseline.md`。
|
||||
|
||||
## 服务和端口
|
||||
|
||||
@@ -338,4 +339,3 @@ journalctl -u lingniu-go-gateway.service --since "2 minutes ago" --no-pager | gr
|
||||
3. 读 `docs/architecture/production-data-plane-inventory.md`。
|
||||
4. 执行 `git status --short`。
|
||||
5. 如果涉及生产,先查 ECS 服务健康和最近日志。
|
||||
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
|
||||
当前生产服务、topic、表和 Redis key 的清单见 [生产数据面清单](../architecture/production-data-plane-inventory.md)。
|
||||
|
||||
10W 车辆容量目标、当前缺口和压测口径见 [100K 车辆接入容量基线](100k-capacity-baseline.md)。
|
||||
|
||||
## 服务地图
|
||||
|
||||
| 层级 | 服务 | systemd 单元 | 本机端点 |
|
||||
@@ -88,6 +90,23 @@ curl -fsS http://127.0.0.1:20200/metrics | grep vehicle_realtime_kafka_lag
|
||||
|
||||
GB32960 和 JT/T 808 的活跃连接数受上游平台连接方式影响,不能直接等同于车辆数。突然归零或持续异常下降才是信号。
|
||||
|
||||
## 压测入口
|
||||
|
||||
Go 版本提供 `cmd/load-sim` 用于阶段性连接和帧写入压测。压测生产入口前必须先确认上游真实数据窗口,避免和业务流量混淆。
|
||||
|
||||
```bash
|
||||
cd /opt/lingniu-go-native/current/go/vehicle-gateway
|
||||
|
||||
go run ./cmd/load-sim \
|
||||
-protocol jt808 \
|
||||
-addr 127.0.0.1:808 \
|
||||
-connections 100 \
|
||||
-connect-rate 100 \
|
||||
-send-interval 10s \
|
||||
-duration 2m \
|
||||
-template 0200
|
||||
```
|
||||
|
||||
## 告警阈值建议
|
||||
|
||||
| 信号 | 建议阈值 | 含义 |
|
||||
|
||||
Reference in New Issue
Block a user