NUMA架构下的预估系统性能优化

语言: CN / TW / HK

作者:瑜锋

1. 背景

在推荐业务中,经典的分层逻辑为三层:召回、精排、重排,其中精排层无疑又是最复杂、最具挑战性的一个环节,预估系统主要是为精排业务提供在线推理的服务。

当前云音乐在线预估系统经过三年多时间的不断迭代,已经接入包括音乐、搜索、直播、创新业务等多个场景模型。

预估系统主要的逻辑包含三个部分:

  • 特征查询:根据业务从分布式存储中查询用户、场景、item等特征,解析之后准备下一阶段的特征抽取;

  • 特征抽取:根据模型定义的输入特征,对上一阶段查询回来的特征逐个计算,转换成模型需要的数据格式,例如embedding、hash等;

  • 前向推理:将特征抽取后的数据输入机器学习库,经过一系列的矩阵运算等操作,最后输出一个用户对一个item的得分;

三个阶段中,特征查询属于IO密集型,其他两个阶段属于CPU密集型,尤其是前向推理阶段,需要完成大量的矩阵相乘等操作,并且期间有大量的内存申请和读写逻辑。

当前云音乐在线预估系统部署数十线网集群,上线数百物理机。系统上线初期主要使用至强E5 56核机器,去年开始采购的都是至强Gold 96核机器,两种机型具体配置如下:

对比两种机型配置,高配机器的计算能力至少是低配机器的两倍。但是在上线运行时的性能表现以及日常压测数据显示,高配机器在实际业务处理能力上并没有成线性增加,存在较大的性能损失。

下表中对比了两个场景模型在两种机型上的业务处理能力:

2. NUMA架构

当单核处理器计算能力无法满足日益增长的算力需求,处理器制造厂商开始朝着多核的方向发展。

单机服务器架构经历了从 一致性访存(UMA) 到  非一致性访存(NUMA) 架构的演变。

在UMA架构中,多路CPU无主次关系,共享内存、总线、操作系统等资源,此时每个CPU访问内存任何地址所耗费的时间是相等的。由于所有CPU共享内存,导致了单机的扩展能力有限,随着CPU数量增加,内存访问冲突也会大大增加。

为了进一步提高单机CPU数量,同时还能保证计算资源利用率,于是NUMA架构出现,通过牺牲内存的访问延时来提高机器的扩展性。

在NUMA架构中,每个CPU都有本地内存,同时可以通过高速交换矩阵实现其他CPU本地内存的访问。这种架构的特点就是CPU访问自己的本地内存速度非常高,但是访问远端的CPU本地内存因为需要经过的总线更长,延时也会有相应的增加。

通过lscpu命令查看,当前线上的服务器都是配置的2个CPU节点的NUMA架构,接下来将会测试是否是NUMA架构的访存特性,导致在高配机器上单机处理能力无法达到预期的提升一倍的问题。

3. 亲核性测试

为验证在NUMA架构下的亲核性对预估系统性能的影响,决定对单机三种部署方式进行测试:单节点、双节点不绑核、双节点绑核。绑核通过使用Linux操作系统上的numactl命令来实现。

测试的模型选择了一个复杂场景(模型A)和简单场景(模型B),测试这两个模型在三种不同的部署方式下,CPU利用率达到60%时,单机的请求处理能力。

3.1 低配机器测试结果

模型 A:

模型 B:

双节点绑核相对于单节点部署方式有10%~20%左右的单机请求量提升,但是模型A在双节点绑核部署方式上平均耗时也增加约10%;同时在模型B上,双节点不绑核相对于单节点部署方式,反而单机请求量降低了10%。

总体上看,在低配机器上,NUMA架构的亲核性对系统的性能影响不明显,主要原因是因为计算资源还比较少,预估系统产生的访存竞争不大。

3.2 高配机器测试结果

模型 A:

模型 B:

无论在模型A还是模型B,双节点绑核相较于单节点部署,单机请求处理能力有比较明显提升,分别带来了75%和49%的提升;同时双节点不绑核性能表现最差,主要是因为双节点的线程数相较于单节点有较大增加,导致了访存的竞争、线程切换开销更为明显。

4. 测试结论

相较于低配机器上的单节点部署方式,高配机器通过采用双节点绑核的部署方式,在模型A和模型B上,分别带来了169%和112%的性能提升,符合计算资源增加一倍情况下请求处理能力相应提升的预期。

高配机器上性能提升相较于低配机器更为明显,三种部署方式性能排序: 双节点绑核 > 单节点 > 双节点不绑核

本文发布自网易云音乐技术团队,文章未经授权禁止任何形式的转载。我们常年招收各类技术岗位,如果你准备换工作,又恰好喜欢云音乐,那就加入我们 [email protected]