执行概要
在移动互联网全方位覆盖的今天,人们希望一拿起手机就能刷到自己感兴趣的新闻、短视频和促销信息。因此,基于信息聚合,能向用户投送个性化内容的 Feed 流服务,正在成为越来越多互联网公司赢得用户的重要手段。作为全球 IT 和互联网行业的领先企业,百度* 始终致力于成为最懂用户的高科技公司,它在数年前布局与拓展的 Feed 流业务,正成为其重要的业务增长引擎之一。
为向用户提供更高效、更流畅的 Feed 流服务,百度基于自身在搜索引擎、人工智能等方面的技术优势,构建了高效的核心内存数据库 Feed-Cube*,来为 Feed 流服务提供 高并发、大容量和高性能的数据存取服务。随着百度业务进一步拓展,Feed-Cube 也需要为之部署更大容量的内存来承载规模激增的数据,而动态随机存取存储器(Dynamic Random-Access Memory,DRAM)内存昂贵的价格,使内存扩展带来的总拥有成本 (Total Cost of Ownership,TCO)压力不断抬升。
为在保证性能的同时有效降低 TCO,百度与英特尔开展深入技术合作,引入了全新的英特尔® 傲腾™ 数据中心级持久内存,并将 Feed-Cube的核心工作场景迁移至由该产品构建的全新内存平台上。来自百度的内部测试数据表明,基于英特尔® 傲腾™ 数据中心级持久内存的 Feed-Cube,在高并发 Feed 流业务场景下依然可以保持性能优势,并能显著降低成本。这一成果,也促使百度在 Feed 流之外的更多关键应用场景中,对采用英特尔® 傲腾™ 数据中心级持久内存的可行性与实际应用价值开展了更多的验证与测试工作。
“Feed 流服务可以根据用户喜好,进行用户画像,向用户提供个性化内容。它需要高性能线上存储的支持,来自英特尔的傲腾™ 数据中心级持久内存,可帮助 Feed 流服务的核心模块 Feed-Cube 在保证高并发、大容量和高性能的同时,大大降低 TCO。” -----汪瑫 推荐技术架构部主任架构师 百度
面向未来的百度Feed流服务
移动互联网已成为人们最主要的联网方式之一,来自 CNNIC* (中国互联网络信息中心*)的统计信息指出,截止 2018 年底,我国网民使用手机上网的比例已达 98.6%1。智能手机的操作模式让用户更倾向于通过简单的“划屏”动作,而非传统的文本交互方式来获取信息,这使得采用自动聚合、精准推送信息的 Feed 流服务越来越受用户青睐。
Feed 流是一种聚合内容并持续呈现给用户的互联网服务方式,可以通过时间流(Timeline)、页面权重(Pagerank)或者特定的人工智能算法来实施,可为用户提供更为个性化的信息,并避免无效信息侵扰,同时,在平台投放广告的商户也能从中获得更佳的营销效果。
图一 百度核心应用中的 Feed 流服务
数以亿计的用户规模,促使百度在构建其 Feed 流服务系统时,必须考虑千万量级的并发服务,以及更低延迟的数据处理性能,而这其中的关键,就是存储和信息查询能力的建设。为此,百度使用了先进的核心内存数据库 Feed-Cube,来为 Feed 流服务的数据存储和信息查询提供核心支撑能力。
Feed-Cube 基于内存构建,并采用了 “键值对(Key-Value)” 的存储结构。如图二所示,其中 Key 值,以及 Value 值所在数据文件 (Datafile)的存储偏移值(Offset)存放在哈希表(HashTable)中,而 Value 值则单独存放在不同的数据文件中。哈希表和数据文件均存放在内存中,借助内存带来的高速 I/O 能力,Feed-Cube 可提供非常出色的读写性能以及超低的延迟。
图二 百度 Feed-Cube 工作示意图
当前端应用需要查询某个数据时,可以通过查询 Key 值来一次或多次访问哈希表,获得 Value 值所在数据文件存储位置的偏移值,并据此最终访问数据文件,获得所需的 Value 值。
基于 DRAM 内存构建的百度 Feed-Cube 虽然在高/大并发(每秒千万次查询)、海量数据存储(PB 级)环境下一直有着优异的性能表现,但随着百度 Feed 流服务规模的不断扩大,也在不断面临新的挑战。一方面,使用价格较为昂贵的 DRAM 内存来构建大内存池,正使得百度的 TCO 不断抬升;另一方面,单位 DRAM 内存有 限的容量,也限制了 Feed-Cube 流处理能力的进一步提升。
来自傲腾™ 数据中心级持久内存的助力
为应对上述挑战,百度开始尝试使用性能不断提升的、基于非易失性存储(non-volatile memory,NVM)技术的存储设备,如 NVMe 固态盘,来存储 Feed-Cube 中的数据文件和哈希表。为验证使用 NVMe 固态盘后的系统性能,百度分别基于 DRAM 内存和 NVMe 固态盘构建了两个 Feed-Cube 集群来进行对比性测试。
测试结果表明,与 DRAM 内存相比,下沉到 NVMe 固态盘的 Feed-Cube 出现了三个方面的问题:
• 在大并发应用场景下,NVMe 固态盘在队列深度较高(例如大于 1,024)的场景下,长尾延迟现象严重,无法做到 100% 的 QoS 保证;
• 在大容量数据存储场景下,NVMe 固态盘的边际效应较差,部署数据越多,查询时间越长,磁盘空间利用率也会随之降低;
• NVMe 固态盘的 IO 速度与 DRAM 内存相比仍有较大差距,因此仍需要在系统中部署大量的 DRAM 内存作为 Cache(缓存)以保证性能。
基于英特尔® 3D XPoint™ 存储技术打造的英特尔® 傲腾™ 数据中心级持久内存,则为这些问题的破解提供了全新路径,这种旨在革新内存和存储架构的全新产品类别相比固态盘,拥有更高的读写性能、更低的访问延时以及更高的耐用性,在多用户、高并发和大容量的场景下有着非常突出的综合应用优势。
有鉴于此,百度首先引入英特尔® 傲腾™ 数据中心级持久内存,用于存储 Feed-Cube 中的数据文件部分,而哈希表仍使用 DRAM 内存。采用这一混合配置的目的,一方面是为了验证英特尔® 傲腾™ 数据中心级持久内存在 Feed-Cube 中的性能表现;另一方面,Feed-Cube 在查询 Value 值的过程中,读哈希表的次数要远大于读数据文件,因此先在数据文件部分进行替换,可以尽可能减少对 Feed-Cube 性能的影响。
为了使英特尔® 傲腾™ 数据中心级持久内存能够成功地应用于 Feed-Cube,百度与英特尔一起围绕系统硬件、操作系统、内核等组件进行了全方位的优化。双方首先将 Feed-Cube 部署在了基于第二代英特尔® 至强® 可扩展处理器的平台上,该处理器不仅能提供更为强劲的计算性能,还是英特尔® 傲腾™ 数据中心级持久内存的 “良配”;其次,为保证新硬件能充分释放性能潜力,英特尔还根据 Feed-Cube 应用场景的需求,在服务器 BIOS 中加入了对英特尔® 傲腾™ 数据中心级持久内存的支持驱动,并在百度自研 4 系 Linux* 内核的基础上,增添了相关的补丁。
完成这一系列优化 “组合拳” 后,百度在随后进行的、对比纯 DRAM 内存模式与混合配置模式的测试中,模拟了实际场景中可能出现的大并发访问压力,QPS(Query Per Second,每秒查询次数)设为 20 万次,每次访问需要查询 100 组 Key-Value 组,因此系统总访问压力为 2 千万级。测试结果如图三和表一所示。
图三、表一 Feed-Cube 分别在纯DRAM 内存模式及 DRAM 内存+ 英特尔® 傲腾™ 数据中心级持久内存混合配置模式下的对比测试结果2
可以看出,采用混合配置模式后,Feed-Cube 在 2 千万大并发访问压力下,平均访问耗时仅上升约 24%(30 微秒)2,处理器消耗整机占比上升7%2,性能波动均在百度可接受的范围内。而与此同时,单服务器的 DRAM 内存使用量下降过半,这对于 Feed-Cube PB 级的存储容量而言,无疑可大大降低成本。
如图四所示,上述混合配置模式的成功,促使百度进一步尝试在 Feed-Cube 中采用全部配置英特尔® 傲腾™ 数据中心级持久内存的模式,但这也面临一个新的问题,那就是部署在 DRAM 内存中的哈希表,通常会使用 malloc/free 等内存空间分配命令,在引入英特尔® 傲腾™ 数据中心级持久内存后,也需要新的命令予以替代。百度为此使用了基于 libmemkind 库* 的自研空间分配库,在提供空间分配操作能力的同时,也改善了空间利用率。
图四 百度 Feed-Cube 内存硬件变化路径
在全部采用英特尔® 傲腾™ 数据中心级持久内存构建 Feed-Cube 后,百度也对其性能表现和资源消耗情况进行了测试。如图五所示,以每秒 50 万次查询(QPS)的访问压力为例,测试结果显示: 只配置英特尔® 傲腾™ 数据中心级持久内存的平均时延与只配置 DRAM 内存的方案相比,上升约 9.66%2,性能波动也在百度可接受的范围内。
图五 不同配置下处理时延对比
在更多应用场景中验证傲腾的价值
在开展与 Feed 流服务相关的验证及测试的同时,百度还在其他多个业务场景中探索了使用英特尔® 傲腾™ 数据中心级持久内存的可行性及使用场景。以某核心业务模块系统的故障恢复为例,该业务模块在原来采用 DRAM 内存部署时,一旦遇到停电、宕机等突发故障时,就需要从后台固态盘 HDD 硬盘中重新加载数据来恢复服务,这一过程往往需要耗时数十分钟之久,严重影响服务的启动和上线效率。而利用英特尔® 傲腾™ 数据中心级持久内存高速的读写性能以及非易失性特性,现在这一加载时间被缩减到了秒级2。
英特尔® 傲腾™ 数据中心级持久内存大容量的特性,配合第二代英特尔® 至强® 可扩展处理器对大内存的良好支持,还能帮助百度在与Redis* 内存数据库、Spark* 分布式内存计算引擎相关的使用场景中,有效提升单机内存密度以及计算效率,并大幅节省 TCO。以在某关键业务上部署的 Spark 为例,旧有系统的存储是构建在 DRAM 内存和本地/云端 HDD 硬盘上,当系统在进行数据处理时,需要将数据从本地/云端 HDD 硬盘读取到 DRAM 中,但随着计算量不断扩展,数据在 DRAM 内存和本地/云端 HDD 硬盘之间的交互就逐渐成为了瓶颈。为解决这一问题,百度正计划为该 Spark 系统增添英特尔® 傲腾™ 数据中心级持久内存,通过大幅提升系统的单机内存密度的方式来消除这一瓶颈。
回顾上述使用场景,清晰可见的是:英特尔® 傲腾™ 数据中心级持久内存带来的高密度内存与热启动特性,正在助推 “功能即服务” (Function as a Service,FaaS)的持续创新和发展。作为未来云服务的重要方向,FaaS 基于 “无服务器”特性的功能框架,其短暂的生命周期(甚至仅有数秒)对启动速度要求更高,对内存需求更多。百度对于 FaaS 的探索,在英特尔® 傲腾™ 数据中心级持久内存的助力下,在启动速度和 TCO 两方面,已是收益良多。
展望
未来,百度与英特尔还计划继续围绕英特尔® 傲腾™ 数据中心级持久内存,以及与其搭配的第二代英特尔® 至强® 可扩展处理器等一系列先进产品与技术,开展更多也更为深入的技术交流与协作,让它们能够在更多互联网核心业务场景,以及关键应用和服务中发挥更为重要的作用,也能帮助百度在这些技术的助推之下,向用户提供更为多样和完善的产品用户体验。