点击围观!腾讯 TAPD 助力金融行业研发提效、敏捷转型最佳实践! 了解详情
写点什么

滴滴开源 Levin:数据闪电加载方案

  • 2019-09-19
  • 本文字数:2040 字

    阅读完需:约 7 分钟

滴滴开源 Levin:数据闪电加载方案

近期,滴滴在 Github 上发布了第 23 个开源项目 Levin:针对低频更新、静态使用、大规模数据的快速加载解决方案,具备简单易用、效率高、性能好、内存省等优点。一起来了解详情吧!

1.背景

互联网某些业务场景下,我们常会遇到这种情况:服务启动需要加载大量数据到内存,数据规模达数十 G,数据更新频率较低(天级、小时级、分钟级),使用方式为静态查询。如业务订单数据、线下挖掘的策略规则,地图路网数据等。而在线服务基于稳定性考虑通常至少加载双版本数据,服务启动通常需要数分钟之久。暴露的问题包括服务上线旷日持久,人力成本高;需求排队无法快速迭代,时间成本高;回滚速度慢,由于要加载大量数据故障实例无法快速恢复造成稳定性隐患。


如同闪电(Levin)一般快速加载启动是根治这类问题的灵丹妙药。Levin 是针对上述低频更新、静态使用、大规模数据的快速加载方案,高效托管大规模静态数据,加速大内存服务冷启动和热加载。

2.原理

服务启动唯快不破,但是在单纯的服务变更场景中(比如上线、回滚、故障恢复)虽然并不涉及任何数据变更,服务进程重启导致堆和栈内存数据都会随之消亡,启动后需要重新加载数据。那么数据能不能在进程间传递复用呢?最高效的进程间数据传递方式就是共享内存,共享内存可以突破进程生命周期实现跨进程重用,并且具有内存对象访问效率和充足的可用地址空间(下图 Memory Mapping Area),鱼(启动速度)与熊掌(查询效率)可以兼得。



再考虑数据更新场景,通常指数据版本切换,此时磁盘数据读取在所难免,那么从数十 G 的数据文件到内存数据对象(通常为 STL 容器),是否存在更高效的转换方式?思考如果直接离线编译出数据对象内存布局写入二进制文件,在线服务启动时进行一次性共享内存分配和 IO 读取,可以进一步提高加载效率。


在确定了使用共享内存和容器数据离线编译之后,关键的问题来了,如何将容器放入共享内存?最大的障碍是指针和容器内存不连续性。Levin 的武器是降维:容器对象内存布局一维化,在一维世界中只需首地址加长度就可以表达、读取和复制整个容器对象。由于同一块共享内存会映射到不同进程的不同虚拟地址,使用偏移量代替容器中的指针,实现地址无关的容器。


我们也对造好的轮子(Boost interprocess 容器)进行调研,发现其基线测试性能表现不佳:最常用的 vector/hashmap 查询效率较标准容器慢 10%~20%左右。最终 Levin 选择了自定义共享内存容器,并在数据静态使用方式的前提下做了一系列优化,具备简单易用、效率高、性能好、内存省的优点。并实现了工程化应用落地不可或缺的功能:如共享容器内存校验、版本管理。

3.功能与特性

STL-like 共享内存容器

支持托管在共享内存片段上的容器,包括常用容器 vector、set、map、hashset、hashmap 等。并支持使用适配、组合、特化等手段自定义共享内存容器。


基线测试表明 Levin 容器查询性能较标准容器有所提升,内存使用效率优势明显(详见 benchmark)


离线数据编译

高效使用数据是在线服务的目标,数据规范化是构建复杂系统的前提。


很多以数据为核心的系统都会将数据流程划分为离线编译和在线加载,其中离线数据编译是数据高效转换的重要一环,利用离线单节点把数据转换为可以方便使用的格式,省掉在线服务多节点重复的转换和构建工作。


Levin 支持离线数据编译功能,将原始数据编译为进程可直接读入的共享容器对象内存布局二进制文件,为在线服务提供更加高效的数据服务。

在线数据加载

加载离线阶段编译产出的数据文件至命名共享内存区域,支持共享容器对象申请、校验、加载、释放。


Levin 在线数据加载进行一次性共享内存分配和读取,省掉构建过程大量 brk/mmap 内存分配系统调用,减少 IO 次数,为在线服务数据加载进一步提速。下图是以上介绍的数据使用流程,推荐这种方式。


管理模块

用户大量使用共享容器时,共享容器使用情况全景不透明,逐个释放容易遗漏,服务出现异常等情况下会导致无用数据驻留内存空间,浪费节点内存资源。


Levin 提供管理模块,支持共享容器以集合(group)的方式进行管理,相同生命周期的共享容器可交由同一管理模块实例托管,进行统一的创建、加载,释放。管理模块还支持共享容器全局搜索功能。支持安全释放、清理功能,避免容器数据异常销毁或无用容器驻留系统。支持可定制的数据文件校验方式,降低文件校验耗时。

版本切换

使用 Levin 管理模块对同版本容器数据进行 group 管理,卸载特定版本时可安全、统一释放相应的共享容器集合,完美支撑用户数据版本热切换需求实现。

3.内部实践

Levin 内部应用实践效果:落地服务冷启动和热加载耗时均由分钟级降至秒级。内存用量方面优化明显,Levin 容器静态数据转而由共享内存托管,与服务 session 动态数据分离。观察数据版本切换场景,磁盘 IO 次数大幅降低,切换导致的 cpu 抖动也明显缓解。以上,本文开头提到的人力、时间成本浪费和稳定性隐患问题迎刃而解。


闪电加载,你值得拥有!Getting Started


本文转载自公众号滴滴技术(ID:didi_tech)。


原文链接:


https://mp.weixin.qq.com/s/OHMeBqXQNqqkpdaI_AhR2Q


2019-09-19 16:31726

评论

发布
暂无评论
发现更多内容

博云容器云 3.2 发布:核心能力再提升,易用性再升级

BoCloud博云

容器

Java“圣经”学累了?那就看看这些通俗易懂的内容吧

Java架构师迁哥

全栈程序员这个月写了啥代码?

程序员鱼皮

Java JavaScript 大前端 后端 全栈

架构实战营模块5作业

En wei

架构实战营

《原则》(四)

Changing Lin

一些有意思的句子

IT蜗壳-Tango

IT蜗壳 6月日更

3D场景搭建的隐秘功能——时间轴

ThingJS数字孪生引擎

大前端 物联网 可视化 3D可视化 数字孪生

【立刻报名】加速开发 Perforce on Tour China 2021-龙智

龙智—DevSecOps解决方案

Nacos--简介

是老郭啊

微服务 nacos 服务注册与发现

从天而降的AI“青云梯”,开发者们准备好了吗?

白洞计划

贝特瑞新能源汽车的速度与激情

亚马逊云科技 (Amazon Web Services)

【环球网】博睿数据CEO冯云彪:做好生态链企业的适配工作

博睿数据

博睿数据 博睿数据数据链DNA 生态链

区块链作为“信任的机器”,将改变社会价值的传递方式

CECBC

拼多多电商部java岗三面落选,记下的面试题,不睡觉都要背下来!

Java 程序员 架构 面试

dubbo使用curator作为zk客户端优雅停机存在的问题

林一

zookeeper dubbo curator

极光开发者周刊【No.0604】

极光JIGUANG

程序员 开发者 IT行业

农业SaaS,「无人关注」的万亿市场

ToB行业头条

博睿数据深化信创布局,通过华为鲲鹏920和统信UOS测试认证

博睿数据

信创 国产化 博睿数据

深入理解iOS图文混排原理并自定义图文控件

Geen练

图文混排 iOS Developer iOS 知识体系

【得物技术】JS资源分包

得物技术

CSS 大前端 js 版本 页面

VRIO模型 - 发现自己的核心资源与能力

石云升

创业 职场经验 管理经验 6月日更

我们并不需要 Deno

LeanCloud

node.js deno 开发工具 JavaScrip

字节跳动的ToB生意,为什么需要火山引擎?

ToB行业头条

博睿数据重塑APM,引领IT运维新标杆

博睿数据

博睿数据 数据链DNA 服务可达

聊聊MySQL全局锁

架构精进之路

MySQL 6月日更

Nacos-- docker搭建

是老郭啊

Docker nacos

Polkadot“升级”之道

趣链科技

区块链 区块链技术 polkadot

勒索病毒卷土重来?看亚马逊云科技如何保护你的网络安全!

亚马逊云科技 (Amazon Web Services)

理解【Apache Zookeeper】

awen

zookeeper

算法如何促成亿级别扶持曝光视频?爱奇艺Budget Pacing智能扶植系统实践

爱奇艺技术产品团队

架构 推荐 算法 广告 扶植

拍乐云运维专家受邀QECon大会,畅谈多云环境伸缩实践

拍乐云Pano

滴滴开源 Levin:数据闪电加载方案_文化 & 方法_刘锐_InfoQ精选文章