SQL Server 中的内存中 OLTP 的硬件注意事项
内存中 OLTP 使用内存和磁盘的方式与传统基于磁盘的表不同。 内存中 OLTP 的性能改进取决于所使用的硬件。 在本文中,我们讨论了一些常规硬件注意事项,并提供了与内存中 OLTP 一起使用的硬件通用指南。
CPU
内存中 OLTP 不需要高端服务器来支持高吞吐量的 OLTP 工作负载。 建议使用带有两个 CPU 插槽的中端服务器。 由于内存中 OLTP 提高了吞吐量,因此两个插槽可能足以满足你的业务需求。
建议使用内存中 OLTP 打开 (SMT)。 对于一些 OLTP 工作负载,在使用 SMT 时可以看到性能提升高达 40%。
内存
所有内存优化表都完全驻留在内存中。 因此,必须具有足够的物理内存用于表本身并维持针对数据库运行的工作负载 – 所需的内存大小实际上取决于工作负载,但作为起点,需要足够的可用内存,大约为数据大小的两倍。 如果工作负载也在传统的基于磁盘的表上运行,则还需要足够的内存用于缓冲池。
若要确定给定内存优化表使用的内存量,请运行以下查询:
select object_name(object_id), * from sys.dm_db_xtp_table_memory_stats;
结果显示出用于内存优化表及其索引的内存。 表数据包括用户数据,以及运行事务仍需要或尚未被系统清理的所有旧行版本。 哈希索引使用的内存是常量,不依赖于表中的行数。
请记住,使用内存中 OLTP 时整个数据库不需要容纳于内存中。 只要热数据(即内存优化表)的大小不超过 256 GB,就可以拥有一个多 TB 的数据库并仍然可以从内存中 OLTP 中受益。 SQL Server 可以为单个数据库管理的最大检查点数据文件数为 4,000 个,每个文件为 128 MB。 虽然理论上最大值为 512 GB,但为了保证 SQL Server 能够与合并检查点文件保持同步并且不会达到 4,000 个文件的限制,我们最多支持 256 GB。 此限制仅适用于内存优化表;在同一个 SQL Server 数据库中传统的基于磁盘的表上没有此大小限制。
非持久内存优化表 (NDT),即具有 DURABILITY=SCHEMA_ONLY 的内存优化表不会保留在磁盘上。 尽管 NDT 不受检查点文件数量的限制,但其仅支持 256 GB。 本文其余部分中对日志和数据驱动器的注意事项不适用于非持久表,因为数据仅存在于内存中。
日志驱动器
与内存优化表相关的日志记录将与其他 SQL Server 日志记录一起写入数据库事务日志。
务必始终将日志文件放在具有低延迟的驱动器上,这样事务不需要等待太长时间,并且可以防止对日志 I/O 的争用。 系统与最慢组件的运行速度相同(阿姆达尔定律)。 需要确保在运行内存中 OLTP 时,日志 I/O 设备不会成为瓶颈。 建议使用低延迟的存储设备,至少使用 SSD。
内存优化表使用的日志带宽比基于磁盘的表少,因为其不记录索引操作,也不记录撤消记录。 这有助于减轻日志 I/O 争用。
数据驱动器
使用检查点文件的内存优化表的持久性使用流式处理的 I/O。 因此,这些文件不需要具有低延迟或快速随机 I/O 的驱动器。 相反,这些驱动器的主要因素是顺序 I/O 的速度和主机总线适配器 (HBA) 的带宽。 因此,无需 SSD 用于检查点文件;可以将其放置在高性能主轴(例如 SAS)上,只要其顺序 I/O 速度满足要求即可。
确定速度要求的最大因素是服务器重启时的 RTO [恢复时间目标]。 在数据库恢复期间,需要将内存优化表中的所有数据从磁盘读取到内存。 数据库恢复以 I/O 子系统的顺序读取速度发生;磁盘是瓶颈。
为了满足严格的 RTO 要求,建议通过向 MEMORY_OPTIMIZED_DATA 文件组添加多个容器,将检查点文件分布在多个磁盘上。 SQL Server 支持从多个驱动器并行加载检查点文件 - 以驱动器的聚合速度进行恢复。
在磁盘容量方面,建议可用内存优化表大小的 2 – 3 倍。