Hao Chen

cighao@gmail.com

  • About ME
  • Archives
  • Exploring World
Search

Hao Chen

cighao@gmail.com

  • About ME
  • Archives
  • Exploring World

论文阅读:针对闪存的成本感知的缓冲区管理策略(DASFAA 2015)

2016-08-19

目录 [+]

  1. 1. Abstract
  2. 2. Introduction
  3. 3. 问题的定义
    1. 符号说明
    2. 闪存设备的IO模型
    3. frequency和recency的结合
  4. 4. 成本模型
  5. 5. 实现细节
    1. 数据结构和算法
  6. References

原文:Jiang Z, Zhang Y, Wang J, et al. A cost-aware buffer management policy for flash-based storage devices[C]. International Conference on Database Systems for Advanced Applications. Springer International Publishing, 2015: 175-190. [下载]

1. Abstract

由于读写的不对称性,传统的基于磁盘的缓冲区管理策略在闪存中并不能达到最优。这篇文章提出了一种针对闪存的名叫 CARF 的成本感知的缓冲区管理策略。提出了一种新颖的低开销的能够准确地确定驱逐页的成本模型。而且,这个成本模型能区分读写操作,还有更好的扫描抵抗力(scan resistance)。基于人工的trace和基准测试的trace表明,CARF的性能比当前最好的闪存管理策略还要高27.9%。

2. Introduction

传统的基于磁盘的缓冲区管理策略利用了请求的时间局部性来减少磁盘访问。所以传统的缓冲区管理的主要目标是减少缺页率。然而,在闪存中,由于闪存固有的读写不对称性,最小化缺页率并不一定能带来更好的 I0 性能。所以我们应该用总的 IO 开销来衡量基于闪存的存储器的缓冲区管理策略的有效性,而不是以命中率作为主要标准。

除了 FOR[1],前人的研究中没有使用成本感知的替换策略。FOR 和它的近似版本 FOR+ 提供了一个考虑了页面状态和将来操作的页面权重指标来选择牺牲页(victim page)。但是他的权重指标的有很大的计算开销。为了解决这个问题,这篇文章提出了名叫 Cost-aware Algorithm combining Recency and Frequency (CARF) 的成本感知的缓冲区替换策略。这个成本模型的计算开销很低,所以很实用。我们根据这个模型实现了轻量级的数据结构。

本篇文章的贡献如下:

  • 提出了针对闪存的成本感知的缓冲区管理策略CARF,该策略利用准确的页面权重指标来选择牺牲页。
  • 综合考虑访问频率(frequency)和距离上一次访问的时间间隔(recency)来设计一种新颖的成本模型作为权重指标。
  • 实现了低开销和扫描抵抗能力强的CARF。

3. 问题的定义

符号说明

Cr/Cw:一个读写操作的平均开销。

Nr/Nw:读写操作的总数

R:闪存的IO不对称性因子

m:缓冲区大小

N:DBMS中页大数量

ti:指定页的第i个请求的时间。

xi:指定页的第i个时间跨度

tc:当前的全局时间。

闪存设备的IO模型

总的 IO 开销 Costio=Cr∗Nr+Cw∗Nw=Cr∗(Nr+R∗Nw)

frequency和recency的结合

根据前人的研究[1][2],一个好的缓冲区管理策略应该综合考虑距离上一次访问的时间间隔(recency)和访问频率(frequency)来充分利用空间和时间的局部性。为了实现这个目录,这篇文章建立了一个闪存模型来衡量缓冲区中每个页面的热度(hotness),然后根据flash的IO模型和这个成本模型来设计一个替换算法。符号说明如下:

RequestSequence:访问页面的一个序列。

GlobalTime:系统开始以来的请求的页面的数量。

TimeSet:假设在请求序列中页面p有k个请求,第i个请求在全局时间 tPi。定义页面p的时间集合(time set)为T=tP1,tP2,…,tPk。这个时间集合反映了该页的访问频率。

TimeSpan:假设页面p的时间集合T=t1,t2,…,tk,那么 ti 的时间跨度就是请求时间ti和当前系统时间的间隔。记为:xi=tc−ti(1≤i≤k)。时间跨度反映了一个页面距离上一次访问的时间间隔。

假设页面p的时间集合T=t1,t2,…,tk,(t1<t2<…<tk≤tc),那么该页面的权重(page weight)可以根据下面的公式计算得到:

PWt(p)=n∑i=1Wx(i)=n∑i=1W(tc−ti)

函数 w(x) 是用来计算时间间隔x在当前时间下对页面权重的贡献。

4. 成本模型

定义了一个 RF 模型来计算页面权重,RF 模型为 CARF 定义了基本的权重指标,这里没有考虑读写不对称性。

如果在tc时刻,需要从缓冲区中驱逐一个页,只需要计算缓冲区中每个页的权重,然后驱逐权重最低的页。权重函数的选择需要很慎重,它决定了 recency 和 frequency 对页面权重贡献的比例。一个好的权重函数应该有下面的属性:

  • ∀x∈N,W(x)>0. 也就是说,任意页面的权重应该是大于0的。
  • ∀x∈N,W(x)′≤0. 也就是说,任意页面的权重应该是单调不增的,因为时间跨度越长,说明该页面越有可能不被访问。
  • W(0)=c. 这里c是常量。也就是说当时间跨度为0的时候,权重应该是个常数。

如果用公式(2)计算权重的话,需要很大的开销去记录请求信息。所以这里利用了迭代的思想,利用 ti−1 时刻的结果来计算 ti 时刻的结果。

引理1:如果 W(x) 满足,∀x,y∈N,W(x+y)=W(x)∗W(y),那么 PWt(p) 可以由 PWti−1(p) 计算出。

由引理1我们可以得到下面的引理。

引理2:

PWti(p)=W(0)+W(yi)∗PWti−1(p)

结合引理1和上面提到的权重函数的属性,发现下面的公式满足要求:

W(x)=a^x,(0<a≤1) 

当 a=1 时,W(x) = 1。这时 recency 对权重没有贡献,当前模型也就变成了 LFU。

当 a ∈ (0,0.5] 时,W(x) 满足 ∀i,W(i)>∑ooj=i+1W(j)。这时 frequency 对权重没有贡献,当前模型也就变成了 LRU。

当 a ∈ (0.5,1) 时,recency 和 frequency 对权重都有贡献。

5. 实现细节

这里将 RF 模型和 IO 模型相结合。IO模型考虑了读写不对称性,成本模型考虑到了页面的权重。为了在计算页面权重时,考虑到读写不对称性,需要像前人的研究一样考虑页面的状态。如果一个页面上一次访问时是干净的,这一次被修改了,那么它会对权重有一个很大的贡献。用一个 Lastdirty 标签来维持给定页面在上一次访问时的状态。最后定义一个 asymmetry 函数来表示读写不对称性对页面权重的影响。

Rtc(p)={R,lastdirty(p) = false∧ modified at tc1,otherwise

基于以上的考虑,需要记录下面的信息来帮助计算页面的权重:

  • Lasttime(p): 上一次请求页面p的时间。
  • Lastweight(p): 页面p在上一次请求时的权重。
  • Lastdirty(p): 页面p在上一次请求中是否被修改。

因此,

FPWtc(p)=Rtc(p)∗[W(0)+W(tc−Lasttime(p))∗Lastweight(p)]

当缓冲区满的时候就可以根据公式4来选择权重最小的页面去驱逐。

如果直接用公式4并不是很恰当,因为当缓冲区慢的时候,每一个时间步长之后所有页面的权重都要更新。由 W(x) 的属性,可以得到:

引理3: 任何的页面p和q,如果FPWtc(p)>FPWtc(q) 且p和q在tc之后都没被访问,那么∀t>tc,FPWt(p)>FPWt(q)

因为,如果两个页面都没有被访问过,他们之间的相对顺序不会改变,所以我们只需要改变被访问的权重就行了。

数据结构和算法

可以用最小堆来实现CARF算法,每次要发生替换的时候,就用新的页面来替换堆的根部的页面,然后自顶向下地调整堆来维持 Lastweight 的顺序。每次命中的时候,命中页的权重会被更新,然后自顶向下地更新这个子堆。这样选择驱逐页的时间复杂度是O(1),还需要O(log m)的时间复杂度去调整堆,这个时间复杂度比LFU好,比LRU差。因此,我们需要在考虑页面权重的时候减少时间复杂度。

可以通过 RF 模型的竞争分析来解决这个问题。

定理1:当 a=1 时,RF 模型不是竞争的;当 a∈[0.5,1) 时,RF模型是 m−1+⌈log(1−a)log(a)⌉−competitive

定理2:假设页面 p 的最近一次访问是在 t 时刻,那么存在一个最小的时间 Tmin=⌈lg(1−a)lg(a)⌉,只要 tc−t>Tmin,无论 PWt(p)多大,PWtc(p)<1 总是成立。

那么我们可以根据定理2来解决这个问题,因为 W(0)=1,所以当一个页面的权重大于 1 时,那么它最近的请求肯定是在 Tmin 的时间单元內。所以我们只要维持 Tmin 的页面到优先队列中。可以把缓冲区分为两个部分来减少计算开销。上层队列是一个最小堆,下层队列是 m−Tmin个页面按LRU方式组织成的链表。

References

[1] Lv, Y., Cui, B., He, B., Chen, X.: Operation-aware buffer management in flashbased systems. In: SIGMOD, pp. 13–24 (2011)

[2] Effelsberg, W., Harder, T.: Principles of database buffer management. TODS 9(4),560–595 (1984)

  • SSD
  • 论文阅读
  • 学术

扫一扫,分享到微信

微信分享二维码
论文阅读:基于闪存的缓冲区管理算法
暴力破解 wifi 密码
  1. 1. 1. Abstract
  2. 2. 2. Introduction
  3. 3. 3. 问题的定义
    1. 3.1. 符号说明
    2. 3.2. 闪存设备的IO模型
    3. 3.3. frequency和recency的结合
  4. 4. 4. 成本模型
  5. 5. 5. 实现细节
    1. 5.1. 数据结构和算法
  6. 6. References

Related Issues not found

Please contact @cighao to initialize the comment

© 2025 Hao Chen
Hexo Theme Yilia by Litten
  • Search

tag:

  • Javascript
  • Web 前端
  • Matlab
  • 遗传算法
  • 算法
  • Hexo
  • 计算机
  • Linux IO
  • Cassandra
  • 数论
  • SSD
  • NVMe
  • Database
  • 论文阅读
  • Disksim
  • flashsim
  • Ubuntu
  • 画图
  • 信号处理
  • 黑客
  • Mysql
  • Python
  • 爬虫
  • 粒子群算法
  • 模拟退火算法
  • Neo4j
  • Ngrok
  • SPDK
  • RocksDB
  • Java
  • Matplotlib
  • openstack swift
  • 分布式存储
  • 对象存储
  • 学术
  • Tool
  • C语言
  • 正则表达式
  • 端口扫描
  • 二层规划
  • 排序
  • 随笔
  • Nodejs
  • Tools
  • 数据库

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 数据库中的热点行优化 (SIGMOD'21 Paper 解读)

    2022-02-28

    #Database#论文阅读

  • NVMe SSD中namespace的介绍和创建

    2020-04-12

    #SSD#NVMe

  • 快速搭建 L2TP VPN 服务器

    2019-11-20

    #计算机#Tool

  • SPDK 介绍(二):SPDK 相关博客

    2019-10-25

    #SPDK

  • SPDK 介绍(一):使用 FIO 测试 SPDK

    2019-10-23

    #SPDK

  • RocksDB 介绍(一):相关博客

    2019-10-22

    #RocksDB

  • Linux IO 相关资料

    2019-09-29

    #计算机#Linux IO

  • Cassandra 介绍(三):Commitlog 介绍(1)

    2019-09-26

    #Cassandra

  • Cassandra 介绍(二):Blogs

    2019-09-22

    #Cassandra

  • Cassandra 介绍(一):Install and test with YCSB

    2019-09-19

    #Cassandra

  • 阿里数据库内核月报(汇总)

    2019-09-03

    #数据库

  • Neo4j 介绍(五):使用 java 访问 neo4j

    2019-04-24

    #Neo4j

  • Neo4j 介绍(四):关于 neo4j 的一些博客

    2019-04-21

    #Neo4j

  • Neo4j 介绍(三):使用 python 访问 neo4j

    2019-04-21

    #Neo4j

  • Neo4j 介绍(二):main 函数

    2019-04-13

    #Neo4j

  • 日常遇到的一些小问题的解决方案

    2019-03-29

    #计算机#Tool

  • Neo4j 介绍(一):安装

    2019-03-21

    #Neo4j

  • matlab 画图(十): 分组和堆叠的条形图

    2019-01-13

    #Matlab#画图

  • 论文写作常用工具

    2018-11-20

    #Tools

  • Openstack Swift学习(八):配置ntp

    2018-09-29

    #openstack swift#分布式存储#对象存储

  • Openstack Swift学习(七):ssbench 使用

    2018-09-29

    #openstack swift#分布式存储#对象存储

  • Openstack Swift学习(六):服务启动源码分析

    2018-09-29

    #openstack swift#分布式存储#对象存储

  • Openstack Swift学习(五):debug 总结

    2018-09-29

    #openstack swift#分布式存储#对象存储

  • Openstack Swift学习(四):中间件

    2018-09-29

    #openstack swift#分布式存储#对象存储

  • Openstack Swift学习(三):log 配置

    2018-09-22

    #openstack swift#分布式存储#对象存储

  • Openstack Swift学习(二):相关文档

    2018-07-20

    #openstack swift#分布式存储#对象存储

  • Openstack Swift学习(一):安装

    2018-07-12

    #openstack swift#分布式存储#对象存储

  • 在 linux 上首次使用 SSD

    2017-03-20

    #SSD

  • disksim-3.0 with flashsim 源码分析(六):垃圾回收

    2017-02-27

    #SSD#Disksim#flashsim

  • disksim-3.0 with flashsim 源码分析(五):写操作

    2017-02-27

    #SSD#Disksim#flashsim

  • disksim-3.0 with flashsim 源码分析(四):初始化

    2017-02-27

    #SSD#Disksim#flashsim

  • disksim-3.0 with flashsim 源码分析(三):callFsim()函数介绍

    2017-02-21

    #SSD#Disksim#flashsim

  • disksim-3.0 with flashsim 源码分析(二):DFTL 中的 cache

    2016-12-10

    #SSD#Disksim#flashsim

  • disksim-3.0 with flashsim 源码分析(一):disksim-3.0 和 flashsim 的安装

    2016-12-06

    #SSD#Disksim#flashsim

  • flashsim 源码分析(五): flashsim 的初始化

    2016-11-22

    #SSD#flashsim

  • flashsim 源码分析(四): 总线上锁机制的实现

    2016-11-13

    #SSD#flashsim

  • flashsim 源码分析(三): 总线通道中的交叉

    2016-11-11

    #SSD#flashsim

  • flashsim 源码分析(二): flashsim 中的面向对象设计

    2016-11-09

    #SSD#flashsim

  • flashsim 源码分析(一):安装 flashsim

    2016-11-08

    #SSD#flashsim

  • 利用概率算法求解八皇后问题

    2016-10-20

    #算法

  • 回溯法求解八皇后问题

    2016-10-20

    #算法

  • 利用概率算法估算集合大小

    2016-10-17

    #算法

  • 神奇的卡特兰数

    2016-10-07

    #算法#数论

  • 论文阅读:基于闪存的缓冲区管理算法

    2016-08-23

    #SSD#论文阅读#学术

  • 论文阅读:针对闪存的成本感知的缓冲区管理策略(DASFAA 2015)

    2016-08-19

    #SSD#论文阅读#学术

  • 暴力破解 wifi 密码

    2016-08-04

    #黑客

  • 论文阅读:SSD内部多级并行性的探索和利用(TOC 2013)

    2016-07-20

    #SSD#论文阅读#学术

  • 论文阅读:SSD中基于PSO的缓冲区管理算法(ICITCS 2015)

    2016-07-19

    #SSD#论文阅读#学术

  • 利用二级指针删除链表节点

    2016-07-09

    #算法

  • 抓包获取简书的登录密码

    2016-07-07

    #黑客

  • disksim with ssdmodel 源码解析(二十二):读写和擦除时间的计算

    2016-06-28

    #SSD#Disksim

  • 求离散采样信号的波峰和波谷

    2016-05-31

    #信号处理

  • matlab 画图(九): 横坐标标签倾斜设置

    2016-05-13

    #Matlab#画图

  • matlab 画图(八): 双坐标绘图

    2016-04-29

    #Matlab#画图

  • matlab 画图(七): 扇形图

    2016-04-24

    #Matlab#画图

  • matlab 画图(六): 横向柱状图

    2016-04-20

    #Matlab#画图

  • matlab 画图(五): 垂直柱状图

    2016-04-17

    #Matlab#画图

  • matlab 画图(四): 句柄作图示例

    2016-04-16

    #Matlab#画图

  • disksim with ssdmodel 源码解析(二十一):warm up ssd

    2016-04-15

    #SSD#Disksim

  • matlab 画图(三): 图形句柄

    2016-04-14

    #Matlab#画图

  • matlab 画图(二): 基本作图技巧

    2016-04-13

    #Matlab#画图

  • disksim with ssdmodel 源码解析(二十):统计结果的提取

    2016-04-12

    #SSD#Disksim

  • matlab 画图(一): 线条样式设计

    2016-04-11

    #Matlab#画图

  • disksim with ssdmodel 源码解析(十九):ssd 的初始化

    2016-03-31

    #SSD#Disksim

  • disksim with ssdmodel 源码解析(十八):GC 分析(五)

    2016-03-30

    #SSD#Disksim

  • disksim with ssdmodel 源码解析(十七):GC 分析(四)

    2016-03-30

    #SSD#Disksim

  • SSD 编程学习笔记(一)

    2016-03-29

    #SSD

  • disksim with ssdmodel 源码解析(十六):GC 分析(三)

    2016-03-29

    #SSD#Disksim

  • disksim with ssdmodel 源码解析(十五):GC 分析(二)

    2016-03-27

    #SSD#Disksim

  • disksim with ssdmodel 源码解析(十四):ssd_activate_elem函数分析

    2016-03-24

    #SSD#Disksim

  • disksim with ssdmodel 源码解析(十三):如何兼容64位系统

    2016-03-23

    #SSD#Disksim

  • disksim with ssdmodel 源码解析(十二):写操作分析

    2016-03-23

    #SSD#Disksim

  • disksim with ssdmodel 源码解析(十一):地址映射

    2016-03-23

    #SSD#Disksim

  • matplotlib 画图(四):text 和 label 的设置

    2016-03-22

    #画图#Matplotlib

  • disksim with ssdmodel 源码解析(十):GC分析(一)

    2016-03-19

    #SSD#Disksim

  • disksim with ssdmodel 源码解析(九):syssim_driver 系统级接口(二)

    2016-03-19

    #SSD#Disksim

  • disksim with ssdmodel 源码解析(八):syssim_driver 系统级接口(一)

    2016-03-19

    #SSD#Disksim

  • matplotlib 画图(三):线的连续与间断

    2016-03-19

    #画图#Matplotlib

  • disksim with ssdmodel 源码解析(七):block的组织形式

    2016-03-18

    #SSD#Disksim

  • matplotlib 画图(二):图形填充

    2016-03-17

    #画图#Matplotlib

  • disksim with ssdmodel 源码解析(六):disksim_setup_disksim

    2016-03-16

    #SSD#Disksim

  • disksim with ssdmodel 源码解析(五):程序流程介绍

    2016-03-16

    #SSD#Disksim

  • matplotlib 画图(一):横向柱状图

    2016-03-16

    #画图#Matplotlib

  • 一种时间复杂度为 O(N) 整数排序算法

    2016-03-15

    #算法#排序

  • disksim with ssdmodel 源码解析(四):ssd_event_arrive 函数的介绍

    2016-03-13

    #SSD#Disksim

  • disksim with ssdmodel 源码解析(三):初次使用介绍

    2016-03-12

    #SSD#Disksim

  • disksim with ssdmodel 源码解析(二):输入参数的介绍

    2016-03-06

    #SSD#Disksim

  • 在 Hexo 中给文章添加版权信息

    2016-03-01

    #Hexo

  • python中的爬虫神器 XPath 介绍

    2016-03-01

    #Python#爬虫

  • 程序员得长多高

    2016-02-26

    #Python#爬虫#随笔

  • Hexo 博客添加打赏功能

    2016-02-23

    #Hexo

  • Hexo 主题优化

    2016-02-14

    #Hexo

  • 利用 HttpClient 刷 CSDN 博客文章浏览量

    2016-02-04

    #Java

  • nodejs 中模块使用的介绍

    2016-01-10

    #Nodejs

  • 利用 javascript 实现回到顶部效果

    2016-01-09

    #Javascript#Web 前端

  • Ngrok: 一个提供内网到外网映射的工具

    2015-12-18

    #Ngrok

  • 如何给数百万考生的成绩排序

    2015-12-17

    #算法#排序

  • 在 Hexo 中给文章添加目录

    2015-12-13

    #Hexo

  • Java 动态加载类

    2015-12-06

    #Java

  • python 中安装 requests 模块

    2015-12-05

    #Python#爬虫

  • 利用模拟退火算法求解TSP问题

    2015-12-04

    #算法#模拟退火算法

  • 模拟退火算法简介

    2015-12-03

    #算法#模拟退火算法

  • 粒子群优化算法简介

    2015-11-30

    #算法#粒子群算法

  • Hexo yilia主题添加网站访客人数统计

    2015-11-30

    #Hexo

  • 利用粒子群算法求解非线性二层规划问题

    2015-11-07

    #算法#粒子群算法#二层规划

  • 遗传算法的 matlab 实现

    2015-11-03

    #Matlab#遗传算法#算法

  • 基于javascript实现的2048小游戏

    2015-11-02

    #Javascript#Web 前端

  • 随机生成正整数 1-n 的一个排列

    2015-10-11

    #算法#C语言

  • disksim with ssdmodel 源码解析(一):disksim及ssdmodel模块扩展的安装

    2015-09-09

    #SSD#Disksim#Ubuntu

  • 固态硬盘(SSD)原理及相关介绍

    2015-08-31

    #SSD

  • windows7下安装ubuntu及相关问题的解决方案

    2015-08-27

    #Ubuntu

  • python 正则表达式的使用

    2015-08-22

    #Python#爬虫#正则表达式

  • 基于 python socket 的端口扫描程序

    2015-03-29

    #Python#端口扫描

  • mysql windows 下zip安装

    2015-03-29

    #Mysql