内存是 SAP HANA 数据库的基本资源。了解 可用内存,SAP HANA 数据库请求、使用和管理此资源的方式 对于理解 SAP HANA 至关重要。
SAP HANA 提供了各种内存使用情况指示器,允许监视、跟踪和 提醒。最重要的指标是使用的内存和使用的峰值 memory您可以找到有关各个组件的内存消耗的详细信息,以及 通过查看内存分配器统计信息进行操作。由于 SAP HANA 包含自己的内存管理器和内存池, 外部指示器,例如主机级别的驻留内存大小和 在估算时,进程级别的虚拟内存和驻留内存可能会产生误导 SAP HANA 部署的实际内存要求。
您可以找到有关各个组件的内存消耗的详细信息,以及有关内存消耗的详细信息,请参阅 SAP HANA 许可证,请参阅有关内存大小调整和 SAP Note 1704499系统的主题 许可证审核的测量。
内存类型:概述
本主题介绍内存类型和使用的术语。 以下主题提供了更多详细信息。
HANA 系统的大小可以通过主机上安装的物理内存量来衡量。在本地系统上,这可以从 256 千兆字节 (GB) 开始 (尽管云系统可以小得多)高达几 TB,而且是 需要运行 Linux 操作系统、SAP HANA 和所有其他程序。
除了传统的 DRAM 内存外,SAP 还支持非易失性内存 (NVRAM) 已启用 HANA for DAX(直接访问)的文件系统,在 SAP HANA 中称为持久内存。持久内存结合了 DRAM 和持久闪存。它像 DRAM 一样是字节可寻址的,它可以是 被 CPU 视为 RAM,并提供了启动速度显着加快的关键优势 次。出于许可目的,适用于 PMEM 的大小调整规则与适用于 SAP HANA 的大小规则相同 只有 DRAM 的系统。SAP HANA 数据库的主要内存利用率定义为 所有非备用节点上所有服务当前消耗的主内存。
您可以通过PRODUCT_LIMIT检查 监控视图M_LICENSE。监视视图中 HOST_ACTIVE 的值 M_LANDSCAPE_HOST_CONFIGURATION指示节点是处于活动状态还是处于备用角色中。
持久内存
虽然持久内存 (PMEM) 的性能比 DRAM 慢,但它可用于 补充 HANA 系统的内存容量和功能,因此 为每台服务器提供更高的内存容量。
由于PMEM的延迟较高,因此在SAP HANA中专门用于主要数据 存储列存储,其中保存了表中大约 90% 的数据。 由于存储在 MAIN 中的数据仍然存在,因此在 系统重新启动。DELTA 存储中的数据,其中最快的性能是 必需,继续存储在 DRAM 中。
在确定系统尺寸时,可以通过评估数量来判断所需的PMEM比例 但是,系统所需的列存储主存储数据的使用 PMEM 可以有选择地应用于特定表或特定列 桌子。
请注意,可以减轻性能较慢的影响 通过使用硬件预取器等功能与 DRAM 进行比较。
有关实现详细信息和 SAP 说明2700084常见问题解答:SAP,请参阅主题“持久内存” HANA 持久内存和2786237调整 SAP HANA 与持久性 内存。
例如,您可以在系统视图M_CS_TABLES值中监视持久内存使用情况 PERSISTENT_MEMORY和PERSISTENT_MEMORY_SIZE_IN _TOTAL,另请参阅监控 “持久内存”主题的“视图”部分。
Linux 内存管理器:虚拟内存和驻留内存
Linux 操作系统为每个正在运行的程序保留内存 - 称为 它的虚拟内存,当进程请求更多时,虚拟内存会增长 操作系统中的内存,并在进程放弃未使用时收缩 记忆。当需要使用部分虚拟分配的内存时,会加载它 或映射到主机的真实物理内存并成为常驻 内存。
此映射过程由 Linux 处理,如有必要,可避免内存不足 在这种情况下,操作系统可能会换掉进程的某些驻留内存 根据最近最少使用的算法,为其他代码或数据腾出空间。 在适当大小的 SAP HANA 设备中,通常不需要进行交换。
SAP HANA 内存管理器:分配限制和已用内存
为 SAP HANA 预留的 DRAM 内存量由预定义的全局决定 分配限制,提供可用内存池 由 SAP HANA 管理。当需要更多内存时,例如用于表增长或 临时计算,SAP HANA 内存管理器从池中获取它。这 全局分配限制必须与系统的许可证一致:默认情况下 按主机上前 64 GB 可用物理内存的 90% 计算, 加上每增加 GB 的 97%。
术语“使用内存”是指虚拟内存中 当前用于代码、堆栈、表和中间结果。虽然物理 内存和分配限制随时间推移保持稳定,内存使用量持续 当 SAP HANA 内存管理器在以下情况下动态分配内存时波动 必填。分配的内存称为堆内存,其 保持分配状态,直到释放时不再需要它。您可以监控 通过查询视图M_HEAP_MEMORY的当前已用内存级别。
内存也被分配为共享内存,以支持缓存 名称服务器和索引服务器所需的基本数据。这 可以使用以下方法设置单个服务(如 IndexServer)的分配限制 配置参数 allocationlimit 在对应的 <service>.ini文件。共享内存的详细信息可在监视视图中找到 M_SHARED_MEMORY,例如 EFFECTIVE_ALLOCATION_LIMIT 和 TOTAL_MEMORY_USED_SIZE。
SAP HANA 使用的内存
SAP HANA 使用的内存总量称为已用内存。它包括 程序代码和堆栈、所有数据和系统表,以及临时所需的内存 计算。
SAP HANA 由在 Linux 操作环境中运行的多个进程组成。下 Linux,操作系统 (OS) 负责为所有进程保留内存。 当 SAP HANA 启动时,操作系统会为程序代码、程序堆栈、 和静态数据。然后,它会在请求时动态保留额外的数据内存 SAP HANA 内存管理器。动态分配的内存由堆组成 内存和共享内存。
下图显示了已用内存,包括代码、堆栈和表数据:
SAP HANA 使用的内存
由于代码和程序堆栈大小约为 6 GB,因此几乎所有使用的内存都被使用 用于表存储、计算和数据库管理。
服务使用的内存
SAP HANA 系统由多个服务组成,这些服务都消耗内存,在 特别是 indexserver 服务, 主数据库服务。索引服务器保存所有数据表和临时数据表 结果,因此在SAP HANA使用的内存中占主导地位。
峰值已用内存
归根结底,更重要的是了解已用内存随时间推移的行为 峰值负载。为此,SAP HANA有一个特殊的已用内存指示器,称为 峰值已用内存。由于已用内存的值是电流测量值,因此使用的峰值 内存允许您跟踪一段时间内已用内存的最大值。
您可以通过查询监控视图来监控当前已用内存级别M_HEAP_MEMORY 它显示了内存分配器统计信息的各种详细信息。这有一个对应的 可重置视图 (M_HEAP_MEMORY_RESET),仅显示自上次重置以来的值。 例如,您可以使用它来测试特定工作负载对内存的影响 使用情况,请重置视图:
ALTER SYSTEM RESET MONITORING VIEW "SYS"."M_HEAP_MEMORY_RESET";
然后,可以运行工作负载,然后检查新的峰值已用内存值。The RESET_TIME value 表示上次重置数据的时间。
表的内存使用情况
SAP HANA 数据库中已用内存的主要部分是数据使用的空间 表。列存储表和行存储提供单独的度量 表。如果使用持久内存 (PMEM) 来补充容量和 HANA系统的功能,在这里对MAIN的持久存储是有效的 数据。
注意
SAP HANA 数据库仅在使用时逐列加载列存储表到内存中, 这有时被称为“延迟加载”。此方法意味着 不会加载未使用的内容,避免内存浪费。SAP HANA 数据库运行时 在可分配的内存中,它试图通过卸载不重要的内存来释放一些内存 数据(如缓存),甚至是最近未使用的表列。 因此,如果精确测量总金额或最坏情况很重要 用于特定表的内存,请务必确保完全加载 表进入内存。
昂贵语句的内存使用情况
每个查询和语句都会消耗内存,用于语句计划的评估、缓存、 并且,主要是中间和最终结果的计算。虽然许多声明 执行仅使用适量的内存,例如查询 使用未经过滤的交叉连接,即使是大型系统也会带来沉重的负载。
成本高昂的语句是执行时间超过配置的单个 SQL 语句 门槛。昂贵的语句跟踪记录有关这些语句的信息 以进一步分析。如果除了激活昂贵的语句跟踪之外, 启用每条语句的内存跟踪,昂贵的语句跟踪也会显示 用于执行昂贵语句的峰值内存大小。
工作负载管理功能可用于进一步保护 SAP HANA 系统免受 由于不受控制的查询导致的内存使用过多,例如,通过限制 每个主机执行单个语句所使用的内存量 - 请参阅“设置 SQL 语句的内存限制“。
SAP HANA 内存使用情况和操作系统
由于 SAP HANA 管理内存的方式,Linux 之间的关系 内存指示器和 SAP HANA 自己的内存指示器可能不相关,因为 预期。
从Linux操作系统的角度来看,SAP HANA是一个单独的集合 过程。Linux 程序保留内存以供 Linux 操作系统使用。 程序的整个保留内存占用量称为其虚拟 内存。每个 Linux 进程都有自己的虚拟内存,当 进程从操作系统请求更多内存,并在进程收缩时 放弃未使用的内存。
虚拟、物理和驻留内存
您可以将虚拟内存大小视为进程请求的内存量(或 allocated),包括对其代码、堆栈、 程序控制下的数据和内存池。SAP HANA的虚拟内存在逻辑上是 如下图所示。尽管SAP HANA实际上由几个独立的 进程,图中显示了所有SAP HANA进程的总和:
SAP HANA 虚拟内存
当实际需要使用虚拟分配的内存的一部分时,它会加载或 映射到主机的真实物理内存并成为常驻。 物理内存是安装在主机上的 DRAM 内存。在大多数 SAP HANA 主机上,它 范围从 256 千兆字节 (GB) 到 1 TB 不等。它用于运行 Linux 操作系统、SAP HANA 和所有其他程序。
驻留内存是进程实际在操作中使用的物理内存。随着时间的流逝, 操作系统可能会根据 最近最少使用的算法,为其他代码或数据腾出空间。因此,一个过程的 驻留内存大小可能会独立于其虚拟内存大小而波动。在 适当大小的 SAP HANA 设备,有足够的物理内存进行交换 已禁用且未观察到。
这种内存使用情况可以说明如下:
SAP HANA 驻留内存
在典型的 SAP HANA 设备上,操作系统的驻留内存部分和所有 其他正在运行的程序通常不超过 2 GB。内存的其余部分是 因此专用于 SAP HANA。
当表增长或临时计算需要内存时,SAP HANA 代码 从现有内存池中获取它。当池无法满足请求时, SAP HANA 内存管理器请求并保留更多内存 系统。此时,SAP HANA 进程的虚拟内存大小会增长。
临时计算完成或删除表后,释放的内存将返回到 内存管理器,在不通知操作的情况下将其回收到其池中 系统。因此,从 SAP HANA 的角度来看,使用的内存量会缩小, 但进程的虚拟内存和驻留内存大小不受影响。这将创建一个 已用内存值可能缩小到低于 SAP HANA 大小的情况 常驻内存,这是正常的。
注意
内存管理器还可以选择将内存返回给操作系统,用于 示例,当池接近分配限制并包含大量未使用时 部件。
内存分配器统计
有关内存消耗的详细信息,可以通过查看分配器找到 统计学。
分配器统计信息跟踪单个组件和操作的内存消耗 在 SAP HANA 中,可以帮助您分析与内存消耗相关的问题。统计学 保存在系统视图M_HEAP_MEMORY(按组件分配内存)和 M_CONTEXT_MEMORY(可与连接关联的已分配内存、 语句或用户)。两个视图都具有重置功能,因此统计信息可以 捕获特定时间段。嵌入式统计服务还包括一个 跟踪每个主机的内存分配的视图:HOST_HEAP_ALLOCATORS。
有关这些内容的完整详细信息,请参阅《SAP HANA SQL 和系统视图参考》 视图。
分配器统计信息会自动保存每个核心处理器,在某些情况下 如果系统具有大量逻辑内核,则统计信息可能会消耗 大量内存。为了节省内存,可以减少统计日志记录以保存 仅针对每个节点或仅针对每个统计信息对象进行统计。使用示例 lscpu 命令检索物理和逻辑 CPU 的详细信息 体系结构在控制 CPU 消耗一节中给出。
您可以通过设置以下两种配置的值来配置此功能 global.ini文件中的参数:
-
参数 pool_statistics_striping 可以减少内存量 由特定于组件的分配器统计信息(M_HEAP_MEMORY中的行)消耗 类别为 PoolAllocator)。
-
参数composite_statistics_striping可以减少 特定于语句的分配器统计信息(行 M_CONTEXT_MEMORY)。
参数可以设置为以下值之一,可以更改配置 online,但更改只会影响新创建的统计对象:
价值 | 影响 |
---|---|
auto(默认值) | 让系统决定统计策略。默认情况下,HANA 将尝试使用 尽可能多地存储内存以获得最佳性能。 |
核心 | 系统为每个逻辑核心分配一个条带。 |
努玛 | 系统仅为每个 NUMA 节点分配一个条带。 |
没有 | 在这种情况下,系统会为每个统计信息对象创建一个条带。 |
内存大小调整
内存大小调整是预先估计内存量的过程 在 SAP HANA 数据库上运行特定工作负载所必需。要了解内存大小调整, 有几个问题需要回答。
- 必须存储在 SAP HANA 数据库中的数据表的大小是多少?
你可以 能够根据现有数据的大小来估计这一点,但除非您 精确了解现有数据的压缩比和预期的压缩比 增长因子,这个估计可能不准确。
- SAP HANA 应用于这些表的预期压缩率是多少?
专栏 SAP HANA 数据库的存储自动使用各种 高级压缩算法(字典、RLE、稀疏等)进行压缩 每个表列单独。实现的压缩比取决于许多 因素,例如数据的性质、组织和数据类型, 存在重复值,索引数(SAP HANA需要较少 索引),依此类推。
- 临时计算需要多少额外的工作内存?
金额 的额外内存取决于表的大小(表越大,表越大 中间结果表,例如连接),但更多的是 在分析的并发性和复杂性方面的预期工作量 查询(每个并发查询都需要自己的工作区)。
- 可以使用持久内存吗?
除了传统的DRAM内存外, 支持非易失性内存 (NVRAM) 在启用 DAX 的 SAP HANA 中(直接 Access) 文件系统。由于 PMEM 的延迟较高,因此在 SAP 中使用 HANA专门用于列存储的主数据存储,其中大约是 表中 90% 的数据被保存。它可以有选择地用于特定的 表或表的特定列。
- NSE 缓冲区缓存是否需要额外的内存?
如果您使用的是本机存储 扩展用于处理热数据,缓冲区缓存用于保存最近使用的数据 已从磁盘加载。默认情况下,10% 的 HANA 内存用于 缓冲区缓存,但配置参数可用于管理大小 取决于热数据集的大小。通常,缓冲区的比率 缓存到磁盘上的热数据不应小于 1 到 8(1 GB 内存) 用于 8 GB 热数据存储的缓冲区缓存)。请参阅“缓冲区缓存 大小调整指南“,以获取配置选项的详细信息和详细信息 可用。
- SAP 说明 1514966 - SAP HANA 1.0:调整 SAP 内存中数据库的大小
- SAP 说明 1637145 - SAP BW on HANA:调整 SAP In-Memory 数据库的大小
- SAP 说明 2296290 - HANA 上的 BW 的新大小调整报告
- SAP 说明 2786237 - 使用持久内存调整 SAP HANA 的大小
但是,最准确的方法是将多个代表性表导入 SAP HANA系统,测量内存需求,并从结果中推断。