zStorage在海光CPU架构上的性能调优

news2024/12/24 20:51:52

前言

随着"信创"的东风吹遍大江南北,各家公司都开始了国产化的适配道路。zStorage团队当然也没有缺席,去年我们适配了华为的鲲鹏架构,整体性能水平达到了Intel架构的70%以上。今年我们开始着力于海光CPU架构的适配。与鲲鹏架构相比,海光的适配难度相对更小。因为海光也是x86架构,海光CPU通过与AMD的合作,获得了ZEN1架构和X86指令集的永久使用权,并且在此基础上开发了7、5、3系列处理器,分别定位于高、中、低档服务器市场。所以zStorage对于海光CPU架构的适配,主要问题不在于编译以及基本功能上,而是在于性能调优。本文打算记录zStorage在海光服务器上的性能调优过程中遇到的问题和解决方法。

image.png

调优过程

解决不能正常运行的问题

虽说海光也是x86架构,不过我们所使用的这套服务器的CPU是Hygon C86 7360 24-core Processor,并不支持AVX512等指令集。所以我们首先在海光服务器上重新编译了zStorage,解决了指令集不兼容的问题。此外还存在一个比较大的软件部署上的问题。在Intel服务器上,zStorage支持1个或者2个NUMA nodes的情况,并且2 NUMA nodes作为标准部署环境。其中ChunkServer(简称CS)运行在NUMA node 0上,FrontEnd(简称FE)运行在NUMA node 1上,这样按照NUMA亲和性部署,zStorage具有最佳的性能表现。(注:CS和FE是IO路径上的两个主要进程,直接关系到IO的性能。)

海光服务器上有两个socket,分别插了一个CPU。每个socket内部又被分为了4个DIE,所以在操作系统看来一共是8个NUMA nodes。每个NUMA node(或DIE)上有1根16GB内存。zStorage默认的2 NUMA nodes的部署方式,只能利用两个NUMA nodes的内存,由于不能充分使用多NUMA nodes的内存,达不到最佳性能部署的要求。

image.png

那么在不改软件代码的情况下,要么增加至16根内存条,这样可以达到开启2 NUMA nodes模式的条件;要么关闭NUMA模式,将所有资源聚合为单个NUMA node。为了能够快速将zStorage运行起来,关闭NUMA,使用单个NUMA node是最快的选择。

单NUMA node的性能问题

将多NUMA nodes的资源聚合为单个NUMA node的方式存在天然的性能问题。通过修改BIOS设置关闭NUMA模式,并开启内存交织访问,这种模式下,操作系统只会看见一个NUMA node。实际上会出现任何一个CPU核访问内存时,不会只访问本DIE之内的内存,而是会跨越DIE和socket交叉访问内存。这种模式下,标准性能测试(4k 7:3随机混合读写),仅为Intel架构25%的性能水平。所以还是得寻求多NUMA nodes的支持,以达到最优性能。

内存带宽基准性能测试

跨越NUMA node访问内存,性能不友好,但这仅是一个比较模糊的结论,不直观。到底跨越NUMA node性能会差到什么程度,确是没有一个定量的参考。因此,我在Intel服务器上进行了一个内存带宽的基准性能测试。(详细解读,请参考:《分布式存储性能调优 - sysbench内存带宽测试详解》《》9586190)

image.png

有了这个数据之后,对于内存带宽的真实表现,算是有了一个定量的参考。后续在海光服务器上,如果怀疑是内存带宽问题,那么可以用同样的方法,做对比测试验证。

增加内存条,开启2 NUMA nodes

在适配多NUMA nodes之前,了解zStorage在海光服务器上的最佳性能是有必要的。因此,通过将每个存储节点再增加8根内存条,然后在BIOS中设置内存在DIE间交织,即可开启2 NUMA nodes模式。这种模式下,CPU核会在socket内的4个DIE间交叉访问内存,但是不会跨越socket访问内存。简单验证了下内存带宽性能,相比Intel的测试数据,没有明显的差距,内存方面的瓶颈认为已经排除了。

image.png

实验1:ChunkServer(简称CS)绑定到NUMA node 0,使用20个逻辑核(10个物理核);FrontEnd(简称FE)绑定到NUMA node 1,使用8个逻辑核(4个物理核)。按照这个方式测试了基准性能,只有intel架构的33%,未达到预期。

实验2:将CS和FE都绑定到NUMA node 0上,CS使用17个核心,FE使用7个核心,共使用24个物理核。这块CPU上有24个物理核,48个逻辑核,在选择这24个逻辑核的时候,从每个物理核上挑一个逻辑核,确保充分发挥出CPU的性能。这种绑核方式IOPS达到了intel架构的48%。

这两个实验说明zStorage在海光服务器上,使用两个socket存在性能问题,原因暂时未知。(这里没有直接使用全部的逻辑核心,是为了保证性能测试和标准20+8的绑核模式一致。)

模块时延分析,增加IB卡

利用zStorage内置的时延分析工具(z_trace)分析模块时延,发现主要的瓶颈在于网络通信RPC模块。下发IO负载的同时,使用IB工具测试IB网络的时延,发现时延很高,说明确实是网络达到了瓶颈。停掉zStorage的进程,单独测试IB卡,发现双向带宽只有11GB/s,而同样的测试在Intel服务器上可以达到22GB/s。

继续分析发现海光服务器的PCI插槽带宽相比Intel要差。所以下一步继续加硬件,每个节点增加一张IB卡。增加IB卡以后,效果立竿见影,IOPS达到了Intel架构的62%,这个数据也不是那么难看了,毕竟国产服务器还得给它一些时间成长。

image.png

62%相比于刚开始的25%,确实看起来舒服多了。通过增加内存条来提升性能,至少可以作为一个保底方案。但是加内存的方式,性价比不那么高。最具性价比的方法是zStorage可以有效利用8个NUMA nodes的内存和CPU,达到理想的性能。

多NUMA nodes内存分配适配问题

关于多NUMA nodes适配的问题,适配的目标是CS以及FE可以从多个NUMA nodes分配内存。关于内存分配不兼容多NUMA nodes的模块,主要有两个:1)PAGE模块,即以4KB为单位的一个内存池;2)ZRPC通信模块,即存储节点之间RPC通信模块。这两个模块的改造难度不算大,两个星期之内我们便完成了改造。(这里不详细介绍改了些什么问题,因为改造的内容与性能调优关系不大。)改造之后,zStorage可以支持2个以上的NUMA nodes的情况,当然海光的8 NUMA nodes的情况也支持。

image.png

多NUMA nodes的硬件架构如上,保留两张IB卡,并还原到8根内存条。(注:为了链路冗余,使用双IB卡是标准做法,所以这里没有还原为单张IB卡。)

多numa nodes部署性能测试

解决掉上述问题以后,便进入了正题,验证多NUMA nodes适配以后的性能如何。海光服务器上有两个socket,分别插了一个CPU。每个socket内部又被分为了4个DIE,所以在操作系统看来一共是8个NUMA nodes。CPU核访问本DIE的内存性能最好,其次是访问本socket的内存性能,最差的是访问远程socket的内存性能。

针对8个NUMA nodes,zStorage是这样部署的:CS内存和CPU都绑定到Socket 0上的4个NUMA nodes;FE内存和CPU都绑定到Socket 1上的前2个NUMA nodes上。按照这个部署方式进行了基准性能测试,达到了intel架构的33%。相比于单NUMA node为25%,看起来有一些进步,但仍然不够理想。

DPDK最大NUMA nodes数量问题

通过观察各个NUMA nodes上的内存使用情况,发现了一个比较重要的问题:FE的内存并未从指定的两个NUMA nodes上分配,而是从CS所在的NUMA nodes进行了分配。这就意味着FE的内存访问效率处于最差的一种情况,不仅仅是跨越socket做内存访问,而且还会和CS竞争内存带宽资源。

通过分析DPDK源代码,我们发现RTE_MAX_NUMA_NODES在我们的代码环境被设置为4。DPDK在分配内存的时候,例如指定的NUMA node为5,由于RTE_MAX_NUMA_NODES为4,所以找不到NUMA node 5的内存池。因此,DPDK便从前4个NUMA nodes上去分配内存。这导致了FE并未从指定的NUMA node上分配内存的情况。DPDK处理这段逻辑的关键代码如图所示。

image.png

解决这个问题很简单,只需要将这个宏改为8即可。解决问题后,再次编译部署zStorage,FE的内存正常地从4-5号(NUMA node编号从0开始)NUMA nodes上分配了。再次进行基准性能测试,IOPS达到了intel架构的41%。

这个问题也是前面提到的使用两个socket部署性能问题的主要原因之一。

多NUMA nodes的优化绑核方式

优化绑核方式,即从每个物理核上选一个逻辑核(图中绿色所示),使得CS和FE达到直接使用物理核的效果。这种优化绑核方式,IOPS达到了intel架构的53%。虽然相比于16根内存条,2 NUMA nodes的模式还是要差一些,但相比于开始的25%来说提升已经很大了。这种方式已经非常具有性价比了。(为什么不关闭超线程呢?因为BIOS开启性能模式后,无法关闭超线程。)

image.png

待继续完成的优化

本文介绍了zStorage在海光架构上第一阶段的优化效果,后续还会继续第二阶段的优化,届时会将优化的经验和思路分享出来。

第二阶段的优化,可能包括以下这两个主要的点:

1)CPU和内存访问的亲和性问题,即尽量做到不跨DIE访问内存。

2)FE的内存分配在NUMA nodes之间均衡的问题等。

结语

此次海光服务器上的性能调优,从最低为intel架构的25%达到了最高的62%,提升幅度很大。主要的问题在于:

1)PCI插槽带宽问题,导致的IB卡带宽问题;

2)内存条不足,无法开启2 NUMA nodes模式;

3)DPDK最大NUMA nodes限制问题,导致内存带宽竞争问题;

4)CPU内存访问的亲和性问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2098573.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【linux学习指南】权限管理与文件访问设置方法

文章目录 📝前言🌠 bc指令🌉uname –r指令 🌠重要的几个热键[Tab],[ctrl]-c, [ctrl]-d🌉关机 🌠命令扩展🌉shell命令以及运行原理 🌠Linux权限的概念🌠 Linux权限管理&am…

善用工具:开发与效率

文章目录 常用工具Visual Studio Code(VS Code)GitDockerPostman 效率对比VS Code 与 Sublime TextGit 与 SVNDocker 与虚拟机Postman 与 cURL 近来趋势人工智能与编程工具的结合低代码与无代码平台版本控制的演进准备自适应的开发环境与新兴技术的整合 …

Linux驱动(三):字符设备驱动之杂项

目录 一、Linux设备分类二、设备号与字符设备的编码方式1.设备号2.字符设备的编码方式 三、杂项字符设备驱动的初级编写 一、Linux设备分类 Linux下一切皆文件,所有的硬件设备在Linux应用层中都会被抽象成文件,所有对硬件设备的操作到应用层中&#xff0…

电脑垃圾箱删除的东西怎么找回来?介绍四个有效方法

在日常使用电脑的过程中,‌我们可能会不小心删除一些重要文件,‌而这些文件往往会被放入垃圾箱(‌回收站)‌。‌但有时候,‌我们可能会清空垃圾箱,‌导致这些文件看似永久丢失。‌其实,‌即使垃…

RFID光触发标签在汽车制造行业的深度应用

汽车制造行业作为现代工业的重要支柱,面临着日益激烈的市场竞争和不断提高的客户需求。传统的汽车制造管理方式在生产过程监控、零部件管理、质量追溯等方面存在诸多不足,而 RFID 光触发标签技术的出现为汽车制造行业的转型升级提供了有力的解决方案。 …

用友大易:以AI创新驱动招聘未来,引领2024 AIGC商业新趋势

更多内容前往个人网站:孔乙己大叔 在科技日新月异的今天,人工智能(AI)正以前所未有的速度渗透并重塑各行各业,其中,企业招聘领域也不例外。8月22日,由创业邦及2024 AGI商业趋势大会组委会主办的…

Mysql基础练习题 610.判断三角形 (力扣)

题目: 对每三个线段报告它们是否可以形成一个三角形 题目连接: https://leetcode.cn/problems/triangle-judgement/description/ 建表插入数据: Create table If Not Exists Triangle (x int, y int, z int) Truncate table Triangle in…

综合评价 | 基于层次-熵权-博弈组合法的综合评价模型(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 AHP层次分析法是一种解决多目标复杂问题的定性和定量相结合进行计算决策权重的研究方法。该方法将定量分析与定性分析结合起来,用决策者的经验判断各衡量目标之间能否实现的标准之间的相对重要程度&#…

SAP CN22释放物料的可用性的操作方法

SAP PS系统,CN22要释放网络的可用性(直发物料号的需求), 必输要操作路径正确,或者操作的界面正确,否则保存后无法释放可用性。 先进入作业一览 然后进入作业的组件,对网络赋值的界面&#xff0…

实训day41(9.2)

[rootlocalhost ~]# docker stop 30 //停止nginx容器 30 [rootlocalhost ~]# docker ps --all CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS …

银河麒麟v10-sp3 安装Tomcat10最新版

tomcat官方地址---Apache Tomcat - Apache Tomcat 10 Software Downloads 下载这个即可 Core: 含义:Core代表Tomcat的核心程序,即Tomcat的正式二进制发布版本。这是大多数用户做开发或学习时应该下载的版本。用途:包含了Tomcat服…

53.x86游戏实战-XXX获取人物状态

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 工具下载: 链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

一套高效、稳定的自卸车自动充电系统

随着工业自动化和智能化水平的不断提升,无人化作业已成为现代生产线的必然趋势。在山西地区的室内生产条件下,富唯智能凭借其在自卸车充电系统领域的深厚积累,成功设计出一套高效、稳定的自卸车自动充电系统,为工业领域带来革命性…

GeoScene Pro教程(003):手机拍摄带有坐标的照片批量上图到GeoScenePro

文章目录 1、创建【地图】工程2、添加底图3、照片转点4、更改符号5、设置时间动画1、创建【地图】工程 2、添加底图 选中【地图】选项卡下的【底图】按钮 ,选择适合的底图。 3、照片转点 1、查看图片GPS,右键【属性】,这样就可以确保照片可以转点 2、选中工具栏的【分析】…

公司注册资本金验资出具验资报告的看法

验资报告(Capital Verification Report)是注册会计师根据《中国注册会计师审计准则第1602号-验资》的规定,在对被审验单位的股东(投资者、合伙人、主管部门等)出资情况实施审验工作的基础上,所出…

typedef关键字讲解

目录: 1. typedef关键字 2. ui的位置 3.ui的使用 很多人都见过typedef,但是少有人知道它的作用,其实它的作用就是让关键词简单化 比如说当我们用到 unsigned int 时,每次都要打印这么长的关键词,十分耗费时间 有没…

Electron桌面应用与文件路径处理:从Git、SourceTree到TortoiseGit的安装与配置

更多内容前往个人网站:孔乙己大叔 在开发Electron桌面应用程序时,正确处理文件路径是一个至关重要的环节。特别是当涉及到需要调用外部程序(如Git、SourceTree或TortoiseGit)时,确保这些程序安装在正确的位置&#xff…

超越卷积滤波器,HyCoT利用Transformer捕捉高光谱图像的全局依赖性 !

近年来,基于学习的高光谱图像(HSI)压缩模型的开发引起了大量关注。现有的模型主要使用卷积滤波器,仅捕捉局部依赖性。 此外,它们通常会带来高昂的训练成本,并具有较大的计算复杂性。 为了解决这些问题&…

【全能型AI“草莓”来袭】探索未来AI市场的多元化与边界

🐟作者简介:一名大三在校生,喜欢编程🪴 🐡🐙个人主页🥇:Aic山鱼 🐠WeChat:z7010cyy 🦈系列专栏:🏞️ 前端-JS基础专栏✨前…

C语言基础(三十三)

1、链表排序之归并排序与线性搜索 测试代码&#xff1a; #include "date.h" #include <stdio.h> #include <stdlib.h>// 链表节点结构体 typedef struct Node {int data;struct Node *next; } Node;// 插入节点到链表末尾 Node* insertNode(Node *hea…