Skip to content

数据模型与落盘规范

数据库持久化模型

系统使用 MySQL 作为持久化后端,通过 SQLAlchemy ORM 管理 6 张核心表。表名可通过 RuntimeSettings.db_tables 配置映射(默认与 ORM __tablename__ 一致,生产环境常使用 dt_ 前缀)。

表 1:runs(运行记录)

存储每次仿真运行的元信息与生命周期状态。

字段类型约束说明
idVARCHAR(128)PK运行唯一标识,如 acceptance-e2e-20260211090035
scenario_idVARCHAR(128)NOT NULL关联场景标识
strategy_idVARCHAR(64)NOT NULL调度策略标识(如 round_robinadaptive
modeVARCHAR(32)NOT NULL, DEFAULT 'mock'运行模式:mock / gateway
statusVARCHAR(32)NOT NULL, DEFAULT 'created'当前状态(见状态转换图)
stepsINTEGERNULLABLE总步数 K
dt_secondsFLOATNULLABLE步长 ΔT(秒)
seedINTEGERNULLABLE随机种子
created_atDATETIMENOT NULL创建时间
started_atDATETIMENULLABLE启动时间
finished_atDATETIMENULLABLE结束时间
output_dirVARCHAR(512)NULLABLE文件落盘目录路径
current_stepINTEGERNULLABLE, DEFAULT 0当前执行到的步数
error_messageTEXTNULLABLE失败时的错误信息

Run 状态转换图:

created ──→ running ──→ stopping ──→ stopped
   │            │            │
   │            ├──→ finished│
   │            │            │
   └──→ failed ←┘←───────────┘

    (任何非终态均可转入 failed)

合法的状态转换矩阵(源自 repo.py:_ALLOWED_TRANSITIONS):

当前状态可转向
createdrunning, stopped, failed
runningstopping, stopped, finished, failed
stoppingstopped, finished, failed
stopped(终态)
finished(终态)
failed(终态)

表 2:run_summary(运行摘要统计)

每次 run 完成后写入的聚合摘要,与 runs 为 1:1 关系。

字段类型约束说明
run_idVARCHAR(128)PK, FK → runs.id (CASCADE)关联运行 ID
avg_throughput_bpsFLOATNULLABLE平均吞吐(bps)
avg_loss_rateFLOATNULLABLE平均丢包率
p95_delay_msFLOATNULLABLEP95 时延(ms)
trace_countINTEGERNULLABLE总 trace 条数
received_countINTEGERNULLABLE成功接收条数
updated_atDATETIMENOT NULL最后更新时间

表 3:run_events(运行事件流)

记录 run 执行过程中的关键事件,与 runs 为 1:N 关系。

字段类型约束说明
idINTEGERPK, AUTO_INCREMENT事件序号
run_idVARCHAR(128)FK → runs.id (CASCADE), NOT NULL关联运行 ID
event_typeVARCHAR(64)NOT NULL事件类型(如 step_startstep_endscheduleerror
step_idINTEGERNULLABLE关联步骤号
payload_jsonTEXTNULLABLE事件详情(JSON 格式)
created_atDATETIMENOT NULL事件产生时间

表 4:scenarios(场景配置)

存储通过 API CRUD 管理的场景定义,支持 YAML 文件导入。

字段类型约束说明
idVARCHAR(128)PK场景唯一标识
nameVARCHAR(256)NOT NULL场景名称
nodes_jsonTEXTNOT NULL, DEFAULT '[]'节点配置(JSON 数组)
traffic_jsonTEXTNOT NULL, DEFAULT '[]'业务流配置(JSON 数组)
run_config_jsonTEXTNOT NULL, DEFAULT '{}'运行参数配置(JSON 对象)
unet_config_jsonTEXTNULLABLEUNET 特有配置(JSON 对象)
created_atDATETIMENOT NULL创建时间
updated_atDATETIMENOT NULL最后更新时间

表 5:run_traces(Trace 原始事件)

存储每条消息的发送/接收事件,按 run 粒度批量写入。

字段类型约束说明
idINTEGERPK, AUTO_INCREMENT记录序号
run_idVARCHAR(128)FK → runs.id (CASCADE), NOT NULL, INDEX关联运行 ID
step_idINTEGERNOT NULL步骤号
seqINTEGERNOT NULL序列号
tx_time_msINTEGERNOT NULL发送时间戳(ms)
rx_time_msINTEGERNULLABLE接收时间戳(ms),未收到时为 NULL
srcINTEGERNOT NULL源节点 ID
dstINTEGERNOT NULL目标节点 ID
payload_bytesINTEGERNOT NULL, DEFAULT 0用户数据长度(不含 header)
receivedBOOLEANNOT NULL, DEFAULT false是否成功接收
sourceVARCHAR(32)NOT NULL, DEFAULT 'unknown'数据来源(gateway / logonly / mock

索引: ix_run_traces_run_step_seq ON (run_id, step_id, seq)

表 6:run_metrics(聚合指标)

按 step 聚合的统计指标,运行过程中逐步写入。

字段类型约束说明
idINTEGERPK, AUTO_INCREMENT记录序号
run_idVARCHAR(128)FK → runs.id (CASCADE), NOT NULL, INDEX关联运行 ID
step_idINTEGERNOT NULL步骤号
t_window_start_msINTEGERNOT NULL, DEFAULT 0窗口起始时间(ms)
t_window_end_msINTEGERNOT NULL, DEFAULT 0窗口结束时间(ms)
throughput_bpsFLOATNOT NULL, DEFAULT 0.0吞吐量(bps)
loss_rateFLOATNOT NULL, DEFAULT 0.0丢包率(0~1)
delay_p50_msFLOATNOT NULL, DEFAULT 0.0P50 时延(ms)
delay_p95_msFLOATNOT NULL, DEFAULT 0.0P95 时延(ms)
sent_countINTEGERNOT NULL, DEFAULT 0当步发送总数
recv_countINTEGERNOT NULL, DEFAULT 0当步接收总数
sync_error_msFLOATNOT NULL, DEFAULT 0.0同步误差(ms)
overhead_msFLOATNOT NULL, DEFAULT 0.0调度开销(ms)

索引: ix_run_metrics_run_step ON (run_id, step_id)

ER 关系图

                    ┌─────────────┐
                    │  scenarios   │
                    └─────────────┘

┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│ run_summary  │────→│    runs      │←────│ run_events   │
│   (1:1)      │  FK │             │  FK │   (1:N)      │
└─────────────┘     └──────┬──────┘     └─────────────┘

              ┌────────────┼────────────┐
              │ FK                      │ FK
              v                         v
     ┌─────────────┐          ┌─────────────┐
     │ run_traces   │          │ run_metrics  │
     │   (1:N)      │          │   (1:N)      │
     └─────────────┘          └─────────────┘
  • runs 是核心主表,其余 4 张表通过 run_id 外键关联(ON DELETE CASCADE)
  • scenarios 表独立存储,通过 runs.scenario_id 逻辑关联(非外键约束)

文件落盘规范

Run 目录结构(必须)

每次运行输出一个目录(作为数据库持久化的补充备份):

runs/<run_id>/
  scenario.yaml
  strategy.json
  versions.json
  schedule_decisions.csv
  traces.csv
  metrics.csv
  report.md

其中:

  • scenario.yaml:本次运行使用的场景快照
  • strategy.json:策略 id 与参数快照
  • versions.json:可复现所需的版本与环境信息
  • schedule_decisions.csv:每步的调度决策与调度开销
  • traces.csv:包级别原始事件(发送/接收)
  • metrics.csv:聚合指标(按 step 或窗口)
  • report.md:本次 run 的关键统计与图表

versions.json(最小字段)

  • git_commit:代码提交版本
  • python_version:Python 版本
  • deps:关键依赖版本(可用 pip freeze 的子集)
  • unet_cmd:UNET 启动命令(如适用)
  • unet_host / unet_port
  • scenario_id / strategy_id / seed / K / delta_t_s

Payload Header 协议(24 bytes,little-endian)

为保证跨 UNET 版本/事件字段差异时仍能稳定计算指标,发送 payload 前增加固定头部:

  • run_id:uint32
  • step_id:uint32
  • seq:uint32
  • tx_time_ms:uint64
  • src:uint16
  • dst:uint16

编码:

  • struct.pack('<IIIQHH', run_id, step_id, seq, tx_time_ms, src, dst)
  • payload = header + user_data

traces 字段说明(数据库 + CSV 对照)

数据库字段 (run_traces)CSV 旧字段名说明
tx_time_mst_tx_ms发送时间(来自 header.tx_time_ms)
rx_time_mst_rx_ms接收时间(来自系统采集或 wall-clock)
run_idrun_id运行标识
step_idstep_id步骤号
seqseq序列号
srcsrc源节点
dstdst目标节点
payload_bytespayload_len用户数据长度
receivedok是否成功接收
sourcemeta_json.source数据来源标识

metrics 字段说明(数据库 + CSV 对照)

数据库字段 (run_metrics)CSV 旧字段名说明
step_idstep_id步骤号
throughput_bpsthroughput_bps吞吐量
loss_rateloss_rate丢包率
delay_p50_msdelay_p50_msP50 时延
delay_p95_msdelay_p95_msP95 时延
sync_error_mssync_error_ms同步误差
overhead_msschedule_overhead_ms调度开销
t_window_start_ms(新增)窗口起始时间
t_window_end_ms(新增)窗口结束时间
sent_count(新增)当步发送总数
recv_count(新增)当步接收总数