数据库集群内存 stream 性能问题
1.问题现象
18台服务器集群 gpcheckperf 全套测试各节点出现stream 性能不一致的情况,磁盘性能,网络性能正常。且测试数据在500G的时候,性能也正常,测试数据在1T,2T时,stream最大 (15000 MB/s)和最小 (6000MB/s)相差一倍左右。
2.现场分析过程
a)对测试工具拆解,单独测试内存 stream, 删除磁盘, 网络测试项,stream性能在500G,1T,2T时均测试正常
b)修改 内存,网络,磁盘的测试顺序, 发现只要stream 在disk 前测试性能,就能复现集群 stream 不稳定问题。
3.猜测
所以当时的第一个怀疑的集群硬件配置不一致,或者软件配置不一致。有的机器关闭了NUMA。 当时在客户现场找的客户 BMC 的管理。 确认所有机器的配置,以及所有机器的物理配置(主板型号)是否一致,但是当时18台机器,一台台手动操作遭到客户的严厉抵制。 认为我们在家里就应该可以确认好配置,而不是在这里浪费他的时间(这块需要吸取经验)。 后面通过家里销售确认集群物理配置完全一样。 通过测试 stream数据,仍然
是跨NUMA 访问远端内存为最大可能,。stream最大值 15000就是正常值, 最小值多次测试都是6000多,也不会太小。跨NUMA访问内存性能和最小值匹配。挑选了三台测试 stream 性能低的配置,确认NUMA已经打开, 理论上会优先访问本地内存。不存在访问远端内存的情况。
4.观察
再次观察 gpcheckperf 全套2T数据测试,默认测试顺序为 disk->stream->network. 确认在disk 测试完成后,cache 占比较大(达到980多G), free内存余量只有14左右, 但是这14G是操作系统预留自己用的内存,使用vm.min_free_kbytes表示大小可调整,防止cache或者malloc占用全部。(系统可能需要内存分配以确保系统本身的正常运行。如果内核允许分配所有内存,则在需要内存进行常规操作以保持操作系统平稳运行时,它可能会遇到困难。这就是内核提供可调整 vm.min_free_kbytes 的原因)存在本地内存无剩余,stream测试时申请远端内存使用的情况。
Cache使用情况
佐证1:指定本地内存访问和非本地内存访问
1.测试时指定使用numactl工具指定stream本地访问内存,集群 stream 性能表现稳定,符合预期
2,指定跨NUMA 访问内存测试, 单机测试。现场集群情况也是相同。
佐证2:
在支持gpcheckperf中 stream 测试前,手动释放 cache,(# echo 3 > /proc/sys/vm/drop_caches 这样在接下来的stream测试时,有足够的内存可用,测试性能稳定。符合预期
佐证3:设置zone_reclaim_mode=1, 打开zone_reclaim模式,这样内存回收只会发生在本地节点内,测试1T,2T数据stream 性能符合预期。
zone_reclaim 模式说明:
0 关闭zone_reclaim模式,可以从其他zone或NUMA节点回收内存
1 打开zone_reclaim模式,这样内存回收只会发生在本地节点内
2 在本地回收内存时,可以将cache中的脏数据写回硬盘,以回收内存
4 在本地回收内存时,表示可以用Swap 方式回收内存
zone_reclaim官方解释:
是一种更激进的设置内存回收方法当单个zone/numa 内存不足时,保持默认值为0 / 关闭设置,内存回收可能不会发生,条件时当其他zone 满足可分配内存需求。
当工作负载是文件服务器,cache 数据的收益或者重要程度大于远端内存访问时。该值应该设置为默认值0,考虑打开该设置的情况,已知的工作负载适合分割在不同的NUMA节点,访问远端内存存在看得见的内存性能减少
总结:
通过多次对比试验,找到根因是 gpcheckperf 测试1T 2T数据时,模拟数据库的场景。为了提升性能 缓存大量数据在内存,将近占满内存,500G 数据时只占内存总量的50%。所以正常。测试大于1T时Stream测试申请了远端内存,导致部分节点内存性能低,是NUMA正常特性。 追加 OS 的内核参数,打开zone_reclaim模式,精准解决 stream 问题, 通过两轮测试对唯一相关连的磁盘性能存在一点点影响,几乎可以忽略。
附录
Stream 测试原理:
Stream 目前主流使用5.10开源版本,这个相对其他测试工具相对精简好用,首先申请a,b, c三个数组,每个数组1M个元素,每个元素为64位占8个byte, 总共需要申请3*80M内存。
分别对测试数组进行,复制,加法,乘法,组合运行,测试带宽等于处理的数据总量除以测试时间
理解NUMA :
非统一内存访问(NUMA)描述了当代多处理系统中使用的共享内存架构。NUMA是一个由多个节点组成的计算系统,当前使用的鲲鹏920服务器总共2个NUMA,1个CPU一个NUMA。每个CPU被分配自己的本地内存,当前每个CPU分配500G内存。共1T内存。并且可以从系统中的其他CPU访问内存,
NUMA是一个巧妙的系统,用于将多个中央处理单元(CPU)连接到计算机上任何数量的可用内存。单个NUMA节点通过可伸缩网络(I/O总线)连接,这样CPU就可以系统地访问与其他NUMA节点关联的内存。
本地内存是CPU在特定NUMA节点中使用的内存。外部或远程内存是CPU从另一个NUMA节点获取的内存。是物理距离决定,相对距离位CPU到内存的物理距离,是信号传输的时间。本服务器本地距离为10, 远端距离为32
本地内存访问是一个主要的优势,因为它结合了低延迟和高带宽。相比之下,访问属于任何其他CPU的内存具有更高的延迟和更低的带宽性能。

浙公网安备 33010602011771号