虽然同为LSM-tree架构,X-Engine的设计哲学与传统基于LSM-tree架构的Rocksdb等引擎并不完全一致,如下图所示:

设计关键点1:X-Engine磁盘上的数据,在常态下只有两层(L1/L2),L0层是MemTable在compaction来不及的情况下暂存到磁盘上缓解内存压力时才启用的,正常情况下被冻结的MemTable可以直接和磁盘上的L1合并。

设计关键点2:在L1/L2之间的compaction合并过程中,X-Engine的冷热合并算法倾向于将热点数据保留在L1层(基于访问频度),将访问较少的数据下刷到L2层并进行压缩存储。这是一个对数据在物理上进行冷热分离的过程, 其结果是L1存储的都是热点数据,L2存储的都是冷数据。对L1进行缓存时会有更高的内存利用率。

按照设计初衷,X-Engine正常运行时,Memtable中缓存了最近写入还未刷盘的数据,L1中保存了磁盘访问频度最高的数据,也大部分被内存缓存,分层之后X-Engine的读性能优化被分解为两个独立子问题:

内存MemTable部分和L1层数据读操作是CPU bound的,手段主要是优化CPU指令的执行效率和访问主存的速度。

L2层的读性能依赖于磁盘的随机读能力,对此部分的优化手段是更精准的冷热识别,其目标是最大化IOPS利用率。

考虑到Memtable部分数据量较少,在冷热识别算法精准并且内存足够缓存热点数据的前提下,X-Engine的性能整体上取决于对L1部分数据的内存查找效率,这也是今天这篇文章探讨的主题: 如何最大化命中内存时的读取性能。

读取路径存在的问题

在数据集小于可用内存时,X-Engine的读性能受限于CPU资源。分析一个CPU bound程序的性能问题时,我们需要看CPU在哪些地方繁忙。按照CPU使用率的定义,CPU在执行指令时或者在等待数据时(stall) 都会处于busy状态,存储引擎的读性能优化最后都会落到两个点上:

提升CPU Cache命中率,主要靠执行线程在时间上和空间上访存的局部性。

提升CPU指令的执行效率,这一方面需要精简实现代码,减少不必要的执行路径,另一方面需要减少不同线程之间的状态同步,保证指令流水线顺畅执行。

L1层数据组织和读取过程:X-Engine将数据划分成2MB大小的Extent,Extent内部会记录编码成16KB的Block,每个Extent内部包含一个IndexBlock以辅助定位DataBlock。整体看X-Engine中L1/L2层的数据组织是一个类似B+树的索引结构。如果所有操作都能命中内存,在Extent中读取一条key=X的记录,操作会按如下四个步骤执行:

ExtentMeta数组是这棵B+树的根节点,在其中二分查找定位出X所属的Extent.

Extent可以理解为一棵子树,首先需要通过一次Hash查找(查询缓存)获取到该Extent的IndexBlock。

从IndexBlock中定位出X所属的DataBlock的Key, 并通过一次Hash查找定位到X所属的DataBlock。

在内存中的DataBlock中查找到该记录的实际内容,并返回对应的Value.

结合上述读路径的实现逻辑,同时对X-Engine全内存命中读过程进行Perf分析之后。我们在如下三个方面进行改进尝试(1)数据页的编码及查找指令优化 (2) 降低BufferPool的管理开销(3)优化多核上的多线程运行的Cache冲刷问题,最终获得了整体124%的读性能提升。

接下来我们将详述这三个问题的根源以及我们的优化方法,最后通过实验对每一步优化手段的收益进行了评估。考虑到这三个问题在

java读取文件效率优化_java 读文件 性能相关推荐

  1. java读取字节效率最高_java中字节流读写和字符流读写怎么理解?哪个效率更高...

    我们java中的io流分为两大类,字节流和字符流. 可是在具体使用的时候怎么视情况进行使用? 怎么使用更加有效率? 有两个例子,帮忙看看解释一下,用哪种比较有效率以及适用情况. 下面是用字符流进行读写 ...

  2. 读一个文件的java程序_java 读文件的几种方法(一)

    先前使用一直很混乱的使用过这些方法,但都没有好好做过总结. 这两天趁有空,小结一下. 1.输入输出流 说起 java的 读写文件不得不说java中的输入输出流对象, 被读取的对象为输入流(如某个文件, ...

  3. Java读 写文本_java读文件写文件的方法

    java读文件写文件的方法 有的时候经常为真么读写文件最合理发愁,因为JAVA提过读写文件的方式太多了(C更甚至,fopen & open又有多少人傻傻分不清,更别说ReadFile了).今天 ...

  4. java读取mysql数据库配置文件_java读取properties文件的方法

    Java 读写Properties配置文件 Java 读写Properties配置文件 1.Properties类与Properties配置文件 Properties类继承自Hashtable类并且实 ...

  5. java读取一个应用程序_Java IO – 在写入其他应用程序时读取一个大文件

    我想使用java来读取weblogic日志文件,而weblogic正在将日志写入其中(缓冲),但我只想读取内容,当我开始阅读它时. 我怎样才能做到这一点 ? public class DemoRead ...

  6. Java读取、写入、处理Excel文件中的数据

    在日常工作中,我们常常会进行文件读写操作,除去我们最常用的纯文本文件读写,更多时候我们需要对Excel中的数据进行读取操作,本文将介绍Excel读写的常用方法,希望对大家学习Java读写Excel会有 ...

  7. java图片上传下载_java实现文件的上传和下载

    1. servlet 如何实现文件的上传和下载? 1.1上传文件 参考自:http://blog.csdn.net/hzc543806053/article/details/7524491 通过前台选 ...

  8. java实现文件名过滤器接口_Java使用文件过滤器FileFilter、FilenameFilter搜索文件

    搜索文件优化,使用文件过滤器来搜索文件 我们可以使用过滤器来实现在某一目录下指定文件格式的搜索 在File类中有两个和ListFiles重载的方法,方法的参数传递的就是过滤器 一.FileFilter ...

  9. java 文件转换字符串_java字符串文件互相转换

    Java字符串与文件的互转 Java中有时候需要读取一个文本类的文件,将其转换为字符串,然后做进一步处理.Java中没有现成的API方法,自己手动实现一个,大家来分享. 一.字符串转换为文件 /** ...

  10. java 读取使用keytool生产的keystore文件

    windows 环境下,使用keytool 生产keystore文件 keytool -genkeypair -keyalg RSA -keysize 1024 -sigalg SHA1withRSA ...

最新文章

  1. liunx上安装nacos
  2. 【安全牛学习笔记】其他途径
  3. CSS垂直翻转/水平翻转提高web页面资源重用性
  4. ORA-01172,ORA-01151
  5. python连接mysql_Python 连接mysql与impala
  6. python pandas 排序_python – pandas:单独对每列进行排序
  7. Freemodbus 1.5
  8. R. Shankar《Principles of Quantum Mechanics (2nd)》(山卡《量子力学原理(第二版)》)双语目录
  9. 华为认证的考试费用和重认证
  10. Photoshop CS6下载包下载 及破解安装教程
  11. html语言黄色,HTML黄色欧美形式音频工作室网页模板代码
  12. HTML菜单中有关selected=true和setAttribute(“selected“,“selected“)的异同以及selected设置无法生效的问题解析
  13. Idea设置全白色 背景
  14. 俞渝手撕李国庆:他是同性恋,李回应:变态精神病患者!大量细节惊呆网友...
  15. Android性能优化——图片压缩的终极选择libjpeg-turbo
  16. 航空航天与国防数字化验证解决方案 | 达索系统百世慧®
  17. java ClockRepairs_使用DBMS_REPAIR包修复坏块(一)
  18. 【机器学习】`ConvergenceWarning: Liblinear failed to converge, increase the number of iterations`问题记录
  19. ibmt60驱动安装
  20. 硅谷之所以骨子里与众不同,是因为有这七件事

热门文章

  1. MySQL查询所有叶子节点
  2. Unity 快速实现镜子效果
  3. 关于4442卡的读密码问题
  4. MultiDock——专门为 macOS 设计的增强型 Dock
  5. APK大小查看、定义、反编译、如何安装解压
  6. OLED屏显和汉字点阵编码原理
  7. STM32F103系列控制的OLED IIC 4针
  8. 4、wpf 打包为exe或者msi的安装程序
  9. 网络安全从小白到专家
  10. ArcGIS 10 SP5 (Desktop, Engine, Server)中文版 补丁