本文深入探讨了Solana的多阶段交易管道,并应用排队理论和控制理论进行优化。文章详细介绍了每个阶段的队列模型,如何通过动态费用底线来控制交易流量,以及保持系统稳定的条件。通过理论分析与实际应用的结合,提供了对Solana交易处理的深刻见解。
在 第1部分 中,我们建立了适用于区块链费用市场的基础排队理论概念:
M/M/1 排队:
优先级调度:
动态费用下限(接纳控制):
多服务器 M/M/k 模型:
在第2部分中,我们将这些思想应用于 Solana 的多阶段交易管道,有时将其描述为交易处理步骤的“供应链”:
sequenceDiagram
participant RPC
participant 网络接口卡
participant 验证者
participant 调度器
participant 执行线程
RPC->>网络接口卡: 发送交易
网络接口卡->>验证者: 接收交易
验证者->>验证者: 解包数据包
验证者->>验证者: 验证签名
验证者->>调度器: 添加到队列
调度器->>执行线程: 执行交易
Note over 验证者: 签名验证阶段
Note over 调度器: 等待阶段
图1. Solana 的交易管道
Solana 的交易流程涉及多个串行阶段:
RPC
交易来自于 RPC 节点,该节点将交易发送给验证者(领导者)。这可以看作是进入网络的逻辑“入口”点。
网络接口卡 (NIC)
NIC 是数据包从网络到达的地方。从排队的角度来看,我们可以将其视为系统的初始“到达”。
验证者(解包 + 签名验证)
调度器(等待阶段)
一旦签名被验证,交易就会进入调度器队列,在这里可以应用本地费用市场逻辑(即优先级规则、动态费用下限等)。这是我们排队模型中的“等待阶段”,通常标记为 $S_3$。
执行线程
调度器从其队列中提取交易并将其转发到执行线程(阶段 $S_4$)。这里是交易被实际处理和链上状态发生变化的地方。
在排队的术语中,每个阶段 $S_i$ 被建模为一个 M/M/1 排队,服务率为 $\mu_i$。交易以总的到达率 $\lambda$ 到达,必须通过 $S_1 \to S_2 \to S_3 \to S_4$。
在我们的串行 M/M/1 框架中:
阶段 $S_1$(入口/NIC):
$\mu_1$ 是网络入口 + 初始接纳的有效吞吐量。
如果到达了大量交易($\lambda$ 较高),$S_1$ 在交易甚至尚未到达签名验证之前可能会成为瓶颈。
阶段 $S_2$(签名验证):
$\mu_2$ 代表解包 + 签名验证的能力。在这一阶段的庞大积压意味着即使是高费用交易也会等待,除非在此阶段有优先调度。
阶段 $S_3$(调度器队列):
$\mu_3$ 是从等待队列中提取交易并准备执行的能力。在高负载下,调度器可以基于费用对交易进行重排序(本地费用市场逻辑)。
阶段 $S_4$(执行线程):
$\mu_4$ 是实际执行吞吐量。如果执行环境比早期阶段 slower,则会在这里形成队列,延迟最终的交易确认。
通过将 Solana 的交易“供应链”步骤视为序列图和串行队列结构,我们可以欣赏每个真实步骤如何与排队模型阶段对齐。这种与排队理论的连接澄清了:
为了使串行队列保持稳定,到达率 $\lambda$ 必须小于每个阶段的有效容量:
$$\lambda < \min(\mu_1,\;\mu_2,\;\mu_3,\;\mu_4).$$
如果某一阶段有 $\mu_i < \lambda$,该阶段将成为瓶颈并导致队列无限增长。
与第1部分一样,我们维持两类交易——类别 1(高费用,$\lambda_1$)和类别 2(低费用,$\lambda_2$)。每个阶段 $S_i$ 的每个队列实施非抢占式优先级政策,确保高费用流量在阶段空闲或任务切换时总是优先处理。然而,如果 $\lambda$ 接近或高于所有 $i$ 的 $\mu_i$,拥堵可能会压倒即使是高费用的交易。
本地费用市场不仅可以被动排队高费用流量——它还可以拒绝(或大幅延迟)支付低于某个费用下限 $f$ 的交易。通过动态调整 $f$,Solana 可以有效控制 $\lambda_2$。
实现这一点的一种简单方法是基于 阈值控制:
追踪所有阶段的队列总长度:
$$Q{\text{total}}(t) \;=\;\; \sum{i=1}^{4} Q_i(t).$$
定义两个阈值:
这种方法提供了反压力:当队列变得过长时,低费用到达($\lambda_2$)将被有效阻塞,确保 $\lambda$(总接纳负载)保持在每个 $\mu_i$ 之下。
对于更严格的方法,可以将每个阶段的队列长度 $Q_i(t)$ 和费用下限 $f(t)$ 模型作为 马尔可夫决策过程(MDP)。状态为
$$x(t) \;=\; \bigl(Q_1(t),\,Q_2(t),\,Q_3(t),\,Q_4(t),\, f(t)\bigr),$$
行动 $a(t)$ 则是提高或降低 $f(t)$ 的幅度。然后定义一个目标函数,平衡:
延迟(适用于被接纳的类别 1 和类别 2 交易),
丢弃率(被拒绝的低费用交易数量),
稳定性(确保队列不会失控)。
行动:
$$a(t) \;\in\; {f\;\pm\;\Delta_f, \; \text{无变动}}.$$
动态性:
$$Q_i(t+1) \;=\; Q_i(t) \;+\; \text{接纳的到达} \;-\; \text{在 } S_i 的服务完成.$$
成本函数:
$$J(x,a) \;=\; \alpha\, \bigl(\text{平均延迟}\bigr) \;+\; \beta\, \bigl(\text{丢弃率}\bigr),$$
其中 $\alpha,\beta>0$ 为用户定义的权重。
准确解决这样的 MDP 可能计算量很大,但 阈值 或 PID 类 控制器在实践中往往有效。
串行优先级队列的确切公式可能非常复杂。然而,Jackson 网络理论 在某些假设下提供近似或乘积形式解。对于每个队列 $S_i$:
将到达视为近似 Poisson($\lambda$)(或每个类别分别为 $\lambda_1$,$\lambda_2$)。
使用 M/M/1 排队与优先级计算来估计平均等待时间 $W{q,i,1}$ 和 $W{q,i,2}$。
将它们在各个阶段加总:
$$W{q,1} \approx \sum{i=1}^4 W{q,i,1}, \quad W{q,2} \approx \sum{i=1}^4 W{q,i,2}.$$
当 $\lambda_2$ 较大时,动态费用下限可以减少 $\lambda_2$ 以维持 $\lambda_1 + \lambda_2^{\text{eff}} < \min_i(\mu_i)$。
鉴于精确解的复杂性,Solana 开发人员可以构建模拟器:
让我们将所有内容整合在一起。
测量 $\mu_i$:基准每个阶段的最大吞吐量(NIC、签名验证、调度、执行)。
估算 $\lambda_1,\lambda_2$:识别通常分别抵达的每个“费用类别”的交易数量。
实施优先级:在每个阶段的队列中实施非抢占式优先级或排头优先级。
采用动态费用下限:
$$ f(t+1) \;=\; \begin{cases} f(t) + \Delta_f, & \text{如果 } \sum_i Q_i(t) > \Theta,\ f(t) - \Delta_f, & \text{如果 } \sum_i Q_i(t) < \theta,\ f(t), & \text{否则}. \end{cases} $$
监控与调节:
在 第1部分 中,我们明确了确保 $\lambda < \mu$(或 $\rho < 1$)的平衡对保持队列有限至关重要,并且我们看到了优先级调度加上费用下限如何 保护 高费用交易免受低费用交易洪流的影响。在第2部分中,我们将这一逻辑扩展到多个串行阶段——这是对 Solana 交易管道的现实模型。
- 原文链接: github.com/thogiti/thogi...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!