帖子
分享您的知识。
Sui 的并行交易处理的局限性是什么?
我正在设计一个高吞吐量的 dApp,想将 Sui 的并行处理推向最大. 实际限制是什么,我该如何测试它们?
- Sui
- Move
答案
14Sui 旨在通过使用水平扩展模型来支持高吞吐量和并行交易处理,该模型允许在不阻塞的情况下并行处理交易. 但是,在将 Sui 的并行事务处理推向其最大容量时,存在某些限制和注意事项.
影响 Sui 中并行事务处理的关键因素
- 对象级并发性
*Sui 使用以对象为中心的模型,其中每个对象(例如硬币、智能合约状态)都是独立处理的. *并行化发生在不冲突的对象上(即,如果没有事务访问同一个对象,则可以同时处理不同的对象).
- 如果多个事务尝试修改同一个对象或资源,则交易将发生冲突,并且一次只能处理一个事务. *实际限制:交易中涉及的独特对象越多(即状态变化越独立),Sui 能实现的并行度就越多. 但是,被多个事务访问或变异的对象将限制这些交易的吞吐量.
- 交易争用和冲突
*交易冲突发生在多个事务尝试同时访问同一个或多个资源时. Sui 通过拒绝其中一项交易来处理这些冲突,这限制了并行性.
- 为了最大限度地提高并行性,您需要将 dApp 设计为最大限度地减少争议,确保不同的交易在不同的对象上运行. *实际限制:如果许多用户与相同的对象进行交互(例如,在投票合约或贷款池等共享资源中),系统可能会出现争用,从而降低吞吐量.
3.交易类型和天然气效率
- 交易的复杂性会影响其所需的计算和气体. 复杂的交易(例如涉及智能合约执行的交易)可能效率较低,资源密集度更高,从而降低了并行性. *实际限制:对燃料或计算要求高的交易将减少可以在同一时间范围内处理的并行交易的数量.
- 验证器和网络吞吐量
*验证者的数量及其处理交易的能力是一个关键因素. 随着越来越多的验证者加入网络,Sui 可以横向扩展,但如果管理不当,每个验证者的个人处理能力可能会成为瓶颈. *网络带宽还会影响交易在验证器之间传播的速度. 高度网络拥塞或带宽不足可能会限制交易的吞吐量. *实际限制:您的dApp的吞吐量将受到验证者处理交易的能力的限制,这取决于他们的硬件、带宽和配置.
- 分片和状态分区
- Sui 依靠分片和状态分区来确保并行处理. 每个对象都分配给一个特定的分片,影响同一分片的事务需要按顺序处理,而涉及不同分片的事务可以并行处理. *实际限制:分片越精细(即对象或对象组越小),可以实现的并行度就越大. 但是,过度分区会导致更高的开销和管理状态的复杂性.
测试并行交易限额
要了解 Sui 针对您的特定 DApp 进行并行事务处理的实际限制,您应该在各种条件下对其进行测试. 你可以这样做:
- 对吞吐量和延迟进行基准测试
- 使用工具对 dApp 在不同负载下的吞吐量(每秒交易量)和延迟(每笔交易时间)进行基准测试.
- 从小规模的低争用交易开始,逐渐增加交易数量或其复杂性,以观察吞吐量和延迟的变化.
您可以使用Sui的CLI工具来模拟交易并监控系统在负载下的表现.
- 使用不同的交易组合进行测试
*独立交易:测试与不同对象交互且不冲突的交易. 这将帮助您衡量 Sui 在没有竞争的情况下处理并行处理的能力. *大量竞争的交易:引入访问相同对象的交易(例如,涉及共享状态的智能合约). 这将帮助您衡量争用如何影响吞吐量.
通过使用不同的事务混合进行测试,您可以确定并行事务处理在何时因冲突或其他瓶颈而开始降级.
3.模拟真实负载
- 使用负载测试框架(例如 JMeter、火炮或自定义脚本)在 dApp 上模拟真实负载.
- 测试当多个用户同时与该州的不同部分进行交互时 dApp 的行为.
- 这可以让你了解你的 dApp 在保持低延迟和高并行度的同时可以达到的最大吞吐量.
- 监控验证器性能
- 使用Sui 验证器仪表板或 API 来监控您的节点和网络验证器如何处理负载.
- 查看诸如交易接受率、区块处理时间和每笔交易的耗气量等指标.
- 这可以让您深入了解验证器的扩展程度以及网络问题(例如验证器容量不足)是否正在影响吞吐量.
最大化并行度的最佳实践
- 为低含量而设计:
- 确保 dApp 中的交易尽可能以独立对象为目标. 例如,如果你正在建造一个游戏竞技场,请保持单个玩家状态或战斗状态彼此隔离,以最大限度地提高并行性.
- 使用分片和状态分区:
- 将大型对象分解成较小的独立分片或分区. 例如,如果你正在构建一个DAO 投票追踪器,则可以将每张选票视为一个单独的对象,以避免选民之间的竞争.
3.尽量减少气体使用量:
- 确保您的交易节油. 需要大量计算或气体的过于复杂的操作可能会减少系统可以同时处理的交易数量.
- 监控网络和验证器运行状况:
- 确保验证器网络分布均匀,并在负载下表现良好. 增加验证器的数量并优化其性能有助于提高水平可扩展性并减少交易验证延迟.
结论
虽然 Sui 的并行事务处理旨在最大限度地提高吞吐量,但其性能受对象占用量、气体使用量、交易复杂性和网络吞吐量等因素的影响. 为了最大限度地提高并行度:
*通过设计您的 DApp 来处理独立对象,从而最大限度地减少内容. *在高负载场景下对您的 dApp 进行基准测试和测试,以确定性能瓶颈.
- 确保验证器和网络容量足以满足您的吞吐量需求.
通过遵循这些最佳实践并进行全面测试,您可以优化您的 dApp,将 Sui 的并行事务处理推向其最大容量.
Sui 的并行处理受对象依赖关系的限制——触及相同对象的事务被序列化,而独立的事务同时执行. 对于非冲突操作,理论吞吐量限制超过100K TPS,但实际性能取决于验证器硬件和网络条件. sui-benchmark
要测试您的 dApp 的限制,请使用可编程交易区块来批量执行非重叠操作,并使用工具进行基准测试. 围绕争用热点进行设计,将经常访问的状态拆分为不同的对象(例如,每个用户的子帐户),以最大限度地提高并行性.
当交易对独立对象进行操作时,Sui 的并行事务处理非常出色. 理论极限很高(实验室条件下为 100K+ TPS),但实际吞吐量取决于:
- 对象争议:修改同一个共享对象的事务是序列化的.
- 可编程交易区块 (PTB) 复杂性:带有许多命令的大型 PTB 触发了气体和大小限制.
3.时钟和事件限制:
0x2::clock
访问和事件发射受速率限制.
为了最大限度地提高并行度:
-使用精细的自有对象(例如,每个用户的状态)进行设计.
-尽量减少共享对象;拆分热点.
-使用sui tx-blocks
和sui client validate-transaction-block
测试 PTB 限制.
使用sui-perf
模拟并发、非重叠事务的自定义脚本在负载下进行测试. 监控错误 TransactionLockConflict
——这些错误表示存在瓶颈.
###隋并行执行的关键限制
-
对象依赖瓶颈 -触及同一对象的交易被序列化.
-最大吞吐量:取决于您对数据的分区程度(避免使用共享对象). -
每个交易区块的汽油限额 -默认区块气体限制:50M—100M(测试网/主网).
-每笔交易都消耗气体,从而限制了可并行化工作的总量.
3.RPC 节点吞吐量
-公共 RPC:大约 2K—4K TPS(因提供商而异).
-自托管节点:通过优化可实现 10K+ TPS.
- CPU/内存限制
-验证器节点可在 CPU 内核上并行工作.
-在理想情况下(无共享对象),32 核服务器可以处理5K+ TPS.
###如何测试你的 dApp 的极限 ####1. 使用 Localnet 进行基准测试
# Spin up a high-performance localnet
sui-test-validator --num-validators 4 --gas-limit 100000000
####2. 生成并行工作负载 使用 TS SDK 模拟流量:
// Flood the network with independent transactions
const txs = await Promise.all(
Array(1000).fill(0).map(() =>
client.transactionBlock({
transactions: [/* independent object ops */],
gasBudget: 50_000_000
})
)
);
Sui 的并行交易处理主要受以下限制:
对象所有权模型:只有涉及不相交(独立)对象的事务才能并行执行.
热门对象争用:如果许多事务访问同一个对象,它们就会序列化并成为瓶颈.
验证器硬件:吞吐量与 CPU 内核和 I/O 容量同步.
Gas + 网络延迟:气体计量和共识开销可能会限制非常高的并行度.
如何测试:
创建许多更新唯一拥有的对象(例如独立计数器)的交易.
使用 Sui 基准测试等工具对吞吐量进行基准测试.
在引入共享对象访问权限(例如单一排行榜)时观察性能下降.
提示:设计应用程序时应最大限度地减少共享对象更新,最大限度地提高不相交对象写入量,从而实现完全并行性.
将 Sui 的并行处理推向极限
Sui 的并行执行引擎在区块链吞吐量方面具有革命性,但在设计高性能 dApp 时应了解的实际局限性.
关键并行度限制
1. 对象争用瓶颈
-硬限制:~100K TPS(理论值) -实际限制:现实工作负载为 50-80K TPS -争用阈值:当超过 5% 的交易触及共享对象时,性能会降低
2. 每个验证器的硬件限制
| 资源 | 基准要求 | 高性能目标 | | --------------------------------------| ------------------| | 中央处理器 | 16 个核心 | 32 个以上内核 | | 内存 | 32GB | 64-128GB | | NVMe 存储 | 1TB | 2-4TB | | 网络 | 1 Gbps | 10 Gbps |
测试你的极限
基准测试方法
- 隔离变量:
# Test owned object throughput
sui-benchmark --workload owned-objects --tx-count 100000
# Test shared object throughput
sui-benchmark --workload shared-objects --tx-count 100000 --shared-obj-ratio 0.05
- 争用扩展测试:
for ratio in 0.01 0.05 0.1 0.2; do
sui-benchmark --shared-obj-ratio $ratio --tx-count 100000
done
现实世界的优化模式
1. 对象分片
struct HighTrafficPool has key {
shards: vector<PoolShard>
}
struct PoolShard has key {
id: UID,
// Shard-specific state
balances: Table<address, u64>
}
2. 基于纪元的处理
struct TradingEpoch has key {
id: UID,
current: EpochData, // Read-only after creation
next: EpochData // Mutable accumulation
}
3. 预写批处理
struct PendingUpdates has key {
id: UID,
updates: vector<Update>
}
// Process batch every N blocks
public entry fun flush_updates(
batch: &mut PendingUpdates,
state: &mut GlobalState
) {
// Apply all updates atomically
}
实际吞吐量目标
| 工作负载类型 | 预期 TPS | 优化策略 | | -------------------------------------| -----------------------| | 纯拥有的对象 | 50-100K | 最大限度地减少依赖关系 | | 主要拥有的对象 | 20-50K | 巧妙地分片 | | 均衡的工作负载 | 10-20K | 批量共享写入 | | 共享对象占主导地位 | 5-10K | 使用纪元/队列 |
监控争用
- 内置指标:
curl http://localhost:9184/metrics | grep "sui_execution_engine"
- 值得关注的关键指标:
-
sui_execution_engine_conflicted_transactions
-sui_execution_engine_parallel_degree
-sui_transaction_manager_shared_lock_wait_time
突破默认限制
validator.yaml
自定义验证器配置():
execution:
max_parallel_tasks: 1024 # Default: 256
shared_object_cache_size: "2GB" # Default: 500MB
- 移动代码优化:
// BAD: Serial shared access
public entry fun update_serial(obj: &mut SharedObj) { ... }
// GOOD: Partitioned access
public entry fun update_partitioned(
obj: &mut SharedObj,
partition_key: u64
) { ... }
压力测试清单
- 从 100% 拥有的对象交易开始
- 逐渐增加共享对象比例 3.监控验证器资源使用情况
- 确定争用热点
- 实现分片/分区
- 重复直到达到目标 TPS
记住:Sui 的并行性能可通过以下方式扩展: -独立对象路径的数量 -可用的硬件资源 -在 Move 代码中进行智能争用管理
Sui 的并行事务处理由其以对象为中心的数据模型支持,该模型允许非重叠事务同时执行. 但是,实际限制源于资源争用、共享对象、验证器吞吐量和交易依赖关系. 共享对象会序列化执行,因此尽量减少它们的使用是最大限度地提高并行性的关键. 吞吐量还受验证器容量的限制,尤其是在高写入负载或复杂计算下.
要测试这些限制,请使用诸如 sui bench 或自定义工作负载之类的工具来模拟具有不同对象所有权模式的真实交易量. 跟踪延迟、耗气量、失败的交易和验证器 CPU/内存使用率等指标. 在负载增加的 Testnet 或 Localnet 集群上进行基准测试,以确定瓶颈. 使用 Move 中的计数器和事件来监视内部状态,并在应用程序和网络级别进行记录. 围绕独有对象构建事务、避免不必要的依赖关系以及批量写入是有效扩展的最佳实践.
Sui 的并行事务处理围绕其以对象为中心的数据模型构建,该模型允许触摸不相交的对象集的交易并行执行. 主要限制是可以在不争用对象的情况下同时执行的事务数量,这意味着两个事务不得读取或写入同一个对象. 如果多个事务访问共享或重叠的对象,它们将被序列化,从而减少并行性. 因此,构建 dApp 以最大限度地减少共享对象的使用量对于最大限度地提高吞吐量至关重要.
另一个因素是全节点或验证器硬件的性能,例如 CPU 内核、磁盘 I/O 和内存,它们直接影响可以并行处理多少交易. Sui 中的事务调度器使用依赖关系图来优化执行顺序,但是过度争用或不良的对象设计会限制效率. 要进行测试,您可以使用 sui-benchmark 等工具或构建自定义 PTB(可编程交易区块)运行器,以模拟具有不同对象访问模式的高负载条件. 跟踪 TPS、延迟和对象锁争用等指标以发现瓶颈. 您还应该使用共享对象和动态字段进行测试,以了解它们在实际使用下如何影响吞吐量.
Sui 的并行事务处理受对象所有权和依赖关系的限制. 对独立对象进行操作的事务可以并行处理,从而最大限度地提高吞吐量. 但是,对共享对象的争用会序列化执行,从而造成瓶颈. 自有对象支持完全并行性,而共享对象需要共识协调,从而降低了速度. 理论极限取决于网络条件、对象图结构和交易多样性. 要测试性能,请使用 Sui SDK 模拟具有不同对象争用情况的工作负载,并通过 sui_executeTransactionBlock
RPC 测量吞吐量. 分析不同负载模式下的结果,以确定扩展限制.
Sui 的并行事务处理由其以对象为中心的数据模型支持,该模型允许非重叠事务同时执行. 但是,实际限制源于资源争用、共享对象、验证器吞吐量和交易依赖关系. 共享对象会序列化执行,因此尽量减少它们的使用是最大限度地提高并行性的关键. 吞吐量还受验证器容量的限制,尤其是在高写入负载或复杂计算下.
要测试这些限制,请使用诸如 sui bench 或自定义工作负载之类的工具来模拟具有不同对象所有权模式的真实交易量. 跟踪延迟、耗气量、失败的交易和验证器 CPU/内存使用率等指标. 在负载增加的 Testnet 或 Localnet 集群上进行基准测试,以确定瓶颈. 使用 Move 中的计数器和事件来监视内部状态,并在应用程序和网络级别进行记录. 围绕独有对象构建事务、避免不必要的依赖关系以及批量写入是有效扩展的最佳实践.
你知道答案吗?
请登录并分享。
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.