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)

Levin2.jpg

▍离线数据编译

高效使用数据是在线服务的目标,数据规范化是构建复杂系统的前提。 很多以数据为核心的系统都会将数据流程划分为离线编译和在线加载,其中离线数据编译是数据高效转换的重要一环,利用离线单节点把数据转换为可以方便使用的格式,省掉在线服务多节点重复的转换和构建工作。 Levin支持离线数据编译功能,将原始数据编译为进程可直接读入的共享容器对象内存布局二进制文件,为在线服务提供更加高效的数据服务。

▍在线数据加载

加载离线阶段编译产出的数据文件至命名共享内存区域,支持共享容器对象申请、校验、加载、释放。 Levin在线数据加载进行一次性共享内存分配和读取,省掉构建过程大量brk/mmap内存分配系统调用,减少IO次数,为在线服务数据加载进一步提速。下图是以上介绍的数据使用流程,推荐这种方式。

▍管理模块

用户大量使用共享容器时,共享容器使用情况全景不透明,逐个释放容易遗漏,服务出现异常等情况下会导致无用数据驻留内存空间,浪费节点内存资源。 Levin提供管理模块,支持共享容器以集合(group)的方式进行管理,相同生命周期的共享容器可交由同一管理模块实例托管,进行统一的创建、加载,释放。管理模块还支持共享容器全局搜索功能。支持安全释放、清理功能,避免容器数据异常销毁或无用容器驻留系统。支持可定制的数据文件校验方式,降低文件校验耗时。

▍版本切换

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

4.内部实践

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

5.项目页面

GitHub:
GitHub - didi/levin: A Quick Way to Bulk LoadingDocumentation:
https://github.com/didi/levin/wiki 欢迎Star,欢迎Issue。

滴滴开源 Levin:数据闪电加载方案相关推荐

  1. 5首页加载慢_UIViewController 预加载方案浅谈

    作者 | hite,目前在网易严选iOS 组,主要工作内容 webview 相关,业余时间会写一些胡思乱想产品策划稿,各类游戏云玩家. 一. 引子 预加载作为常规性能优化手段,在所有性能敏感的场景都有 ...

  2. Android解耦式so库加载方案

    背景说明 在业务开发过程中经常会进入一些三方sdk,这些三方的sdk引入so库,有些so库文件还比较大,这时候我们就需要考虑so库从网络获取异步加载,减少发布包的体积 传统方案 关于so异步加载方案, ...

  3. 小程序性能优化之页面预加载方案——让你的小程序运行如飞 集成篇

    小程序性能优化之页面预加载方案 集成篇 转载请注明出处:https://blog.csdn.net/sinat_27612147/article/details/80802725 前言 之前看到一篇文 ...

  4. 小程序性能优化之页面预加载方案——让你的小程序运行如飞 进阶篇

    小程序性能优化之页面预加载方案 进阶篇 转载请注明出处:https://blog.csdn.net/sinat_27612147/article/details/80798452 写在前面 预加载方案 ...

  5. 悟空活动中台 - 基于 WebP 的图片高性能加载方案

    本文首发于 vivo互联网技术 微信公众号  链接: https://mp.weixin.qq.com/s/rSpWorfNTajtqq_pd7H-nw 作者:悟空中台研发团队 一.背景 移动端网页的 ...

  6. js如何将数据放在一个内置窗口里面_Java 爬虫遇上数据异步加载,试试这两种办法!...

    这是 Java 爬虫系列博文的第三篇,在上一篇 Java 爬虫遇到需要登录的网站,该怎么办? 中,我们简单的讲解了爬虫时遇到登录问题的解决办法,在这篇文章中我们一起来聊一聊爬虫时遇到数据异步加载的问题 ...

  7. JS实现-页面数据无限加载

    在手机端浏览网页时,经常使用一个功能,当我们浏览京东或者淘宝时,页面滑动到底部,我们看到数据自动加载到列表.之前并不知道这些功能是怎么实现的,于是自己在PC浏览器上模拟实现这样的功能.先看看浏览效果: ...

  8. java 爬虫 异步_Java 爬虫遇上数据异步加载,试试这两种办法!

    这是 Java 爬虫系列博文的第三篇,在上一篇 Java 爬虫遇到需要登录的网站,该怎么办? 中,我们简单的讲解了爬虫时遇到登录问题的解决办法,在这篇文章中我们一起来聊一聊爬虫时遇到数据异步加载的问题 ...

  9. oracle分区交换速度,oracle交换分区对数据的加载提速案例

    author:skate time:2012/07/16 oracle交换分区对数据的加载提速案例 环境: os:linux db:oracle10g 其中一个库的数据加载非常慢,如何能提高数据的加载 ...

最新文章

  1. SAP MM MRP运行后触发的PR单据里没有Assign采购组织?
  2. 使用beanUtils操纵javabean
  3. 常用数据绑定控件详解
  4. 在 XML 中添加实体
  5. Beyond Compare配置
  6. php 类似微信下拉菜单,微信小程序模拟下拉菜单开发实例
  7. Haystack全文搜索
  8. 计算机算法设计与分析 找零钱问题
  9. Multisim软件使用详细入门教程(图文全解)
  10. 淘宝网发展史:揭开神秘组织的技术内幕与艰辛历程
  11. Postman下载安装及汉化
  12. Bug Algorithms
  13. 电脑图片格式怎么批量转换jpg?几个小妙招轻松转换
  14. 插画手绘培训,“安利25周年”插画主题创作:畅游RichJay的创业之旅!【信念篇】
  15. PaaS服务从heroku迁移到Fly.io小计
  16. 破除谷歌浏览器Google Chrome启动时打开hao123,2345等流氓网页
  17. self-attention
  18. pycharm验证码
  19. Apache Tomcat优化
  20. 基于社交模型的权证交易概念产品-理想中的目录

热门文章

  1. 递推算法题:王小二刀工之王小二切大饼
  2. Django-部署与启动
  3. drupal mysql hash密码_【Drupal】如何重置Drupal 7的用户密码
  4. 工具笔记:SpaceSniffer
  5. 一种跳板机的实现思路
  6. 广州中大成考培训火热招生中
  7. 快速开发混凝土搅拌企业管理平台
  8. 开源客服系统-wolive
  9. 在北京开运输公司需要注意什么
  10. VisSim.Comm.v4.5.08 (卫星、终端等的通信分析软件)