文档介绍:通用广告引擎的索引设计和性能优化
阿里妈妈事业部
师陀
Agenda
背景
索引设计和实现
遇到的问题
下一步工作
性能优化过程
性能优化小结
Q&A
背景
广告引擎的基本状况
层级结构:
广告主->广告计划->广告商品-通用广告引擎的索引设计和性能优化
阿里妈妈事业部
师陀
Agenda
背景
索引设计和实现
遇到的问题
下一步工作
性能优化过程
性能优化小结
Q&A
背景
广告引擎的基本状况
层级结构:
广告主->广告计划->广告商品->竞价词
背景
广告引擎的基本状况
层级结构:
广告主->广告计划->广告商品->竞价词
广告查询流程
Query解析-> 倒排查询->过滤->算分->排序->拼装结果返回
背景
广告引擎的基本状况
层级结构:
广告主->广告计划->广告商品->竞价词
在线查询流程
Query解析-> 倒排查询->过滤->算分->排序->拼装结果返回
索引数据:
每天重建全量 + 实时更新增量
背景
一年前:
使用搜索引擎isearch的索引内核 + 自己开发的辅表结构
相对实现复杂,正排读接口不清晰
性能问题
重构:新的通用广告引擎(一期)
索引支持主辅表结构
只做广告引擎需要的功能
目标:性能和可维护性
索引设计
倒排:全量 + 增量
Payload字段可配置
增量的多级可回收内存池
索引设计
正排:主/辅表结构
多种值类型:bit/int8/int16/…/float/string
多种字段类型:单值/固定多值/变长多值
定长字段和变长字段的紧密存储
Package
表的关联
字段平铺
索引设计
正排:主/辅表结构
多种值类型:bit/int8/int16/…/float/string
多种字段类型:单值/固定多值/变长多值
Package
表的关联
字段平铺
索引设计
正排
多种值类型:bit/int8/int16/…/float/string
多种字段类型:单值/固定多值/变长多值
定长字段和变长字段的紧密存储
Package
表的关联
字段平铺
主/辅表 + keyId->docId的hash表 + DeleteMap
索引实现
索引实现
索引实现
索引实现
索引实现
其他
TableWriter的其他成员
DeleteMap
KeyIdHashTable
相关小工具:indexLibPrinter
遇到的问题(1)
Mmap的得失
天然的弱持久化方案
利用系统page cache管理数据局部性
遇到的问题(1)
Mmap的得失
天然的弱持久化方案
利用系统page cache管理数据局部性
脏页回写不可控
遇到的问题(1)
Mmap的得失
天然的弱持久化方案
利用系统page cache管理数据局部性
脏页回写不可控
短期解决方案***@:flush_mmap_pages=0
遇到的问题(1)
Mmap的得失
天然的弱持久化方案
利用系统page cache管理数据局部性
脏页回写不可控
短期解决方案***@:flush_mmap_pages=0
Page cache换入换出不可控
遇到的问题(1)
Mmap的得失
天然的弱持久化方案
利用系统page cache管理数据局部性
脏页回写不可控
短期解决方案***@:flush_mmap_pages=0
Page cache换入换出不可控
mlock:不符合极端情况的异常处理需求
遇到的问题(1)
Mmap的得失
天然的弱持久化方案
利用系统page cache管理数据局部性
脏页回写不可控
短期解决方案***@:flush_mmap_pages=0
Page cache换入换出不可控
mlock:不符合极端情况的异常处理需求
另外的解决方案:使用shm替换mmap,主动控制持久化和故障恢复
遇到的问题(2)
稳定性
每天build全量的过程牵涉的系统太多太复杂
故障恢复的能力需要加强
解决方案:索引重整 + 索引压缩
遇到的问题(2)
稳定性
每天build全量的过程牵涉的系统太多太复杂
故障恢复的能力需要加强
解决方案:索引重整能力 + 索引压缩
数据灵活性
跟分布式build的结合
批量更新能力
下一步工作
广告引擎设计时的各项指标优先级
稳定性
正确性
灵活性
问题定位能力
性能
下一步工作
一期的新引擎还是很像搜索引擎
dispatcher
searchNode
searchNode
searchNode
merger
下一步工作
dispatcher
searchNode
searchNode
searchNode
merger
分布式
引擎索引数据中心