使用服务限额 - AWS SimSpace Weaver

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用服务限额

本节介绍如何使用 SimSpace Weaver 的服务限额。限额也称为限制。有关服务限额的列表,请参阅 SimSpace Weaver 端点和配额。本节中的 API 来自应用程序 API 集合。应用程序 API 与服务 API 不同。应用程序 API 是 SimSpace Weaver 应用程序 SDK 的一部分。您可以在本地系统的应用程序 SDK 文件夹中找到有关应用程序 API 的文档:

sdk-folder\SimSpaceWeaverAppSdk-sdk-version\documentation\index.html

获取应用程序的限制

您可以使用 RuntimeLimits 应用程序 API 来查询应用程序的限制。

Result<Limit> RuntimeLimit(Application& app, LimitType type)
参数
Application& 应用程序

对应用程序的引用。

LimitType 类型

具有以下限制类型的枚举:

enum LimitType { Unset = 0, EntitiesPerPartition = 1, RemoteEntityTransfers = 2, LocalEntityTransfers = 3 };

以下示例查询实体计数限制。

WEAVERRUNTIME_TRY(auto entity_limit, Api::RuntimeLimit(m_app, Api::LimitType::EntitiesPerPartition)) Log::Info("Entity count limit", entity_limit.value);

获取应用程序使用的资源数量

您可以调用 RuntimeMetrics 应用程序 API 来获取应用程序使用的资源数量:

Result<std::reference_wrapper<const AppRuntimeMetrics>> RuntimeMetrics(Application& app) noexcept
参数
Application& 应用程序

对应用程序的引用。

API 会返回对包含指标的 struct 的引用。计数器指标包含一个运行总值,并且只会增加。量规指标包含一个可以增加或减少的值。每当有事件增加值时,应用程序运行时都会更新计数器。只有在您调用 API 时,运行时才会更新量规。SimSpace Weaver 保证该引用在应用程序的生命周期内有效。重复调用 API 不会更改引用。

struct AppRuntimeMetrics { uint64_t total_committed_ticks_gauge, uint32_t active_entity_gauge, uint32_t ticks_since_reset_counter, uint32_t load_field_counter, uint32_t store_field_counter, uint32_t created_entity_counter, uint32_t deleted_entity_counter, uint32_t entered_entity_counter, uint32_t exited_entity_counter, uint32_t rejected_incoming_transfer_counter, uint32_t rejected_outgoing_transfer_counter }

重置指标

ResetRuntimeMetrics 应用程序 API 会重置中的 AppRuntimeMetrics struct 中值。

Result<void> ResetRuntimeMetrics(Application& app) noexcept

以下示例演示如何在应用程序中调用 ResetRuntimeMetrics。

if (ticks_since_last_report > 100) { auto metrics = WEAVERRUNTIME_EXPECT(Api::RuntimeMetrics(m_app)); Log::Info(metrics); ticks_since_last_report = 0; WEAVERRUNTIME_EXPECT(Api::ResetRuntimeMetrics(m_app)); }

超出限制

超过限制的应用程序 API 调用将返回 ErrorCode::CapacityExceeded,但实体转移除外。作为提交和 BeginUpdate 应用程序 API 操作的一部分,SimSpace Weaver 会异步处理实体转移,因此,如果由于实体转移限制而导致转移失败,则不存在会返回错误的特定操作。要检测转移失败,可以将 rejected_incoming_transfer_counterrejected_outgoing_transfer_counter(在 AppRuntimeMetrics struct 中)的当前值与其先前值进行比较。被拒绝的实体不会出现在分区中,但应用程序仍然可以模拟它们。

内存不足

SimSpace Weaver 使用垃圾收集器进程来清理和释放浪费的内存。写入数据的速度可能超过垃圾收集器释放内存的速度。如果发生这种情况,写入操作可能会超过应用程序的预留内存限制。SimSpace Weaver 将返回内部错误,其中包含一条具有 OutOfMemory(以及其他详细信息)的消息。有关更多信息,请参阅跨时间分散写入

最佳实践

以下最佳实践是设计应用程序以避免超出限制的一般指南。这些实践可能不适用于您的特定应用程序设计。

经常监视并减慢速度

您应该经常监控自己的指标,并减慢接近限制的操作。

避免超过订阅限制和转移限制

如果可能,设计模拟以减少远程订阅和实体转移的数量。您可以使用置放群组,以便在同一个工作线程上放置多个分区,从而减少在工作线程之间进行远程实体转移的需求。

跨时间分散写入

在一个时间周期中更新的数量和大小可能会对提交事务所需的时间和内存产生重大影响。内存需求过大可能会导致应用程序运行时内存不足。您可以跨时间分散写入次数,以降低每个时间周期内更新的平均总大小。这可以帮助提高性能并避免超出限制。我们建议您在每个时间周期内的平均写入数量不要超过 12 MB,或者每个实体的平均写入数量不要超过 1.5 KB。