暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

我们的内存花了冤枉钱了吗?

白鳝的洞穴 2020-09-17
2236
现在我们大量的使用XEON的服务器,随着DIMM价格的下降,配置几个TB的内存也不是一件很奢侈的事情了。如果认真的对XEON的架构进行分析,我们会发现,哪怕就是配点内存这点小事,也是到处都是坑的。可能有朋友会说了,配个内存算啥事啊,现在X86的内存这么便宜,哪怕多买一点,顶多了就浪费点小钱而已。今天老白就和大家聊聊内存配置的那些道道。
第一次了解内存条不能瞎配是几年前搞数据库一体机的时候,当时一体机的压测性能到了某个水准就再也上不去了,在数据库层面,存储层面做了大量的优化,效果还是不明显。后来INTEL的朋友提醒我们,我们的服务器内存配置为512G,可能不平衡,改为384G试试。当时我还觉得奇怪,减少内存条性能还能提高?不过重新调整内存条后,TPCC指标确实有了10%左右的提升。
前阵子老白讨论NUMA的时候也讨论过,CPU和内存是通过内存控制器的通道来交换数据的,而DIMM内存是一条条的插到内存插槽里的,而内存插槽是连接到内存控制器上的。

比如说skylake CPU支持2个内存控制器,每个内存控制器有3个通道,每个通道可以插两条内存条。只有当内存是按照平衡的方式插入到内存插槽中的时候,服务器的内存访问性能才能达到最佳。下面是一组平衡插法的示意图:

其中5个内存条是无法达到平衡的,后面有些图省略掉了,7-11根内存条也是无法达到平衡的,12根内存条可以达到平衡。如果内存不平衡,对性能有多大影响呢?下面是一组数据:
这是8DIMM插槽的单路服务器的数据(大家注意,不是skylake是早期的CPU的数据),可以看出插2根内存条的时候,内存带宽只有35%的理论带宽,4根时候可以达到67%,6根的时候(满配)可以达到接近理论带宽,8根的时候效果最差,只有34%:

这是两路服务器(12 DIMM插槽)的数据:

从上面的数据可以看出,按照最平衡的模式配置内存,可以达到接近100%的访问带宽,而最差的情况只有1/3的访问带宽。我们配置内存的时候喜欢按照16的倍数,比如256G/512G/1TB,而从上面的测试数据看,情况十分糟糕。如果CPU是6个内存通道的,那么性能最佳的是6的倍数配置的内存条,而按照16条内存条配置的系统性能最差。我们经常看到配置了1TB内存的两路服务器,其内存带宽只能达到34%。
下面是DELL公司针对SKYLAKE的一个测试数据:

从上面的图上我们可以看出,针对任何一种SKYLAKE CPU,12条内存条和16条内存条的性能差异是相当大的。
当然实际使用的情况并不一定如上述的数据那么糟糕,有可能我们的内存带宽并不需要达到那么高,对于普通的应用来说,平时的影响并不大,不过对于内存数据库等对内存访问要求较高的系统来说,更高的内存带宽对系统性能关系重大。对于某些系统来说,提供足够的内存就可以了,那么也不用特别纠结。不过在我们做一些高性能压测的时候(比如PK数据库一体机的性能),内存平衡带来的TPCC提升是十分明显的。
在土豪家也没有余粮的年代,别在内存上花冤枉钱还是十分必要的。如果你用的是一颗6通道的CPU,那么还是尽可能按每颗CPU 12根内存条去配置内存吧。
文章转载自白鳝的洞穴,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论