返回首页  设为首页  加入收藏  今天是:
网站首页电脑主板电脑cpu电脑内存电脑硬盘电脑显卡电脑电源显示器电脑配件电脑维修
相关文章
 广告倒排服务极致优化
 永劫无间斩马刀介绍 附低配电…
 聆听主板好声音!七彩虹B75主…
 Skylake普及先锋 华硕Z170-A…
 从铭瑄主板说明书中了解它的…
 主板能插两种内存条插双根就…
 杭州钱塘区工作内容:公司目…
 新年新速度 购买NVIDIA这些显…
 笔记本显卡2022年12月排行榜…
 4090显卡是用水冷吗 4090显卡…
 修复RX 7900显卡功耗异常 AM…
 修复 RX 7900 显卡功耗异常 …
 主板的研发水平对主板的利弊…
 为什么一些网站上 手机上可以…
 22的显示器分辨率是19201080…
 为Windows笔记本外接显示器!…
 屏幕面板
 电脑显示器亮2秒就黑屏怎么解…
 电脑cpu占用过高咋办
 电脑cpu占用过高怎么办_CPU占…
 电脑玩游戏cpu占用过高怎么办
 Windows优化大师
 微软推Windows 10新更新:解…
 20年前电脑只有32M内存用起来…
 win7虚拟内存怎么设置详细操…
 华硕和联想怎么选?同样的价…
 竞赛|不允许你还不知道!想…
 阿斯加特(Asgard)8GB 2666…
 【硬件资讯】纯白硬件大爆发…
 电脑开机黑屏老板说内存条短…
 聊聊2022年RTX4090和RTX4080…
 小体积大玩法几何未来M4亚瑟…
 英特尔移动独显亮相 高端图形…
 英伟达将推出新版RTX 3050!…
 重大调整! 英特尔宣布将显卡…
 2022 年底 AMD 和 NVIDIA 显…
 英特尔拆分图形芯片部门加速…
 正式发布前英伟达 RTX 4070 …
 称古董苹果早期电源内部竟是…
 显示器大多数人都不知道的功…
 内置芯海科技CS32G020K8U6协…
 液晶电视机显示器电源《零基…
 USB Type-C接口渐成主流这些…
 统信 UOS 推出系统移动固态硬…
 硬盘提示“报错”怎么办
 工业级硬盘存储方案 助力网络…
 超长寿命TLC闪存 金邦2TB PC…
 愉快买买买:SSD白菜价先别下…
 戴尔DELL授权服务中心!戴尔…
 戴尔展示史上最容易修的笔记…
专题栏目
网络
您现在的位置: 电脑评测网 >> 电脑内存 >> 正文
高级搜索
广告倒排服务极致优化
作者:佚名 文章来源:本站原创 点击数: 更新时间:2022/12/25 22:50:30 | 【字体:

  格子铺卖什么漏斗优化是检索系统不变的话题,过去一年来,广告漏斗优化一改往日做“加法”,而通过简化漏斗,提升全系统一致性。如百度这样庞大的广告库规模、高流量规模以及复杂的业务规则,要做到极简的漏斗层次,需要最高效的策略设计和最极致的工程实现。本文重点介绍了百度Geeker们在倒排数据结构上如何“抠细节”达到倒排召回无截断,对大家做高性能系统也将有所启发。

  大家都清楚,广告漏斗包括召回、粗排、精排这三部分,理想中的漏斗上宽下窄很规整,而现实中因为种种原因,漏斗已经略显飘逸了,这种不一致性会带来很多业务继续发展的复杂度。我们希望达到:模型一致,精简漏斗,全系统Limitless。

  我们对Limitless的认识:细节处见真章,挑战软件工程性能极限,方能漏斗近似无截断。

  今天想跟大家聊聊『BS Limitless』项目里我们怎么抠细节的,整个项目其实挑战很大,网络、计算和存储方方面面都涉及到,一篇短文很难讲透,因此我决定选一个数据结构-倒排表,让大家感受到『极致』优化。

  先介绍一下优化前的倒排表,它的组成比较经典特点,HashMap。一次检索pv根据触发的N个词(keysign)扫描拉链(SkipList),广告业务投放特点天然会有长链、超长链,为此链表需要有序,做过漏斗的同学知道,在倒排阶段排序能用的信息其实是很少的,这也说明了扫描Limitless对业务的高价值。

  这样一个小小的数据结构承担了各方的要求,1、读性能决定有限时间能放出多少量,2、实时插入决定客户投放能不能立即生效,3、单库规模巨大,内存损耗要低。对工程的合理要求,确实是既要...又要...还要...。在Limitless的大背景下,我们要显著提升1达到scan limitless,但是不能损害到2和3。

  回过头来看,这么简单的数据结构,Limitless的瓶颈到底是什么?大家回忆一下计算机体系结构的内容。cpu并不直接访存,而通过层层缓存到达内存,存储层次越低,它的容量越大但延迟越高,mem和L2、L1之间有量级差距[1]。List这种数据结构显然缺乏空间局部性。

  缓存不亲和的List对比缓存友好的Array,在扫描上究竟有多差呢?我们做了如下的评测,其中横轴代表链长或数组长度,纵轴是平均到单条元素的扫描耗时,结果是10+差距。换成数组Array,也是不行的,客户要求实时生效,为了低效拷贝损耗需要O(2N)的增长速度,内存成本要求也不能满足。

  我们针对业务的特点和Limitless的要求进行极致设计和优化,推出了新一代的内存数据结构HybridIndexTable,简称HIT。升级后的倒排表:

  2、短链采用连续存储,长链则是一棵叶子连续存储的前缀树,前缀树则参考了业界AdaptiveRadixTree,简称ART,

  3、短链和叶子的)连续存储都采用了自研的RowContainer,简称RC。

  读取性能高,连续存储+前缀树降低cachemiss,线程安全做法reader-friendly,还有面向负载的优化;

  HIT上线后拿到了非常可观的业务收益,Limitless的道路上 技术就是生产力!

  内存索引领域已在面向Modern Cpu深耕,ModernCpu由于Cpu运行得很快,使得缓存一致性的影响、访存的影响成为高性能的瓶颈。内存索引在2000s也有些阶段性的标志成果,包括FAST[4],它是面向体系结构的数据结构设计的典型,无论是思想还是成果非常适用于静态数据;CSBtree[2][3],它提出数据结构上通过KV分离,使得一次访存能比较多个Key,同时还提出了SMO的无锁解法;还有ART前缀树[5]。有序索引中BTree居多,我们为何注意到了前缀树呢?

  链表类型的缓存失效发生在每次访问下一个节点,缓存失效复杂度O(n)。排序树类型的缓存失效发生在访问下一层节点,缓存失效复杂度O(lgn)。而对于前缀树来说,缓存失效只和 键长k(len)/扇出s(pan) 有关,缓存失效复杂度O(k/s)。如下图[5],假设k是键长的bit数,随着存储数据量上涨2^(k/8)、2^(k/4)、...,完全平衡树高不断增加,分别是k/8、k/4、...,而对于一颗前缀树,树高对于给定的span是恒定的,如针对span=8和4,树高分别是k/8、k/4。前缀树更加缓存友好。

  这里简单介绍下前缀树,英文是Trie、Prefix tree或Digit tree,左图是维基百科的实例,这是个典型的没有任何优化的前缀树,一方面,只有单分叉的情况下也多分出一级,比如inn;另一方面,由于在分支节点需要分配 2 ^ s * pointer 的内存,对于实际扇出极少的场景,内存损耗非常大。

  RadixTree是一种通过合并前缀(PathCompression)优化内存的前缀树。合并前缀是指压缩掉仅有一个孩子的分支节点,这样存在的节点或者是叶子节点,或者是有分叉的分支节点。名字中的radix=2^span,它在radix=2的情况下,也叫做Patricia tree[6]。Linux PageCache页面缓存用的是RadixTree,以太坊币ETH的核心数据结构是Merkle Patricia tree。中间图是按照RadixTree重新组织的。

  即便有合并前缀,由于大部分扇出是填不满,浪费了空间。比如上面例子的RadixTree(radix = 256, s=8),那么即便在第一级只有t、A、i,也需要多分配 253 * 8 ~ 1Kbytes。调整radix(span = lg(radix))是一种内存优化方式,但这提高了树高增加了缓存失效[5]。2013年,A(daptive)R(adix)T(ree)[6]用自适应的节点类型来解决问题,用适合数据分布的最紧凑的节点表示,而不是固定的Node256。论文中 InnerNode 分为 Node4、Node16、Node80和Node256这四种,按照实际需要的分叉数选择,通过类分摊算法(Amortization Alg)复杂度分析方法,可证明理论上这棵树内存复杂度是O(52N),其中N是存储数据量。ART论文提供了一种方式,在提高扇出降低树高的同时,还能大幅度降低内存开销。按照ART重新组织上面例子中的RadixTree,如图所示。

  我们定义 RC_x 为不超过x个元素的连续存储空间,支持Append-Only和Mark-Delete操作,单元素额外成本不超过8byte。接下来看RC的设计要点。

  既然RC被设计为只支持Append-Only/Mark-Delete修改的数据类型,为此元数据需有cursor和valids。同时针对不同容量的RC,为了控制理论上单条数据损耗不超过8byte,需要分别设计和实现,我们不希望引入继承virtual指针的内存开销,采用根据type分发的实现方案。

  RC1元数据8byte,可轻松容纳cursor和valids,那么下一阶的RC_x,x是几呢?按照分摊分析方法,RC_x至少有2个元素,也就是16byte的预算,在分配前还是要先看选型,RC_x需要变长因此元数据还有留出来8byte给dataptr,这样的话,valids不能采用std::bitset,因为bitset的实现至少需要一个字也就是8byte。valids和cursor用bit field 的方式来做分配看上去还是比较充裕的,存放58个数据元素都没问题,实际上考虑到系统分配器的特点,我们并没有这样做。

  主流的系统分配器大部分是slab-based,在实际应用时,除过理论单条数据损耗,还需要考虑因内存池带来的对齐损耗。一方面,RC1所在的链约占整体的80%,这样海量的小对象适合用内存池来管理,为避免检索时候多一次内存池地址转化,我们把vaddr存储在元数据中,释放时再使用。另一方面,分散式地分配 N*sizeof(data),会造成每类slab的内部非充分使用,为此RC16+采取了Array of data_array的组织方式。

  RC设计有不少实现细节,包括什么时候一次性多申请多少空间,控制内存成本和操作效率。时间关系就不多介绍了。

  前缀树在缓存失效方面优于BTree,ART进一步地采用自适应节点类型,既能增加扇出优化缓存访问,又能控制内存损耗。然而实际应用中,ART仍然受到key值分布稀疏的影响,这表现为在部分子树扇出很小很深(较Node256),树高无法全面降低,从而影响点查的缓存。HOT[7]提出一种自适应动态span提升平均扇出,进而降低树高的方法,具体来说,定义节点最大扇出k,寻找一种树的划分,在每个划分的分支节点数不大于k-1的前提下,沿着叶子到根的划分数的最大值取最小,这样的实际效果就是对于稀疏段的span足够大,对于密集段的span足够小,整体扇出逼近最大扇出k。如中图所示。

  对于ART+目标的连续性应用场景来说,仅仅提升扇出降低树高是不够的,我们发现存在扇出很高,但扇出后叶子数据很稀疏,同时总数据量也不高,这显然影响了扫描性能。我们提出叶子合并(LeafCompaction),它包括判定器和操作算法。给定一个分支节点,如果它被判定为合并,则用一个叶子节点替换它,该叶子节点的前缀同该树的前缀,内容是该树的数据,后续插入/删除过程遵从叶子的操作方式;如果它被判定为不变,则保持。给定一个叶子节点,如果它被判定为分裂,则用一颗树替换它,该树的前缀同该叶子的前缀,内容通过BulkLoad的方式生成,如果它被判定为不变,则保持。判定器的默认算法依据子树平均和总数,节点压缩率高达90%。如图所示。

  实际评测效果,平均到单条数据的扫描性能,稀疏场景下LC版本优于普通版本一倍。

  一般使用深度优化的细粒度锁来保护倒排数据结构的并行操作,但锁竞争带来的性能抖动,完全抹杀了访存优化,我们必须探索出一种无锁(lock-free)安全模式。提到无锁lock-free,大家都觉得是CAS,其实一方面CAS不是银弹,CAS常见的写法是whileloop直到成功,如果有10个线程都在高速修改一个链表尾巴,这时候CAS只是说把陷入内核省掉了,但是还是要不停地重做,这并不能完全释放并行的能力,最好能从业务上打散。另一方面,CAS也有问题,多核下 CPU cache coherence protocol总线仲裁,导致破坏流水线。

  Read-Copy-Update 是Linux内核中的一种同步机制,被用来降低读者侧的锁开销,同时提供安全的写机制,具体地来说,多个读者(reader)并行地访问临界资源,写者(writer)在更新临界资源(critical resource)时候,拷贝一份副本作为修改基础,修改后原子性替换掉。当所有读者释放了这个临界资源后(Grace peroid),再释放资源(reclaimer)。

  对于检索服务来说,它有下面3个特点,这些特点大幅度地降低了我们的设计复杂度:

  1、单写者,我们可能有其他的准备线程并行做更重的准备工作,但只有Reload单线、非事务,检索线程召回的多条数据间没有严格约束;

  3、读者持有时间有限,检索线程有严格的超时要求。这些特点大幅度地降低了我们的设计复杂度。

  最后,我再介绍下进行中的工作L2I。刚才都是对单链的优化缓存失效,已有不错的效果,但从更宏观全局的视角来看,我们系统还有可挖掘空间:一方面,广告投放天然导致存在较多超短链,另一方面,需要扫描过程跨表查询做各类过滤逻辑等等。这些已不单单是数据分布的问题,而是在线流量和客户投放的匹配,需要用更智能的手段来解决。

  行业里面,JeffDean&TimK 联合发表了Learned Index[8]引入RMI、CDF的模型,后续TimK团队又有动态化、多维索引、sagedb等多种方向的发展,本质是构建面向负载的半自动化寻优系统。我们既要引入负载特征,但由于扫描过程很轻量,不能做过重的预测,同时作为对客户有承诺的商业系统,不能产生错误。借鉴L2I的思想,我们还做了两个事情,一方面、通过触发出口离线计算共现关系,用来合并超短链、短链,用上HIT的高性能的连续扫描能力;另一方面,取熵最大的组合,提取到倒排表的bit位,确定不过1,否则为0,对于后者 fallback到点查计算。

电脑内存录入:admin    责任编辑:admin 
  • 上一个电脑内存:

  • 下一个电脑内存: 没有了
  •  
     栏目文章
    普通电脑内存 广告倒排服务极致优化 (12-25)
    普通电脑内存 永劫无间斩马刀介绍 附低配电脑轻松畅玩攻略 (12-25)
    普通电脑内存 20年前电脑只有32M内存用起来挺快现在连网页都… (12-25)
    普通电脑内存 win7虚拟内存怎么设置详细操作方法【详解】 (12-25)
    普通电脑内存 华硕和联想怎么选?同样的价格建议选华硕 (12-25)
    普通电脑内存 竞赛|不允许你还不知道!想要弯道超车USACO计… (12-25)
    普通电脑内存 阿斯加特(Asgard)8GB 2666频率 DDR4 台式机… (12-25)
    普通电脑内存 手机APP越做越大内存不够用?这样转一转三五年… (12-25)
    普通电脑内存 苹果iPhone14Pro有什么新功能 苹果可以插内存… (12-25)
    普通电脑内存 一加Ace Pro和realme GT2大师探索版区别是什么… (12-25)
    普通电脑内存 买手机要买12GB内存的吗?8GB内存还能买吗? (12-25)
    普通电脑内存 13年来最严重!内存、SSD价格暴跌 美光全球裁… (12-25)
    普通电脑内存 公司面试笔试题1 (12-24)
    普通电脑内存 微信键盘上线用户体验如何?有人赞功能强大 有… (12-24)
    普通电脑内存 用26个英文字母带你回顾苹果的2015年 (12-24)
    普通电脑内存 RX 7900XT性能相当于哪个N卡 内存运行频率是多… (12-24)
    普通电脑内存 买手机必须了解的细节(2):内存别只看大小也… (12-24)
    普通电脑内存 金士顿推出叛逆者 DDR5-7200 内存条16GB2 售价… (12-24)
    普通电脑内存 威刚(ADATA) 万紫千红 DDR4 电脑笔记本内存… (12-24)
    普通电脑内存 DDR5内存价格狂跌不止你还会选择DDR4的内存吗… (12-24)