Data Grid Performance and Sizing Guide


Red Hat Data Grid 8.5

规划和大小 Data Grid 部署

Red Hat Customer Content Services

摘要

部署计划从检查 Red Hat Data Grid 用例开始,并决定哪种架构适合您的需求。在那里,您应该考虑各种性能考虑因素和用于网格功能的权衡,如数据持久性和延迟增加。当您初始部署并运行时,您可以开始对数据网格集群进行基准测试并验证您的性能预期。

Red Hat Data Grid

Data Grid 是一个高性能分布式内存数据存储。

无架构数据结构
将不同对象存储为键值对的灵活性。
基于网格的数据存储
旨在在集群中分发和复制数据。
弹性扩展
动态调整节点数量,以便在不中断服务的情况下满足需求。
数据互操作性
从不同端点在网格中存储、检索和查询数据。

Data Grid 文档

红帽客户门户网站中提供了 Data Grid 的文档。

Data Grid 下载

访问红帽客户门户上的 Data Grid 软件下载

注意

您必须有一个红帽帐户才能访问和下载数据中心软件。

使开源包含更多

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 的信息

第 1 章 Data Grid 部署模型和用例

Data Grid 提供灵活的部署模型,支持各种用例。

  • 大大提高了红帽构建的 Quarkus、红帽 JBoss EAP 和 Spring 应用程序的性能。
  • 确保服务可用性和连续性。
  • 降低操作成本。

1.1. Data Grid 部署模型

Data Grid 有两个用于缓存、远程和嵌入式的部署模型。这两种部署模型都允许应用程序访问比传统数据库系统相比,对写操作的读操作和更高吞吐量的数据访问延迟。

远程缓存
Data Grid Server 节点在专用的 Java 虚拟机(JVM)中运行。客户端使用 Hot Rod、二进制 TCP 协议或通过 HTTP 访问远程缓存。
嵌入式缓存
Data Grid 在您的 Java 应用相同的 JVM 中运行,这意味着数据存储在执行代码的内存空间中。

红帽建议用于大多数部署的服务器/客户端架构。使用远程缓存部署的时间要快得多,因为数据层与业务逻辑分开。Data Grid Server 还提供监控和可观察性和其他内置功能,以帮助您降低开发成本。

接近缓存

近端缓存功能允许远程客户端在本地存储数据,这意味着读取密集型应用程序不需要通过每个调用来遍历网络。接近缓存可显著提高读取操作的速度,并获得与嵌入式缓存相同的性能。

图 1.1. 远程缓存部署模型

1.1.1. 平台和自动化工具

实现所需的服务质量意味着为 Data Grid 提供最佳 CPU 和 RAM 资源。很少的资源会降低数据网格性能,同时使用过多的主机资源可以快速降低成本。

在对 Data Grid 集群进行基准测试和调优,以找到正确的 CPU 或 RAM 分配,但您还应考虑哪个主机平台提供了合适的自动化工具来扩展集群并有效地管理资源。

裸机或虚拟机

将 RHEL 或 Microsoft Windows 与 Red Hat Ansible 相结合,以管理数据网格配置和轮询服务,以确保可用性和实现最佳资源使用情况。

Automation Hub 提供的 Data Grid 的 Ansible 集合 自动化集群安装,并包含 Keycloak 集成和跨站点复制的选项。

OpenShift

利用 Kubernetes 编配功能自动置备 pod,对资源施加限制,并自动扩展 Data Grid 集群来满足工作负载需求。

1.2. 在线缓存

网格处理驻留在持久性存储中的所有数据的应用程序请求。

借助在线缓存,Data Grid 使用缓存加载程序和缓存存储来对持久性存储中的数据进行操作。

  • 缓存加载程序提供对持久性存储的只读访问。
  • 缓存存储提供对持久性存储的读写访问。

图 1.2. 在线缓存

1.3. 侧缓存

Data Grid 存储应用从持久性存储检索的数据,这可以减少对持久性存储的读取操作数量,并提高后续读取的响应时间。

图 1.3. 侧缓存

使用侧缓存,应用程序控制如何从持久性存储将数据添加到 Data Grid 集群中。当应用程序请求条目时,会出现以下情况:

  1. 对 Data Grid 的读取请求。
  2. 如果条目不在缓存中,应用程序会从持久性存储请求它。
  3. 应用将条目放到缓存中。
  4. 应用在下次读取时从 Data Grid 检索条目。

1.4. 分布式内存

Data Grid 使用一致的哈希技术将每个条目的固定副本数存储在集群的缓存中。通过分布式缓存,您可以线性扩展数据层,增加节点加入的容量。

分布式缓存为数据网格集群添加冗余,以提供容错和持久性保证。Data Grid 部署通常配置与持久性存储的集成,以便为安全关闭并从备份中恢复来保留集群状态。

图 1.4. 分布式缓存

1.5. 会话外部化

Data Grid 可以为在红帽构建 Quarkus、Red Hat JBoss EAP、Red Hat JBoss Web Server 和 Spring 上构建的应用程序提供外部缓存。这些外部缓存独立于应用程序层存储 HTTP 会话和其他数据。

将会话外部化到 Data Grid 为您提供了以下优点:

弹性
在扩展应用程序时消除重新平衡操作的需求。
内存占用较小
将会话数据存储在外部缓存中可减少应用程序的整体内存要求。

图 1.5. 会话外部化

1.6. 跨站点复制

Data Grid 可以在地理上分散的数据中心和跨不同云提供商运行的集群间备份数据。跨站点复制通过全局集群视图和:

  • 保证服务在停机或灾难时的连续性。
  • 为客户端应用程序提供在全局分布式缓存中对数据的单点访问。

图 1.6. 跨站点复制

第 2 章 Data Grid 部署计划

要获取 Data Grid 部署的最佳性能,您应该执行以下操作:

  • 计算数据集的大小。
  • 确定哪种类型的集群缓存模式最适合您的用例和要求。
  • 了解用于提供容错和一致性保证的数据网格功能的性能权衡和注意事项。

2.1. 性能指标注意事项

Data Grid 包括许多可配置的组合,用于决定涵盖所有用例的性能指标的单一公式。

Data Grid Performance and Sizing Guide 文档旨在提供有关用例和架构的详细信息,可帮助您确定数据网格部署的要求。

另外,请考虑以下适用于 Data Grid 的以下相关因素:

  • 云环境中的可用 CPU 和内存资源
  • 并行使用的缓存
  • get, put, query balancing
  • 峰值负载和吞吐量限制
  • 对数据集的查询限制
  • 每个缓存的条目数
  • 缓存条目的大小

根据不同组合和未知外部因素的数量,提供满足所有 Data Grid 用例的性能计算。如果前面列出的任何因素都不同,则无法将一个性能测试与另一个测试进行比较。

您可以使用 Data Grid CLI 运行基本性能测试,该测试收集有限的性能指标。您可以自定义性能测试,以便测试结果可能会满足您的需要。测试结果提供基准指标,可帮助您确定数据网格缓存要求的设置和资源。

测量您当前的设置的性能,并检查它们是否满足您的要求。如果没有满足您的需求,请优化设置,然后重新衡量其性能。

2.2. 如何计算数据集的大小

规划数据网格部署涉及计算数据集的大小,然后减少正确数量的节点和 RAM 大小来保存数据集。

您可以使用这个公式粗略估算数据集的总大小:

Data set size = Number of entries * (Average key size + Average value size + Memory overhead)
Copy to Clipboard Toggle word wrap
注意

使用远程缓存时,您需要以 marshalled 格式计算密钥大小和值大小。

分布式缓存中的数据设置大小

分布式缓存需要一些额外的计算来确定数据集大小。

在正常操作条件中,分布式缓存为每个键/值条目存储多个副本,它们等于您配置的 所有者数。在集群重新平衡操作过程中,一些条目有一个额外的副本,因此您应该计算 所有者 + 1 的数量,以允许该场景。

您可以使用以下公式来调整分布式缓存数据集大小的估算:

Distributed data set size = Data set size * (Number of owners + 1)
Copy to Clipboard Toggle word wrap

计算分布式缓存的可用内存

通过分布式缓存,您可以通过添加更多节点或增加每个节点的可用内存量来增加数据集大小。

Distributed data set size <= Available memory per node * Minimum number of nodes
Copy to Clipboard Toggle word wrap

调整节点丢失容错

即使计划在集群中有固定数量的节点,您也应该考虑并非所有节点都处于集群中。分布式缓存可以容忍 数量所有者 - 1 个节点而不丢失数据,因此除了适合您的数据集外,您还可以分配许多额外节点。

Planned nodes = Minimum number of nodes + Number of owners - 1

Distributed data set size <= Available memory per node * (Planned nodes - Number of owners + 1)
Copy to Clipboard Toggle word wrap

例如,您计划存储 100万个条目,每个规模为 10KB,并为每个条目配置三个所有者以实现可用性。如果您计划为集群中的每个节点分配 4GB RAM,您可以使用以下公式来决定数据集所需的节点数:

Data set size = 1_000_000 * 10KB = 10GB
Distributed data set size = (3 + 1) * 10GB = 40GB
40GB <= 4GB * Minimum number of nodes
Minimum number of nodes >= 40GB / 4GB = 10
Planned nodes = 10 + 3 - 1 = 12
Copy to Clipboard Toggle word wrap

2.2.1. 内存开销

内存开销是 Data Grid 用来存储条目的额外内存。对内存开销的大约估计为 200 字节,即 JVM 堆内存中每个条目的 200 字节,或 down-heap 内存中每个条目的 60 字节。但是,无法预先确定每个条目添加的大量内存开销,因为每个条目添加的开销取决于多个因素。例如,将数据容器与驱除绑定会导致 Data Grid 使用额外的内存来跟踪条目。同样地配置过期时间,将时间戳元数据添加到每个条目。

查找任何类型的内存开销的唯一方法涉及 JVM 堆转储分析。当然,JVM 堆转储没有为您存储在非堆内存中的条目提供信息,但内存开销比 JVM 堆内存要低得多。

其他内存用量

除了 Data Grid 每个条目实施的内存开销外,重新平衡和索引等进程也可以增加整体内存用量。当节点加入和离开时,集群的重新平衡操作也会临时需要一些额外的容量,以防止在集群成员间复制条目时出现数据丢失。

2.2.2. JVM 堆空间分配

确定用于数据网格部署所需的内存卷,以便您有足够的数据存储容量来满足您的需求。

重要

与设置垃圾回收(GC)时间相结合分配大内存堆大小可能会影响 Data Grid 部署的性能:

  • 如果 JVM 只处理一个线程,GC 可能会阻断线程并降低 JVM 的性能。GC 可能会在部署之前运行。这个异步行为可能会导致大型 GC 暂停。
  • 如果 CPU 资源较低,GC 与部署同步运行,则 GC 可能需要更频繁地运行可能会降低部署的性能。

下表概述了为数据存储分配 JVM 堆空间的两个示例。这些示例代表了部署集群的安全估算。

Expand

仅缓存操作,如读取、写入和删除操作。

为数据存储分配 50% 的 JVM 堆空间。

缓存操作和数据处理,如查询和缓存事件监听程序。

为数据存储分配 33% 的 JVM 堆空间。

注意

根据数据存储的模式更改和使用,您可能会考虑为 JVM 堆空间设置不同的百分比,而不是任何推荐的安全估算。

在启动 Data Grid 部署前,请考虑设置安全估算。启动部署后,检查 JVM 的性能和堆空间的 occupancy。当 JVM 的数据使用和吞吐量显著提高时,您可能需要重新调整 JVM 堆空间。

安全的估计是根据假设以下常见操作在 JVM 中运行而计算的。这个列表并不完整,您可以使用执行其他操作的目的设置这些安全估算之一。

  • Data Grid 以序列化形式将对象转换为键值对。Data Grid 为缓存和持久性存储添加对。
  • Data Grid 从远程连接加密和解密缓存到客户端。
  • Data Grid 执行常规缓存查询以收集数据。
  • 数据网格以战略方式将数据划分为段,以确保在集群间有效地分布数据,即使在状态传输操作期间也是如此。
  • GC 执行更频繁的垃圾回收,因为 JVM 为 GC 操作分配了大量内存。
  • GC 动态管理和监控 JVM 堆空间中的数据对象,以确保安全地删除未使用的对象。

为数据存储分配 JVM 堆空间时,以及确定 Data Grid 部署的内存和 CPU 要求时,请考虑以下因素:

  • 集群缓存模式。
  • 段数。

    • 例如,少量的片段可能会影响服务器在节点间分发数据的方式。
  • 读取或写入操作。
  • 重新平衡要求。

    • 例如,大量线程可能会在状态传输过程中快速并行运行,但每个线程操作可能会使用更多内存。
  • 扩展集群。
  • 同步或异步复制。

大多数需要高 CPU 资源的 Data Grid 操作包括重新平衡节点,在 pod 重启后运行索引查询,以及执行 GC 操作。

off-heap 存储

Data Grid 使用对象的 JVM 堆表示来处理缓存上的读写操作,或者执行其他操作,如状态传输操作。您必须始终为 Data Grid 分配一些 JVM 堆空间,即使您将条目存储在非堆内存中。

与在 JVM 堆空间中存储的数据存储相比,Data Grid 使用的 JVM 堆内存卷要小得多。off-heap 存储的 JVM 堆内存要求使用与存储条目数相同的并发操作数进行扩展。

注意

Data Grid 使用拓扑缓存为客户端提供集群视图。

如果您从 Data Grid 集群中收到任何 OutOfMemoryError 异常,请考虑以下选项:

  • 禁用状态传输操作,如果节点加入或离开集群,可能会导致数据丢失。
  • 通过以密钥大小和节点和网段的数量来重新计算 JVM 堆空间。
  • 使用更多节点更好地管理集群的内存消耗。
  • 使用一个节点,因为这可能会使用较少的内存。但是,如果要将集群扩展到其原始大小,请考虑其影响。

2.3. 集群缓存模式

您可以将集群数据网格缓存配置为复制或分布式。

分布式缓存
通过在集群中创建每个条目的副本来最大化容量。
复制的缓存
通过在集群中的每个节点上创建所有条目的副本来提供冗余。
Read:Writes

考虑您的应用程序执行更多写入操作或更多读操作。通常,分布式缓存为写入提供最佳性能,而复制缓存则提供最佳读取性能。

要将 k1 放置到具有三个所有者的三个节点的分布式缓存中,Data Grid 写入 k1 两次。复制缓存中的相同操作意味着数据网格写入 k1 三次。每个写入复制缓存的额外网络流量量等于集群中的节点数量。在十个节点的集群上,复制缓存会导致流量增加,以便进行写入等。您可以使用带有多播的 UDP 堆栈来最小化流量。

要从复制缓存中获取 k1,每个节点都可以在本地执行读取操作。从分布式缓存中获取 k1,处理操作的节点可能需要从集群中的不同节点检索密钥,这会导致额外的网络跃点,并增加读取操作的时间。

客户端智能和近缓存

Data Grid 使用一致的哈希技术使 Hot Rod 客户端拓扑感知,并避免额外的网络跃点,这意味着读取操作的性能与复制缓存的性能相同。

热 Rod 客户端也可以使用接近缓存功能来在本地内存中保持频繁访问的条目,并避免重复读取。

提示

分布式缓存是大多数数据网格服务器部署的最佳选择。您可以获得读写操作的最佳可能性能,以及集群缩放的弹性。

数据保障

由于每个节点包含所有条目,因此复制缓存可提供比分布式缓存更多的数据丢失保护。在三个节点的集群上,两个节点可能会崩溃,且不会丢失复制缓存中的数据。

在相同的场景中,具有两个所有者的分布式缓存将会丢失数据。为了避免使用分布式缓存的数据丢失,您可以通过以声明性方式为每个条目配置更多所有者或 numOwners () 方法来增加集群中的副本数量。

当节点故障发生时重新平衡操作

节点失败后重新平衡操作可能会影响性能和容量。当节点离开集群时,Data Grid 会在剩余的成员之间复制缓存条目,以恢复配置的所有者数。这个重新平衡操作是临时的,但增加的集群流量会对性能造成负面影响。性能降级越大,节点越多。当节点保留太多时,剩余的节点可能没有足够的容量来在内存中保留所有数据。

集群扩展

Data Grid 集群根据工作负载需求水平扩展,以便更有效地使用 CPU 和内存等计算资源。为了充分利用这种弹性,您应该考虑如何扩展或缩减节点对缓存容量的影响。

对于复制缓存,每次节点加入集群时,它都会获得数据集的完整副本。将所有条目复制到每个节点会增加节点加入并限制总容量所需的时间。复制缓存永远不会超过主机可用的内存量。例如,如果您的数据集的大小为 10 GB,则每个节点必须至少有 10 GB 可用内存。

对于分布式缓存,添加更多节点会增加容量,因为集群的每个成员仅存储了数据的子集。要存储 10 GB 数据,如果所有者数为 2,则每个节点有 8 GB 的可用内存,而无需考虑内存开销。加入集群的每个额外节点都会将分布式缓存的容量增加 5 GB。

分布式缓存的容量不受底层主机可用的内存量的限制。

同步或异步复制

当主所有者向备份节点发送复制请求时,数据网格可以同步或异步通信。

Expand
复制模式对性能的影响

同步

同步复制有助于保持数据一致性,但给集群流量添加降低缓存写入吞吐量的延迟。

asynchronous

异步复制可减少延迟并增加写操作的速度,但会导致数据不一致,并降低对数据丢失的保证。

通过同步复制,数据网格会在备份节点上复制请求时通知原始节点。如果复制请求因为集群拓扑更改而失败,则数据网格会重试操作。当复制请求因为其他错误而失败时,Data Grid 会抛出客户端应用程序异常。

借助异步复制,Data Grid 不会为复制请求提供任何确认。这对应用程序的影响与所有请求都成功相同。但是,在 Data Grid 集群中,主所有者具有正确的条目,Data Grid 会将其复制到备份节点。如果主所有者崩溃,则备份节点可能没有条目的副本,或者可能没有日期副本。

集群拓扑更改也可以导致数据与异步复制不一致。例如,假设一个有多个主要所有者的 Data Grid 集群。由于网络错误或某些其他问题,一个或多个主要所有者会意外地使集群意外出现,因此 Data Grid 更新哪些节点是哪些部分的主要所有者。当发生这种情况时,有些节点理论上可以使用旧的集群拓扑,一些节点使用更新的拓扑。通过异步通信,这可能会导致一个较短的时间,其中 Data Grid 处理从以前的拓扑复制请求,并应用来自写入操作的旧值。但是,Data Grid 可以检测节点崩溃和更新集群拓扑更改,因为这种情况可能不会影响很多写入操作。

使用异步复制不能保证提高写入吞吐量,因为异步复制限制节点可在任何时间处理的备份写入数量(通过 JGroups per-sender 排序)。同步复制允许节点同时处理更多传入的写入操作,某些配置中可能会满足单个操作完成的时间,从而为您提供更高的吞吐量。

当节点发送多个请求以复制条目时,JGroups 会一次将消息发送到集群中其他节点的其余部分,这会导致每个原始节点只有一个复制请求。这意味着,Data Grid 节点可以与其他写入操作并行处理,从而从集群中的其他节点一个写入。

Data Grid 使用集群传输层中的 JGroups 流控制协议来处理对备份节点的复制请求。如果未确认的复制请求数量超过流控制阈值,使用 max_credits 属性设置(默认为 4MB),则对原始器节点上的写入操作会被阻断。这适用于同步和异步复制。

片段数

Data Grid 将数据划分为不同的片段,以便在集群间平均分配数据。即使片段分布也避免了过度加载单个节点,并使集群重新平衡操作更高效。

默认情况下,Data Grid 会为每个集群创建 256 个哈希空间片段。对于每个集群具有最多 20 个节点的部署,这个片段是理想的情况,不应更改。

对于每个集群具有超过 20 个节点的部署,增加片段的数量会增加数据的粒度,以便 Data Grid 可以更有效地在集群中分发数据。使用以下公式计算您应该配置的片段数:

Number of segments = 20 * Number of nodes
Copy to Clipboard Toggle word wrap

例如,如果集群为 30 个节点,您应该配置 600 个片段。但是,为大型集群添加更多片段通常是一个不错的想法,但这个公式应该可让您了解适合您的部署的数量。

更改 Data Grid 创建片段的数量需要完全重启集群。如果您使用持久性存储,您可能还需要使用 StoreMigrator 工具更改片段数量,具体取决于缓存存储实施。

更改片段数量也可以导致数据损坏,因此您应该谨慎,并基于从基准测试和性能监控收集的指标。

注意

Data Grid 始终将数据存储在内存中的数据。当您配置缓存存储时,Data Grid 并不总是将数据段到持久性存储中。

它依赖于缓存存储实现,但尽可能多地为缓存存储启用分段。在持久性存储中迭代数据时,分段缓存存储提高了数据性能。例如,通过基于 RocksDB 和 JDBC 字符串的缓存存储,分段可减少 Data Grid 从数据库检索的对象数量。

2.4. 管理过时数据的策略

如果 Data Grid 不是数据的主要来源,则嵌入式和远程缓存会完全过时。在规划、基准测试和调优您的数据网格部署时,为您的应用选择适当的缓存过时级别。

选择一个允许您最佳使用可用 RAM 并避免缓存丢失的级别。如果 Data Grid 在内存中没有条目,则当应用程序发送读取和写入请求时调用主存储。

缓存未命中会增加读取和写入的延迟,但在很多情况下,对主存储的调用比数据网格的性能损失要高得多。其中一个例子是将关系数据库管理系统(RDBMS)卸载到 Data Grid 集群。以这种方式部署数据网格大大降低了运行传统数据库的财务成本,因此,在缓存中容忍更高程度的陈旧条目有意义。

借助 Data Grid,您可以为条目配置最大空闲和寿命值,以保持可接受的缓存过时级别。

过期
控制 Data Grid 将条目保留在缓存中的时间,并在集群间生效。

更高的过期值意味着条目保留在内存中较长,这会增加读取操作返回过时值的可能性。较低过期值意味着缓存中存在较少的过时值,但缓存丢失的可能性更大。

为了执行过期,Data Grid 会从现有的线程池中创建一个收据器。线程的主要性能考虑是在过期运行之间配置正确的间隔。较短的间隔执行更频繁的过期,但使用更多线程。

另外,在最大闲置过期时,您可以控制 Data Grid 如何在集群中更新时间戳元数据。Data Grid 发送 touch 命令,以协调同步或异步节点间的最大闲置过期时间。使用同步复制时,您可以选择 "sync" 或 "async" touch 命令,具体取决于您首选一致性还是速度。

2.5. 使用驱除的 JVM 内存管理

RAM 是一个昂贵的资源,通常限制在可用性方面。通过从内存中删除条目,您可以管理内存用量,为常用数据赋予优先级。

驱除
控制 Data Grid 在内存中保留的数据量,并对每个节点生效。

驱除绑定数据网格缓存:

  • 条目总数,最大计数。
  • JVM 内存量,最大大小。
重要

Data Grid 根据每个节点驱除条目。因为并非所有节点都驱除与持久性存储相同的条目,以避免数据不一致。

从驱除的性能影响源自在缓存大小达到配置的阈值时,数据网格需要计算的额外处理。

驱除也可以减慢读操作速度。例如,如果读取操作从缓存存储检索条目,Data Grid 会将该条目置于内存中,然后驱除另一个条目。如果使用 passivation,此驱除过程可能会包括将新被驱除的条目写入缓存存储。发生这种情况时,读取操作不会返回值,直到驱除过程完成为止。

2.6. JVM heap 和 off-heap 内存

默认情况下,Data Grid 将缓存条目存储在 JVM 堆内存中。您可以将 Data Grid 配置为使用非堆存储,这意味着您的数据会占用受管 JVM 内存空间之外的原生内存。

下图显示了运行 Data Grid 的 JVM 进程的内存空间:

图 2.1. JVM 内存空间

JVM 堆内存

堆分为年轻而旧代,可帮助在内存中保持引用的 Java 对象和其他应用数据。GC 进程从无法访问的对象回收空间,在生成内存池中更频繁地运行。

当 Data Grid 将缓存条目存储在 JVM 堆内存中时,GC 运行可能需要更长的时间才能开始向缓存中添加数据。因为 GC 是一个密集型过程,所以更频繁地运行可能会降低应用程序性能。

off-heap 内存

off-heap 内存是 JVM 内存管理之外的原生可用内存。JVM 内存空间 图显示包含类元数据且从原生内存分配的 Metaspace 内存池。该图还代表了包含 Data Grid 缓存条目的原生内存部分。

off-heap 内存:

  • 每个条目使用较少的内存。
  • 通过避免 Garbage Collector (GC)运行来提高整体 JVM 性能。

但是,一个缺点是 JVM 堆转储不显示存储在 off-heap 内存中的条目。

2.6.1. 非堆数据存储

当您向现成缓存中添加条目时,Data Grid 会动态地为您的数据分配原生内存。

Data Grid 将每个 键的序列化字节[] 哈希到与标准 Java HashMap 类似的存储桶中。bucket 包括 Data Grid 用来查找存储在 off-heap 内存中的条目的地址指针。

重要

虽然 Data Grid 将缓存条目存储在原生内存中,但运行时操作需要这些对象的 JVM 堆表示。例如,cache.get () 操作会在返回前将对象读取到堆内存中。同样,状态传输操作在堆内存中保存对象子集。

对象相等

Data Grid 使用每个对象的序列化字节[]表示,而不是对象实例,以非堆存储的形式确定 Java 对象的相等性。

数据一致性

Data Grid 使用数组锁定来保护非堆地址空间。锁定的数量是内核数的两倍,然后舍入到最接近的 2 的指数。这样可确保存在 ReadWriteLock 实例甚至分配,以防止写入操作阻止读操作。

2.7. 持久性存储

配置数据网格以与持久数据源交互可大大影响性能。这种性能损失源自于更传统的数据源本质上比内存缓存慢。当调用在 JVM 外部时,读取和写入操作始终会花费更长的时间。根据您使用缓存存储的方式,但数据网格性能的减少是性能的偏移,这比访问持久性存储中的数据提高。

使用持久性存储配置 Data Grid 部署也会带来其他好处,例如,您可以为安全集群关闭保留状态。您还可以将缓存中的数据溢出到持久性存储,并获得超过内存中可用容量。例如,您可以总计有十百万个条目,同时在内存中只保留 200万个条目。

Data Grid 以直写模式或 write-behind 模式为缓存和持久存储添加键/值对。由于这些编写模式对性能有不同影响,因此在规划数据网格部署时您必须考虑它们。

Expand
编写模式对性能的影响

直写

Data Grid 同时将数据写入缓存和持久性存储,从而提高了一致性并避免出现节点故障导致的数据丢失。

直写模式的不足是同步写入会增加延迟并降低吞吐量。cache.put () 调用会导致应用程序线程等待写入持久性存储。

write-behind

Data Grid 同步将数据写入缓存,但然后向队列添加修改,以便异步执行对持久性存储的写入,这会降低写入操作的延迟。

当缓存存储无法处理写入操作数量时,Data Grid 会延迟新的写入,直到待处理写入操作的数量低于配置的修改队列大小下,这与 write-through 类似。如果存储通常足够快,但在缓存写入突发时会出现延迟激增,您可以增加修改队列大小来包含突发并减少延迟。

passivation

启用传递配置 Data Grid,仅在从内存驱除条目时将条目写入持久性存储。传递还意味着激活。对键执行读取或写入会将该密钥重新置于内存中,并将其从持久性存储中删除。在激活过程中从持久性存储中删除密钥不会阻断读取或写入操作,但它会增加外部存储的负载。

传递和激活可能会导致 Data Grid 为缓存中给定条目执行多个调用持久性存储。例如,如果一个条目在内存中不可用,Data Grid 会将它重新置于内存中,它是一个读取操作,以及从持久性存储中删除它的 delete 操作。另外,如果缓存达到大小限制,则 Data Grid 会执行另一个写入操作来传递新被驱除的条目。

使用数据预加载缓存

影响数据网格集群性能的持久性存储的另一个方面是预加载缓存。当 Data Grid 集群启动时,此功能会将缓存填充到数据,以便它们"warm",并可以直接处理读取和写入。预加载缓存可能会减慢 Data Grid 集群启动时间,如果持久性存储中的数据量大于可用 RAM 的数量,则会导致内存异常。

2.8. 集群安全性

保护您的数据并防止网络入侵是部署计划最重要的方面之一。敏感的客户详细信息会泄漏开放互联网或数据漏洞,允许黑客公开机密信息对业务声誉产生影响。

考虑到这一点,您需要可靠的安全策略来验证用户并加密网络通信。但是,您的数据网格部署性能的成本是什么?在规划期间,您应如何使用这些注意事项?

身份验证

验证用户凭证的性能成本取决于机制和协议。Data Grid 通过 Hot Rod 每一次验证凭据,同时可能针对通过 HTTP 的每个请求。

Expand
表 2.1. 身份验证机制
SASL 机制HTTP 机制性能影响

PLAIN

BASIC

PLAINBASIC 是最快的身份验证机制,但它们也是最安全的。您应该仅在与 TLS/SSL 加密结合使用 PLAINBASIC

DIGESTSCRAM

摘要

对于 Hot Rod 和 HTTP 请求,DIGEST 方案使用 MD5 哈希算法来哈希凭据,以便不以纯文本形式传输它们。如果您没有启用 TLS/SSL 加密,则使用 DIGEST 的总消耗比 PLAINBASIC 减少,但并不安全,因为 DIGEST 会受到 monkey-in-the-middle (MITM)的攻击和其他入侵。

对于 Hot Rod 端点,SCRAM 方案与具有额外级别保护的 DIGEST 类似,但需要更长时间完成的额外处理。

GSSAPI / GS2-KRB5

SPNEGO

Kerberos 服务器、密钥分发中心(KDC)处理身份验证并向用户发布令牌。Data Grid 性能得益于独立系统处理用户身份验证操作的事实。但是,这些机制可能会导致网络瓶颈,具体取决于 KDC 服务本身的性能。

OAUTHBEARER

BEARER_TOKEN

联合实施 OAuth 标准的身份提供程序,以向 Data Grid 用户发出临时访问令牌。用户使用身份服务进行身份验证,而不是直接向 Data Grid 进行身份验证,而是将访问令牌作为请求标头传递。与直接处理身份验证相比,Data Grid 的性能损失较低,以验证用户访问令牌。与 KDC 类似,实际性能影响取决于身份提供程序本身的服务质量。

EXTERNAL

CLIENT_CERT

您可以为 Data Grid 服务器提供信任存储,以便它通过比较客户端与信任存储中存在的证书来验证入站连接。

如果信任存储只包含签名证书(通常是证书颁发机构(CA)),则提供 CA 签名的证书的任何客户端都可以连接到 Data Grid。这提供了较低的安全性,并容易受到 MITM 攻击的影响,但比验证每个客户端的公共证书要快。

如果信任存储除签名证书外还包含所有客户端证书,则只有在信任存储中存在的签名证书的客户端可以连接到 Data Grid。在这种情况下,Data Grid 将来自客户端提供的证书的通用通用名称(CN)与信任存储进行比较,除了验证证书是否已签名,增加更多的开销。

Encryption

加密集群传输保护数据,因为它在节点间传递并保护您的数据网格部署免受 MITM 攻击。在加入集群时,节点会执行 TLS/SSL 握手,这会通过额外的往返增加性能损失并增加延迟。但是,当每个节点建立连接时,它会永久保留连接,假设连接永远不会处于闲置状态。

对于远程缓存,Data Grid 服务器也可以加密与客户端的网络通信。就客户端与远程缓存之间的 TLS/SSL 连接的影响是相同的。协商安全连接需要更长的时间,且需要一些额外的工作,但一旦连接建立对加密的延迟并不是数据网格性能的问题。

除了使用 TLSv1.3 外,除了偏移加密的性能丢失的唯一方法是配置 Data Grid 运行的 JVM。Java 17 的 TLS 性能现在与原生实施相比。

授权

基于角色的访问控制(RBAC)可让您限制对数据的操作,为您的部署提供额外的安全性。RBAC 是为用户访问跨 Data Grid 集群分布的数据进行最低特权策略的最佳方法。Data Grid 用户必须具有足够级别的授权才能从缓存中读取、创建、修改或删除数据。

添加另一层安全以保护您的数据将始终具有性能成本。授权为操作添加了一些延迟,因为 Data Grid 在允许用户操作数据前,会根据访问控制列表(ACL)验证每个延迟。但是,对授权的性能的影响要低于加密,因此成本通常会平衡。

2.9. 客户端监听程序

客户端监听程序会在 Data Grid 集群上添加、删除或修改任何数据时提供通知。

例如,每当给定位置上温度发生变化时,以下实现会触发事件:

@ClientListener
public class TemperatureChangesListener {
   private String location;

   TemperatureChangesListener(String location) {
      this.location = location;
   }

   @ClientCacheEntryCreated
   public void created(ClientCacheEntryCreatedEvent event) {
      if(event.getKey().equals(location)) {
         cache.getAsync(location)
               .whenComplete((temperature, ex) ->
                     System.out.printf(">> Location %s Temperature %s", location, temperature));
      }
   }
}
Copy to Clipboard Toggle word wrap

将监听程序添加到 Data Grid 集群会为您的部署添加性能注意事项。

对于嵌入式缓存,侦听器使用与 Data Grid 相同的 CPU 内核。接收许多事件并使用大量 CPU 处理这些事件可减少 Data Grid 可用的 CPU,并减慢所有其他操作。

对于远程缓存,Data Grid 服务器使用内部进程来触发客户端通知。Data Grid Server 将事件从主所有者节点发送到注册侦听器的节点,然后再将其发送到客户端。Data Grid Server 还包括一种后端机制,如果客户端监听程序处理事件太慢,则延迟写操作缓存。

过滤监听程序事件

如果在每次写入操作上调用监听程序,则数据网格可生成大量事件,在集群内和外部客户端创建网络流量。它都取决于每个监听器注册了多少个客户端、它们触发的事件类型,以及数据在 Data Grid 集群上如何更改。

作为远程缓存的示例,如果您在一个侦听器中注册了十个客户端发出 10 个事件,则数据网格服务器会完全通过网络发送 100 个事件。

您可以使用自定义过滤器提供 Data Grid 服务器,以减少到客户端的流量。过滤器允许数据网格服务器首先处理事件,并确定是否将它们转发到客户端。

持续查询和监听程序

持续查询允许您接收匹配条目的事件,并提供了部署客户端监听程序和过滤监听器事件的替代方案。当然,查询还有额外的处理成本,但如果您已经索引缓存并执行查询,则可能需要使用持续查询而不是客户端监听程序。

2.10. 索引和查询缓存

查询数据网格缓存可让您分析和过滤数据以获取实时见解。例如,假设一个在线游戏,其中 players在某种程度上相互竞争。如果您要在任意一个时间使用前十个播放器实施领导板,您可以创建一个查询来找出哪个 players 在任意一个时间都有最大点,并将结果限制为最多 10:

Query topTenQuery = playersScores
  .create("from com.redhat.PlayerScore ORDER BY p.score DESC, p.timestamp ASC")
  .maxResults(10);
List<PlayerScore> topTen = topTenQuery.execute().list();
Copy to Clipboard Toggle word wrap

前面的示例演示了使用查询的好处,因为它可让您找到与可能数百万缓存条目匹配的十个条目。

但是,在性能影响方面,您应该考虑索引操作与查询操作之间的权衡。将 Data Grid 配置为索引缓存会导致查询更快。如果没有索引,查询必须滚动缓存中的所有数据,从而根据类型和数据量来减慢结果。

启用索引时,对写入有可测量的丢失。但是,在一些小心的规划和对要索引的内容有一定的了解,您可以避免最差的影响。

最有效的方法是将 Data Grid 配置为仅索引您需要的字段。无论您存储 Plain Old Java Objects (POJO)还是使用 Protobuf 模式,您注解的更多字段都需要更长的时间来构建索引。如果您有一个带有五个字段的 POJO,但您只需要查询两个字段,请不要将 Data Grid 配置为索引您不需要的三个字段。

Data Grid 为您提供了多个选项来调优索引操作。例如,Data Grid 存储索引与数据不同,请将索引保存到磁盘而不是内存。每当添加、修改或删除条目时,Data Grid 使用索引写入器与缓存保持索引同步。如果您启用索引,然后观察较慢的写操作,并考虑索引会导致性能下降,您可以在写入磁盘前将索引保留在内存缓冲区中更长的时间。这会更快地索引操作,并有助于减少写入吞吐量降低,但消耗更多内存。对于大多数部署,但默认的索引配置适合,且不会减慢写速度。

在某些情况下,可能无法对缓存进行索引,例如,对于需要频繁查询且不需要结果的写密集型缓存。它都取决于您要实现的内容。更快的查询意味着更快的读取速度,但会牺牲索引较慢的写操作。

您可以通过正确设置 maxResultshit-count-accuracy 值来提高索引查询的性能。

2.10.1. 持续查询和数据网格性能

持续查询为应用程序提供持续的更新流,从而产生大量事件。Data Grid 会临时为它生成的每个事件分配内存,这可能会导致内存压力,并可能导致 OutOfMemoryError 异常,特别是对于远程缓存。因此,您应该仔细设计您的连续查询以避免出现性能影响。

Data Grid 强烈建议您将持续查询的范围限制为您需要的最小信息。要达到此目的,您可以使用 projections 和 predicates。例如,以下语句只提供与条件匹配的字段子集而不是整个条目的结果:

SELECT field1, field2 FROM Entity WHERE x AND y
Copy to Clipboard Toggle word wrap

还需要确保创建的每个 continuous QueryListener 可以快速处理所有接收的事件,而无需阻塞线程。要达到此目的,您应该避免任何不必要地生成事件的缓存操作。

2.11. 数据一致性

驻留在分布式系统上的数据容易受到临时网络中断、系统故障或只是简单人为错误造成的错误。这些外部因素不可控制,但可能会给数据质量造成严重后果。数据损坏的影响范围从降低客户的满意度到导致服务不可用的昂贵系统协调。

Data Grid 可以执行 ACID (atomic、consistent、isolated、durable)事务,以确保缓存状态一致。

事务是 Data Grid caries 作为单个操作的操作序列。事务中的所有写入操作都成功完成,或者全部失败。这样,事务会以一致的方式修改缓存状态,提供读取和写入的历史记录,或者根本不修改缓存状态。

启用事务的主要性能问题是在具有一致数据集和增加降低写入吞吐量的延迟之间找到平衡。

使用事务写入锁定

配置错误的锁定模式可能会对您的事务的性能造成负面影响。正确的锁定模式取决于您的数据网格部署是否有高或低键争用率。

对于具有低竞争率的工作负载,其中两个或更多个交易可能同时写入同一密钥,则最佳锁定提供了最佳性能。

在事务提交前,数据网格在键上获取写入锁定。如果键竞争,获取锁定所需的时间可能会延迟提交。另外,如果 Data Grid 检测到冲突的写入,那么它将回滚事务,应用程序必须重试,从而增加延迟。

对于具有高竞争率的工作负载,pessimistic locking 可提供最佳性能。

当应用程序访问密钥时,数据网格会在密钥上获取写锁,以确保没有其他事务可以修改密钥。事务提交在单个阶段完成,因为密钥已被锁定。带有多个关键事务的 pessimistic 锁定会导致 Data Grid 锁定密钥更长的时间,这可能会降低写入吞吐量。

读取隔离

隔离级别不会影响 Data Grid 性能考虑,除了使用 REPEATABLE_READ 进行最佳锁定。通过此组合,Data Grid 检查写入 skews 以检测冲突,这可能会导致较长的事务提交阶段。Data Grid 还使用版本元数据来检测冲突的写入操作,这可以增加每个条目的内存量,并为集群生成额外的网络流量。

事务恢复和分区处理

如果网络因分区或其他问题造成不稳定,则数据网格可以将事务标记为"in-doubt"。当数据网格保留其获取的写锁时,直到网络稳定且集群返回到正常运行状态。在某些情况下,系统管理员可能需要手动完成任何 "in-doubt" 事务。

2.12. 网络分区和降级集群

数据网格集群可能会遇到脑裂的情况,其中集群中的节点子集相互隔离,并在节点间进行通信。当发生这种情况时,Data Grid 缓存在次版本中进入 DEGRADED 模式,而大多数分区的缓存仍然可用。

注意

垃圾回收(GC)暂停是网络分区的最常见原因。当 GC 暂停导致节点变得无响应时,Data Grid 集群可以在脑裂网络中开始操作。

通过控制 JVM 堆使用量以及监控并调优 GC,而不是处理网络分区,以避免 GC 暂停。默认 G1GC 适用于大多数用例,但需要根据使用模式进行调整。一个不同的 GC 实现(如 Shenandoah )可能很有用,但如果存在多个短信对象,则可能无法正常工作。有关 Shenandoah GC 的详情,请参考 Shenandoah 垃圾收集器

CAP 理论和分区处理策略

CAP 理论上表达了分布式、键/值数据存储的限制,如 Data Grid。当发生网络分区事件时,您必须在一致性或可用性之间进行选择,而 Data Grid 修复分区并解决任何冲突的条目。

可用性
允许读取和写入操作。
一致性
拒绝读取和写入操作。

Data Grid 还可在将集群重新加入集群时进行读取。此策略是通过允许应用访问(可能过时的)数据拒绝写入条目和可用性,实现一致性的更平衡选项。

删除分区

作为将集群重新加入在一起并返回到正常操作过程的一部分,Data Grid 会根据合并策略解析冲突条目。

默认情况下,Data Grid 不会尝试解决合并冲突,这意味着集群会更快返回到健康状态,且除普通集群重新平衡之外不会有性能损失。然而,在这种情况下,缓存中的数据会更有可能不一致。

如果您配置合并策略,则数据网格修复分区所需的时间要长。配置合并策略会导致 Data Grid 从每个缓存检索条目的每个版本,然后解决以下的任何冲突:

Expand

PREFERRED_ALWAYS

Data Grid 找到集群中大多数节点上存在的值并应用它,这可以从日期值中恢复。

PREFERRED_NON_NULL

Data Grid 应用在集群中找到的第一个非null 值,该值可从日期值中恢复。

REMOVE_ALL

Data Grid 会删除任何有冲突值的条目。

2.12.1. 垃圾回收和分区处理

长时间垃圾回收(GC)时间可能会增加数据网格检测网络分区所需的时间。在某些情况下,GC 可能会导致 Data Grid 超过检测到分割的最长时间。

另外,当在分割后合并分区时,Data Grid 会尝试确认集群中存在所有节点。因为没有超时或上限应用到节点的响应时间,所以合并集群视图的操作可能会延迟。这可能会导致网络问题以及 GC 次。

GC 可以通过分区处理影响性能的另一个场景是 GC 挂起 JVM,从而导致一个或多个节点离开集群。当发生这种情况时,并在 GC 完成后暂停节点可以恢复,节点可能会没有日期或冲突的集群拓扑。

如果配置了合并策略,Data Grid 会在合并节点前尝试解决冲突。但是,只有在节点有一致的哈希不兼容时才使用合并策略。如果两个一致的哈希对于每个网段至少有一个通用所有者,则它们会兼容,如果它们至少有一个网段没有通用所有者。

当节点旧但兼容、一致的哈希时,Data Grid 会忽略日期集群拓扑,且不会尝试解决冲突。例如,如果因为垃圾回收(GC)而暂停集群中的一个节点,集群中的其他节点会从一致的哈希中删除,并将其替换为新所有者节点。如果 numOwners > 1,旧的一致的哈希和新的一致的哈希都有每个键的通用所有者,从而使它们兼容,并允许 Data Grid 跳过冲突解析过程。

2.13. 集群备份和恢复

执行跨站点复制的数据网格集群通常以整体 CPU 和内存分配为"symmetrical"。当您考虑跨站点复制大小时,主要问题是集群之间的状态传输操作的影响。

例如,NYC 中的 Data Grid 集群进入离线,客户端切换到 LON 中的 Data Grid 集群。当 NYC 中的集群恢复在线时,状态转移会从 LON 变为 NYC。此操作可防止客户端的过时读取,但对接收状态传输的集群有性能损失。

您可以在集群中分配状态传输操作所需的增加。但是,状态传输操作的性能影响完全取决于环境和因素,如数据集的类型和大小。

Active/Active 部署的冲突解析

当多个站点处理客户端请求时,Data Grid 会检测与并发写入操作冲突,称为 Active/Active 站点配置。

以下示例演示了并发写入在 LONNYC 数据中心中运行的 Data Grid 集群冲突条目:

            LON       NYC

k1=(n/a)    0,0       0,0

k1=2        1,0  -->  1,0   k1=2

k1=3        1,1  <--  1,1   k1=3

k1=5        2,1       1,2   k1=8

                 -->  2,1 (conflict)
(conflict)  1,2  <--
Copy to Clipboard Toggle word wrap

在 Active/Active 站点配置中,您不应该使用同步的备份策略,因为并发写入会导致死锁和丢失数据。借助异步备份策略(strategy=async),Data Grid 为您提供了处理并发写入的选择跨站点合并策略。

在性能方面,Data Grid 用来解决冲突的合并策略需要额外的计算,但通常不会产生显著损失。例如,默认的跨站点合并策略使用字典比较或"字符串比较",这只需要几个纳秒才能完成。

Data Grid 还为跨站点合并策略提供 XSiteEntryMergePolicy SPI。如果您确实配置 Data Grid 以解决与自定义实现冲突的冲突,您应该始终监控性能以量化任何负面影响。

注意

XSiteEntryMergePolicy SPI 调用非阻塞线程池中的所有合并策略。如果您实施阻止自定义合并策略,它可能会耗尽线程池。

您应该将复杂或阻止策略委派给不同的线程,您的实施应返回 CompletionStage,以便在其他线程中完成合并策略。

2.14. 代码执行和数据处理

分布式缓存的一个优点是,您可以利用各个主机的计算资源来更有效地执行大规模数据处理。通过在 Data Grid 上直接执行您的处理逻辑,您可以将工作负载分散到多个 JVM 实例中。您的代码还在 Data Grid 存储数据的相同内存空间中运行,这意味着您可以更快地迭代条目。

在对数据网格部署的性能影响方面,这完全取决于您的代码执行。更复杂的处理操作性能较低,因此您应该在 Data Grid 集群中运行的任何代码,并仔细规划。首先测试您的代码,并执行在较小的、示例数据集上运行的多个执行。收集一些指标后,您可以开始识别优化并了解您正在运行代码的性能影响。

一个确定的考虑是,长时间运行的进程可能会开始对正常读写操作产生负面影响。因此,您可以随时监控部署并持续评估性能。

嵌入式缓存

借助嵌入式缓存,Data Grid 提供两个 API,可让您在与数据相同的内存空间中执行代码。

ClusterExecutor API
允许您使用 Cache Manager 执行任何操作,包括迭代一个或多个缓存的条目,并为您提供基于 Data Grid 节点的处理。
CacheStream API
可让您对集合执行操作,并根据数据进行处理。

如果要在单一节点、一组节点或特定区域中的所有节点上运行操作,那么您应该使用集群执行。如果要运行一个为整个数据集保证正确结果的操作,则使用分布式流是一个更有效的选项。

集群执行

ClusterExecutor clusterExecutor = cacheManager.executor();
clusterExecutor.singleNodeSubmission().filterTargets(policy);
for (int i = 0; i < invocations; ++i) {
   clusterExecutor.submitConsumer((cacheManager) -> {
      TransportConfiguration tc =
      cacheManager.getCacheManagerConfiguration().transport();
      return tc.siteId() + tc.rackId() + tc.machineId();
   }, triConsumer).get(10, TimeUnit.SECONDS);
}
Copy to Clipboard Toggle word wrap

CacheStream

Map<Object, String> jbossValues =
cache.entrySet().stream()
     .filter(e -> e.getValue().contains("JBoss"))
     .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
Copy to Clipboard Toggle word wrap

远程缓存

对于远程缓存,Data Grid 提供了一个 ServerTask API,它可让您在 Data Grid 服务器注册自定义 Java 实现,并通过通过 Hot Rod 调用 execute () 方法或使用 Data Grid 命令行界面(CLI)来以编程方式执行任务。您只能对一个 Data Grid 服务器实例或集群中的所有服务器实例执行任务。

2.15. 客户端流量

在调整远程数据网格集群时,您需要计算条目的数量和大小,但也需要计算客户端流量的数量。数据网格需要足够的 RAM 来存储您的数据,并有足够的 CPU 来及时处理客户端读取和写入请求。

有很多不同的因素会影响延迟并确定响应时间。例如,键/值对的大小会影响远程缓存的响应时间。影响远程缓存性能的其他因素包括集群每秒请求数、客户端数量以及对写入操作的读取操作比。

第 3 章 OpenShift 上的基准测试 Data Grid

对于在 OpenShift 上运行的 Data Grid 集群,红帽建议使用 Hyperfoil 来测量性能。Hyperfoil 是一个基准测试框架,可为分布式服务提供准确的性能结果。

3.1. Data Grid 基准测试

设置并配置部署后,开始对 Data Grid 集群进行基准测试,以分析和衡量性能。基准测试显示存在限制的地方,以便您可以调整您的环境并调优您的数据网格配置,以获得最佳性能,这意味着实现最低延迟和最高吞吐量。

值得注意的是,最佳性能是持续进程,而不是最终目标。当您的基准测试显示您的数据网格部署已达到所需的性能级别时,您无法期望这些结果是固定或始终有效的。

3.2. 安装 Hyperfoil

通过创建一个 operator 订阅并下载包含命令行界面(CLI)的 Hyperfoil 分发,在 Red Hat OpenShift 上设置 Hyperfoil。

流程

  1. 通过 OpenShift Web 控制台中的 OperatorHub 创建 Hyperfoil Operator 订阅。

    注意

    Hyperfoil Operator 作为 Community Operator 提供。

    红帽没有认证 Hyperfoil Operator,且不提供对它的支持与 Data Grid 结合使用。安装 Hyperfoil Operator 时,系统会提示您确认有关社区版本的警告,然后才能继续。

  2. 从 Hyperfoil 发行页面下载最新的 Hyperfoil 版本

3.3. 创建 Hyperfoil Controller

在 Red Hat OpenShift 上实例化 Hyperfoil Controller,以便您可以使用 Hyperfoil 命令行界面(CLI)上传并运行基准测试。

先决条件

  • 创建 Hyperfoil Operator 订阅。

流程

  1. 定义 hyperfoil-controller.yaml

    $ cat > hyperfoil-controller.yaml<<EOF
    apiVersion: hyperfoil.io/v1alpha2
    kind: Hyperfoil
    metadata:
      name: hyperfoil
    spec:
      version: latest
    EOF
    Copy to Clipboard Toggle word wrap
  2. 应用 Hyperfoil Controller。

    $ oc apply -f hyperfoil-controller.yaml
    Copy to Clipboard Toggle word wrap
  3. 检索连接到 Hyperfoil CLI 的路由。

    $ oc get routes
    
    NAME        HOST/PORT
    hyperfoil   hyperfoil-benchmark.apps.example.net
    Copy to Clipboard Toggle word wrap

3.4. 运行 Hyperfoil 基准

使用 Hyperfoil 运行基准测试,为 Data Grid 集群收集性能数据。

先决条件

  • 创建 Hyperfoil Operator 订阅。
  • 在 Red Hat OpenShift 上实例化 Hyperfoil Controller。

流程

  1. 创建基准测试。

    $ cat > hyperfoil-benchmark.yaml<<EOF
    name: hotrod-benchmark
    hotrod:
     # Replace <USERNAME>:<PASSWORD> with your Data Grid credentials.
     # Replace <SERVICE_HOSTNAME>:<PORT> with the host name and port for Data Grid.
     - uri: hotrod://<USERNAME>:<PASSWORD>@<SERVICE_HOSTNAME>:<PORT>
       caches:
        # Replace <CACHE-NAME> with the name of your Data Grid cache.
        - <CACHE-NAME>
    agents:
      agent-1:
      agent-2:
      agent-3:
      agent-4:
      agent-5:
    phases:
    - rampupPut:
        increasingRate:
          duration: 10s
          initialUsersPerSec: 100
          targetUsersPerSec: 200
          maxSessions: 300
          scenario: &put
          - putData:
            - randomInt: cacheKey <- 1 .. 40000
            - randomUUID: cacheValue
            - hotrodRequest:
                # Replace <CACHE-NAME> with the name of your Data Grid cache.
                put: <CACHE-NAME>
                key: key-${cacheKey}
                value: value-${cacheValue}
    - rampupGet:
        increasingRate:
          duration: 10s
          initialUsersPerSec: 100
          targetUsersPerSec: 200
          maxSessions: 300
          scenario: &get
          - getData:
            - randomInt: cacheKey <- 1 .. 40000
            - hotrodRequest:
                # Replace <CACHE-NAME> with the name of your Data Grid cache.
                get: <CACHE-NAME>
                key: key-${cacheKey}
    - doPut:
        constantRate:
          startAfter: rampupPut
          duration: 5m
          usersPerSec: 10000
          maxSessions: 11000
          scenario: *put
    - doGet:
        constantRate:
          startAfter: rampupGet
          duration: 5m
          usersPerSec: 40000
          maxSessions: 41000
          scenario: *get
    EOF
    Copy to Clipboard Toggle word wrap
  2. 在任何浏览器中打开路由以访问 Hyperfoil CLI。
  3. 上传基准测试。

    1. 运行 upload 命令。

      [hyperfoil]$ upload
      Copy to Clipboard Toggle word wrap
    2. Select benchmark 文件,然后进入您的文件系统上的基准测试并上传该文件。
  4. 运行基准测试。

    [hyperfoil]$ run hotrod-benchmark
    Copy to Clipboard Toggle word wrap
  5. 获取基准测试结果。

    [hyperfoil]$ stats
    Copy to Clipboard Toggle word wrap

3.5. Hyperfoil 基准结果

Hyperfoil 使用 stats 命令以表格式运行基准测试的结果。

[hyperfoil]$ stats
Total stats from run <run_id>
PHASE  METRIC  THROUGHPUT  REQUESTS  MEAN  p50  p90  p99  p99.9  p99.99  TIMEOUTS  ERRORS  BLOCKED
Copy to Clipboard Toggle word wrap
Expand
表 3.1. 列描述
column描述value

阶段

对于每个运行,Hyperfoil 会在两个阶段都向 Data Grid 集群发出 GET 请求和 PUT 请求。

doGetdoPut

指标

在运行的两个阶段,Hyperfoil 会为每个 GETPUT 请求收集指标。

getDataputData

吞吐量

捕获每秒请求数。

Number

REQUESTS

捕获运行的每个阶段的操作总数。

Number

MEAN

捕获 GETPUT 操作的平均时间完成。

以毫秒为单位的时间(毫秒)

p50

记录完成请求所需的时间。

以毫秒为单位的时间(毫秒)

p90

记录完成请求所花费的时间。

以毫秒为单位的时间(毫秒)

p99

记录完成需要 99% 的请求所需的时间。

以毫秒为单位的时间(毫秒)

p99.9

记录完成 99.9% 的请求所需的时间。

以毫秒为单位的时间(毫秒)

p99.99

记录完成 99.99% 的请求所需的时间。

以毫秒为单位的时间(毫秒)

超时

捕获运行的每个阶段为操作发生的超时总数。

Number

错误

捕获运行的每个阶段发生的错误总数。

Number

阻塞

捕获被阻塞或无法完成的操作总数。

Number

法律通告

Copyright © 2024 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat