IO Workload Characterization Revisited: A Data-Mining Approach


本文发表于:
IEEE TRANSACTIONS ON COMPUTERS, VOL. 63, NO. 12, DECEMBER 2014
IO Workload Characterization Revisited: A Data-Mining Approach

摘要

在过去的几十年中,IO工作负载表征一直是操作系统和存储社区的关键问题。即便如此,由于继续引入新型的存储设备(如固态驱动器(SSD)),该问题仍值得研究,该存储设备具有与传统硬盘不同的特性。我们提出了新颖的IO工作负载表征和分类方案,旨在解决三个主要问题:

  • 确定用于IO流量分析的正确的挖掘算法
  • 确定可以正确表征IO工作负载的功能集
  • 定义基本IO流量类别的最新存储设备可以利用其内部管理。

提出的表征方案提取可以有效表示IO工作负载特征的基本属性,并基于这些属性,使用各种聚类算法找到一般工作负载中的代表性访问模式。提出的分类方案找到了给定工作负载的少量代表性模式,这些模式可以在操作系统的存储堆栈中或存储设备内部用于优化。

关键词:IO工作负载表征,存储和操作系统,SSD,集群,分类

1 介绍

自2013以来,SSD 已经成为移动平台,笔记本,甚至企业服务器中的主要存储设备。
除了没有机械部件而表现出的低延迟以外,NAND闪存还在几个关键方面与动态随机存取存储器(DRAM)和硬盘驱动器(HDD)区别开来:
(i) 读写延迟的不对称性
(ii) 存在擦除操作(即无法覆盖)
(iii) 有限的擦除/写入周期。
基于NAND的SSD包含一个称为闪存转换层(FTL)的软件实体,用于隐藏底层NAND设备的缺点并将逻辑块阵列导出到文件系统。 FTL算法的精心设计,以最大程度地提高IO性能(延迟和带宽)并延长NAND单元的使用寿命。

SSD硬件(例如,内部并行性和缓冲区大小)和软件(例如,地址映射[6]-[10],损耗均衡[11]-[13]和垃圾回收算法[13],[14]的高效设计 ])要求对底层I/O工作负载有扎实的了解。 但是,HDD和虚拟内存的现有表征工作无法满足基于NAND的存储设备的表征要求。 在过去的几十年中,IO特性已经在操作系统和存储系统社区中进行了深入研究,在基于HDD的存储方面已经达到足够的成熟度有关系统[15]-[19]。

工程师精心选择了表征的属性,适当地结合了硬盘的物理特征。 对于HDD,工作负载的空间特性是首要考虑的问题,因为磁头移动开销是IO延迟和性能的主要部分。 因此,用于HDD的IO表征研究集中于确定块访问序列的空间特征(例如,随机性)。 对于内存子系统(例如缓冲区缓存和虚拟内存),它是关键在于表征存储器访问的时间方面(例如工作集),因为这决定了缓存未命中的行为。

基于NAND的SSD进一步使我们考虑了三维空间中IO特性的概念:空间特性(即访问位置:随机与顺序),时间特性(即给定数据的访问频率:热与冷)以及大小特征(即访问大小:单个块与多个块)。 根据传入工作负载的特征,SSD 控制器可以调整用于关键内务处理任务的参数,例如日志块管理[20],映射粒度决策[21]和垃圾回收的收集者选择[13],[14]。

一些方法提出了在分析IO工作负载时检查IO内容(例如,用于在SSD 控制器中执行重复数据删除[22]-[24]和用于设计缓存[25]-[27])。 尽管局部性值可广泛用于确定缓存和重复数据删除方案,但“值”本身高度依赖于上下文。
本文 工作:
将重点放在分类工作负载的通用框架上,仅包括IO的空间,时间和大小方面,而无需实际检查IO的内容就可以对其进行分析。 在内容检查可行的情况下,在工作负载表征和分类中考虑内容局部性可能会产生更好的结果。

具有与基于硬盘的存储设备不同的物理特性的基于NAND的存储设备的进步,要求一种全新的表征IO工作负载的方式。在本文中,我们将从新兴的基于NAND的存储设备的角度重新审视了解和确定现代IO工作负载的基本组成的问题。我们尤其致力于解决以下特定问题:
(i) 为了表征IO工作负载,正确的群集算法是什么?
(ii) 有效表征IO工作负载的最少特征集是什么?
(iii)我们应该如何验证既定课程的有效性?
这些问题是紧密相关的,应该整体解决。为此,我们采用了一种数据挖掘方法。我们对结果的全面性进行了相当广泛的研究:我们检查了11种集群算法和20种具有数万个IO跟踪的工作负载功能。我们以简化的方式应用无监督和有监督的学习方法。特别是,我们首先应用无监督学习,以使现有的领域知识不会对建立一组流量类别产生任何偏见。

对于固态硬盘,我们可以将所提出的方法应用于混合映射中的智能日志块管理,垃圾回收中的收集目标者选择以及多粒度映射中的映射粒度决策,尽管本文并未介绍此类应用的详细信息。 我们进一步相信,所提出的方法可以应用于IO优化的其他类型的存储设备。

2 研究背景

2.1 相关工作

数据挖掘已用于分析和评估计算机系统的各个方面。 Lakhina 等使用基于熵的无监督学习来检测网络流量中的异常[28]。 Won等应用AdaBoost技术[29]对软实时IO流量进行分类[30]。 Park等运用Plackett-Burgman设计来提取文件系统基准测试中的主要特征[31]。

关于IO工作负载的表征,已经进行了有关表征文件系统访问模式和活动轨迹的经验研究[32],[33]-[35]。 针对Web服务器[36],[37],决策支持系统[38]和个人计算机[39],存在特定于应用程序的工作负载表征工作。

这些方法对有限的属性集(例如,读/写比,IO大小分布,IO的随机性)进行简单的统计,因此常常无法正确地表征不同属性之间的相关性

工作负载分析和分类可用于IO堆栈的不同层:

  • 块设备驱动中使用数据挖掘算法进行磁盘调度,数据布局和预取
  • 将分析功能嵌入文件系统层内部,该功能允许通过检查工作负载访问模式来推断文件系统元数据区域的位置
  • 将分析功能嵌入存储设备的固件中,并旨在利用工作负载特性来控制存储设备的内部行为(例如,块分配,重试次数和纠错编码)。

已经提出了复杂的工作量生成器和测量工具来设计模式丰富的微基准。 这些工具对于以相当全面的方式产生任意工作负载模式很有用。 但是,如果不了解实际工作负载中的基本模式,就很难生成合适的IO工作负载以进行准确的性能评估。

IO工作负载表征的所有先前方法中,最重要的限制可能是这些方法仅将HDD视为存储设备。 旋转媒体的工作负载表征相对简单,因为有关设备性能的主要因素是搜寻开销。 因此,根据顺序性和随机性来表征工作负载已经提供了足够的要素,即使不是很完整,也可以评估文件和存储堆栈的性能。

既然基于NAND 的SSD逐渐成为替换HDD的有力候选者,则有必要根据更丰富的属性来表征工作负载,以准确地测量文件和存储堆栈的性能。 最近,提出了一种称为uFlip [47],[48]的工作负载生成器,它可以生成更多种类的工作负载,这些工作负载专门用于检查基于NAND的SSD的性能。 但是,uFlip中使用的基本IO模式并非来自实际工作负载。 因此,尚不知道这些模式对于SSD来说是否健全且完整。

这项工作的目的是从NAND 存储的角度找到IO工作负载的典型模式。 在设计基于NAND的存储设备的各种组件时(例如,地址映射,损耗均衡,垃圾回收,写缓冲区管理和其他关键要素),将利用这些模式。

2.2 FTL

与DRAM和HDD相比,NAND 闪存具有独特的特性。 特别是,闪存转换层(FTL)[6]-[10]在基于NAND的SSD的操作中起着关键作用。 FTL的主要目标是让现有软件将SSD识别为传统的,类似于HDD的块设备。 FTL执行三个主要任务:

  • FTL 维护从逻辑地址到物理地址的转换表(即地址映射)
  • FTL 将有效页面合并为一个块,从而使无效页面可以重置和重用页面(即垃圾回收)
  • FTL 通过适当选择物理块来平衡块的磨损(即磨损均衡)。

为了最大程度地提高IO性能(延迟和带宽)并延 长NAND 寿命,FTL设计人员应精心设计算法,以选择用于写入的目标块,确定用于页面合并的剔除块以及确定何时执行此类合并。

FTL 的成功在于正确识别传入流量并有效优化其行为。结果,在FTL 算法的上下文中,已经有各种方法来利用IO工作负载的空间,时间和大小方面。

  • 通过为顺序工作负载和随机工作负载分配单独的日志块并进行不同的管理,我们可以显着减少混合映射中合并日志块的开销[6]。
  • 根据[7],可以根据数据的热度维护单独的日志块区域,从而显着提高日志块利用率和整体系统性能。
  • 可以通过采用不同的映射粒度来减小映射表的大小,从而利用传入工作负载的IO大小分布[49]。

尽管这些方法是开创性的,但它们在对工作负载进行分类时表现出不令人满意的性能,通常会导致频繁的错误分类。我们可以得出结论,显然需要更精细的IO特性描述框架来进一步推进SSD 技术。

2.3 工作负载分析在SSD 中的应用

我们可以通过多种方式利用IO工作负载分析结果来优化基于NAND 的SSD 的性能。 我们在这里提出一些想法:提高写入性能减少FTL映射信息以及改善垃圾回收。 这些想法的实际实施将是我们未来工作的一部分。

如第4.2节所述,我们以写缓冲区的大小为单位查看和收集IO trace,因为该大小对应于FTL 可以直接管理以有效执行闪存写操作的最大大小。 如果发现某些写模式适合快速写操作(例如,完全顺序模式),则FTL可以重新排序并合并临时存储在写缓冲区中的IO数据页,将其转换为可以改善写操作的模式之一 性能。

此外,我们可以通过工作负载模式分析显著减少FTL映射信息的数量(映射表的大小)。 鉴于SSD 的容量在不断增长,因此对于TB级SSD使用传统的页面映射方案将需要千兆级映射信息。 我们可以使用粗粒度映射,例如块映射,但这会大大降低随机写入性能。 对于很少发生随机写入的数据(例如,多媒体数据),我们最好使用粗粒度映射;对于频繁发生随机写入的数据(例如,文件系统元数据),我们最好依靠细粒度映射,例如 作为页面映射。 如果FTL可以自动区分和分类不同的数据类型,则它可以为每种数据类型确定最佳的映射粒度,并最大程度地减少映射信息的数量,同时最大程度地降低IO性能的下降。

除此,我们可以通过将IO工作负载分析发现的模式应用于数据分发来提高垃圾收集的性能。 在最新的SSD中,NAND 闪存芯片通常配置为多个通道,每个通道都由多种方式组成。 为了利用这种多通道/多路架构,SSD 控制器通过多个通道和方式分配写请求。这样会将数据分散在不同的芯片上。 如果以后修改这些数据,则无效数据最终将存在于多个芯片中,这将严重降低垃圾回收性能。 为了缓解这个问题,我们需要将局部性数据保存在同一芯片中,以利用方式交错。

一种解决方案是利用我们的方法发现的顺序随机(SR)模式(请参见表3和图6)。 我们将顺序IO写入单个芯片,从而保持局部性,将随机IO并行写入其余芯片,从而实现方式交错的效果。 更进一步,我们可以将顺序IO分为NAND 块大小的块,然后将它们并行写入不同的芯片。 这将使我们能够在保持局部性的同时达到交织效果(回想一下,擦除单位是一个NAND块)。 这种类型的数据分发可以通过保持局部性的作用,使有效和无效页面存在于不同的块中,并最终对垃圾回收产生积极的影响。

3 总览

图1显示了我们方法的总体流程。
我们的目标是 :查找一组可以表征IO工作负载的代表性模式,并提出一个模型,该模型以后可用于对IO trace进行分类,以进行类优化处理。
在本文中,我们首先专注于定义IO跟踪的这种模式,并基于这些模式构建模型(在图1中标有DESIGN TIME的点划线框内显示)。 然后,我们展示如何基于此模型构造一个简单但准确的分类器。 我们可以将此分类器包括在存储设备的固件中,并在运行时使用它(在标有“运行时间”的框中显示)。

我们首先收集许多IO trace样本,然后将它们数学上表示为各种特征的向量。 然后,在我们方法的第一阶段,我们通过聚类分析矢量化的IO轨迹。 我们的希望是,通过应用无监督学习方法,除了重新发现已知的IO trace之外,我们还可以找到新颖的IO trace模式。 我们将从第一阶段得到的群集称为初始IO trace模式。

基于上一步的聚类结果,我们构建了一个可以表示IO trace特征的基于树的模型。 尽管集群可以使我们了解当今的IO工作负载中会出现哪些类型的模式,但我们发现某些初步模式是多余的或几乎没有实用价值。 我们简化了初步的集群,并定义了一组新的IO类。 然后,由于IO模式类别的分层性质,我们用树结构表示它们。

我们可以应用提出的模型和模式类别来有效地分类传入的工作负载。 我们可以针对每一类IO工作负载优化各种SSD控制器算法,以便控制器根据传入IO的特性(例如,随机与顺序,热与冷,IO访问之间的相关程度,垃圾回收算法[13],[14],日志块合并算法[6]-[9]和损耗均衡[11]- [13]) 进行动态分类。

在这里插入图片描述

4 表征IO Trace

4.1 参数定义

在这里插入图片描述
一条IO trace 由多个IO请求组成,每个IO请求都包含有关起始页的逻辑块地址(LBA),访问类型(读或写)以及要读取或写入的页数的信息。 图2a显示了由五个IO请求组成的trace 示例。 如图2b所示,我们还可以将IO trace表示为页面上的一系列LBA。 我们可以按功能 f : P -> L 表示IO trace,其中P为页的索引集,L为一组LBA。 我们假设P或L是一组非负整数。

我们可以使用以下参数和定义来表征IO trace:

Page Size: 我们假设读/写的单位是页,并且所有trace的页大小都相等(比如4KB)

Trace Size: Trace的大小就是总的页数

Segment: 一个段是在trace中连续的LBA序列。 图2b示出了四个段。 请注意,多个IO请求可以形成一个段。 例如,图2b中的段1由两个IO请求组成:RQ1和RQ2

Break Point(BP): 一个BP是一个Segment的终点。如果   f ( p 1 + 1 ) ≠ f ( p 1 ) + 1 \ f(p1+1)\neq f(p1)+1  f(p1+1)=f(p1)+1,则BP发生在页p1,   p 1 ∈ P \ p1\in P  p1P,在图2b中,用实心圆表示每个BP。 根据定义,BP数与段数相同。

Continued point (CP):一个CP是一个Segment的起点,在同一个trace中延续另一个较早的Segment。如果一个Segment的BP在   p 1 ∈ P \ p1\in P  p1P   f ( p 2 ) = f ( p 1 ) \ f(p2)= f(p1)  f(p2)=f(p1) 并且 p 2 − p 1 > 1 p2 - p1>1 p2p1>1, 那么   p 2 ∈ P \ p2\in P  p2P。例如,图2b中段3的起点是CP。 其他段的起点不是。

Access length:这是每个IO请求导致IO设备读取或写入的页面(或字节)数。 对于由多个IO请求组成的段,段长度是IO请求的访问长度之和。

Virtual segment:它包含两个或多个分段,如果我们删除它们之间的中间页面,它们可以形成一个连续的分段。在图2b中,段1和3形成虚拟段。

Random segment:如果某个段小于用户指定的阈值并且不属于任何虚拟段,则我们将该段称为随机段。 在图2b中,如果用户指定的阈值恰好是段4的长度的两倍,则段2不是随机的,而段4是随机的。

Up- and down-segment:如果段的起始LBA大于上一个段的BP,则我们将此段称为上段。 (下段是相反的。)在图2b中,段2和4是上段,而段3是下段。

4.2 IO Trace 数据收集

我们利用了一个公共数据集[50],其中包含来自两个Web服务器的工作负载(一个服务器托管在美国佛罗里达国际大学CS部门的课程管理系统,另一个服务器托管该部门基于Web的电子邮件访问门户), 电子邮件服务器( FIU 整个CS部门的用户“收件箱”)和文件服务器( NFS 服务器,服务于从事软件开发,测试和实验的小型研究小组的主目录)

此外,我们从具有以下规格的系统中收集IO跟踪数据:Intel Core 2 Duo E6750 CPU,2 GB 400 MHz DDR2 DRAM,Linux 2.6.35-28通用和500 GB Seagate ST3500320AS HDD。 为了生成跨步读取和写入跟踪,我们使用IOzone版本3.308。 我们使用blktrace 工具收集Windows 7安装过程中的IO跟踪,通过MS Word 2007版进行的文本处理,使用Google Chrome和MS Explorer进行的网上冲浪以及下载多媒体文件。

SSD控制器的写缓冲区大小控制观察窗口的大小,以进行分类。 应当调整群集中IO跟踪的长度,以正确合并写入缓冲区的大小。 在我们的研究中,我们假定写缓冲区的大小为32 MB [51],[52],可以容纳8,000个唯一的4 KB页面。 这会将迹线的长度设置为8,000。 我们总共生成了58,758个trace样本,每个样本有8,000个一样的页面。、

为了实现本文所述的IO跟踪分析和数据挖掘算法,我们在64位Windows 7下使用R2010 b版本的MATLAB编程环境(http://www.mathworks.com)。

4.3 特征定义

基于以上定义,我们通过表1中列出的二十个特征来表征每个IO跟踪。
特征F1和F2就页和时间而言表示Trace的长度。
特征F3是最长段的长度。
特征F4-F7表示IO请求,BP,CP和非随机段的总数。
其他特征是比率(F8-F10)和基本统计信息,例如其他特征的算术平均值(F11-F13),范围(F14)和标准偏差(F16-F20)。
利用这些特征,我们将每个IO跟踪样本转换为20维向量,以进行下游分析。 也就是说,我们将输入跟踪数据转换为58,758行(在我们的实验中使用58,758条跟踪)和20列的矩阵,然后对该矩阵进行归一化,以使每列的均值和单位方差为零。

考虑到我们不知道用于最佳IO表征的最佳特征集,我们考虑了各种特征,希望我们可以通过探索各种特征(组合)来发现重要特征。 但是,由于维数的困扰[53](或在高维空间中缺乏数据分离),使用太多特征进行数据挖掘可能会难以在原始特征空间中分离IO Trace。 因此,我们需要选择一组特征以获得更好的聚类结果。 在下一节中,我们将说明如何选择一组可以产生合理聚类结果的特征。

5 通过聚类从IO跟踪中找到代表性的模式

在建立用于对IO trace进行分类的模型之前,我们首先要了解存储系统中将出现哪些类型的IO trace。 所有可能模式的确切数量可能难以确定,但是我们希望可以找到少量代表性模式。 为了以自动的方式总结IO trace的模式,我们需要一种能够处理大量IO跟踪样本并从中查找模式的计算分析工具。 为此,聚类非常适合,因为聚类(作为无监督学习)使我们能够在已知或预期的模式以外,找到新的,以前未知的模式。 当已经确定了可能的类的集合时,分类很有用,但是作为一种有监督的学习技术,与聚类不同,分类不能发现新的模式。

对于IO Trace的聚类分析,我们需要确定特征集和使用的特定聚类算法。 由于最佳特征集因使用哪种聚类算法而异,因此我们需要同时考虑这两个方面以获得最佳结果。 但是,由于搜索空间巨大,因此很难同时优化所有这些特征。 因此,在固定聚类算法的情况下,我们通过特征选择过程确定特征集。 然后,针对确定的特征集,我们找到最佳的聚类算法。

总结:机器学习分为有监督和无监督两种,有监督代表为分类算法,已知类型对输入来进行分类;而无监督以聚类为代表,着重发现新的,未知的类型。

5.1 评估指标

要评估不同的特征集和聚类方法,我们首先需要建立一个可以评估聚类结果质量的指标。 然后,我们搜索使该指标最大化的方案。 在本文中,我们使用silhouette value[54],该值广泛用于对聚类结果进行评分。

对于聚类结果,我们可以为每个聚类样本分配一个silhouette value。 然后,我们可以用所有聚类样本的中值silhouette value表示整个聚类结果。 更具体地说,我们定义样本 i i i 的silhouette 值 s ( i ) s(i) s(i),如下所示[54]:
在这里插入图片描述
其中 a ( i ) a(i) a(i) 表示样本与同一簇内所有其他样本的平均距离, b ( i ) b(i) b(i) 表示最低平均距离。根据定义,silhouette 值的范围从 -1 到 +1,+1表示最佳聚类样本,-1则相反。

5.2 特征选择

特征选择是指确定能产生最佳聚类结果的一组特征的过程。 特征选择的计算量很大,时间复杂度与特征数量成指数关系。 在现有的启发式方法中,我们自定义后向消除程序(backward elimination procedure)。

最初的后向消除是为监督学习(例如分类)而开发的,我们可以在其中明确定义分类误差[29]。 在这种情况下,我们从全部特征开始分类并测量误差。 然后,我们反复删除可以最大程度地减少误差的特征。 相反,我们无法在当前问题中定义误差,因为这是无监督聚类的一个实例。 因此,我们需要修改原始的向后消除。

我们使用的过程如下。 该过程是迭代的,并且在每次迭代中,我们通过一次剔除一个特征来执行聚类。 然后,我们查看是否存在导致silhouette变化小于用户指定阈值的特征。 如果是这样,则意味着此特征对群集没有帮助,然后我们将其剔除。 否则,我们将识别出使silhouette降低的特征并删除它,因为它会通过降低silhouette来破坏聚类过程。 (这对应于在监督学习情况下一处将分类误差最大的特征。)我们不会删除不会降低轮廓的特征。

在后向消除期间,我们需要修复所使用的聚类算法。 在本文中,我们使用k-means聚类算法[54]。 它可以快速运行并在许多情况下产生合理的结果,尽管k-means算法有时仅找到局部最优值,这是期望最大化算法的一个示例[55]。

图3显示了中值silhouette在后向消除过程中的变化。 为了提高计算效率,我们随机采样了2,000条IO Trace,并对选定的IO Trace执行后向消除过程。 我们设定阈值 δ = 0.2 \delta=0.2 δ=0.2。 该算法的输入参数为 k k k,簇数(即为类的数量)。 对于 k k k在2到20之间的每个值,我们执行后向消除过程并测量中值silhouette。 总体而言,观察到最高峰出现在 k = 4 k=4 k=4,此时留下3个特征。 这意味着这三个特征赋予了最高的silhouette值。 如图所示在表1中,这三个功能是F7(非随机段数),F9(CP数与BP数之比)和F16(IO请求的起始LBA的标准差)。
在这里插入图片描述
在这里插入图片描述

5.3 寻找最佳聚类算法

基于上一步确定的三个特征,我们通过表2中列出的十种不同的聚类算法对IO Trace进行聚类。选择内容涵盖了大多数现有的聚类算法类别[29],[53],[54]:
A1-A3:partitioning(基于分区)
A3-A5:fuzzy
A6:density-based(基于密度)
A7-A10:hierarchical(基于分层)

为了调整这些聚类算法的输入参数,我们依靠silhouette度量。 例如,如果这些聚类算法之一要求将聚类数作为输入参数(例如k-means算法的参数 k k k),那么我们尝试多个数字,然后找到产生最高中值silhouette值的数字。 对于报告树状图(样本的层次表示)而不是平坦聚类的层次聚类算法,我们使用通用的变换技术将树状图切成一定高度,并将每个子图中的样本分组为一个簇[54]。 我们通过最大化中间轮廓找到合适的切削高度。 对于其他聚类参数(例如,DBSCAN的参数设置了定义“密集”区域的邻域的半径),我们还尝试使用不同的值,并使用给出最高中值silhouette值的值。

图4显示了每个报告使用的聚类方法的中值silhouette值。 请参阅表2,以了解图中显示的算法标签的定义。 对于聚类,每种算法仅使用在前面的后向消除步骤中确定的三个特征(即F7,F9和F16)。 对于每种聚类方法,我们尝试如上所述的多种参数组合,尽管由于空间有限图4仅显示了我们获得的一些结果(包括最佳的)。

在这里插入图片描述
在这里插入图片描述
根据图4,基于分区的算法(即A1,A2和A3)给出了最佳结果。接下来是模糊算法和大多数分层算法的性能。 DBSCAN和单链接分层算法显示相对较低的性能。通常,与基于分区的算法相比,DBSCAN可以找到更复杂的簇形状[53]。但是,分区算法在我们的实验中产生了更好的结果,这表明IO Trace倾向于形成形状相对简单的簇。众所周知,单链接分层算法存在链接问题[54]或形成长而细的簇形状的问题,这些簇通常仅仅是伪像,无法揭示样品的实际内部结构。我们可能归因于单链接的最低性能算法在我们的实验中就解决了这个问题。基于此结果,我们为下游选择k-means算法由于其在silhouette方面的性能和实施的简便性而进行了分析。

5.4 初步IO Trace 模式

图5显示了我们的方法从4.2节中描述的58,758个trace样本中发现的两组聚类。 请注意,每个群集代表一个“初步IO Trace模式”,这些模式将成为在第6节中构建基于树的模型的基础。要生成图中所示的结果,我们使用k-means聚类算法并确定三个特征 通过后向淘汰程序。由于空间有限,我们只显示用于写操作的集群; 我们还发现读取操作的簇形成相似。

在这里插入图片描述
图5a显示了从k=4 聚类中发现的代表性的写迹簇。 回想一下,如图4所示,k=4 时中值silhouette最高。在已知的IO Trace(即随机,顺序和跨步)中,图5a中的簇1和4分别表示顺序和随机IO模式。 群集4是短和中等长度的段的混合。 群集2中的IO请求在两个LBA区域之间交替。 此外,群集2似乎与跨IO模式有关。 在群集3中,除了访问远程地址的时间很短之外,访问的LBA范围很窄。 群集3同时具有短段和跨段(在放大视图中,较长段由两个交替段组成)。

图5b显示了我们发现 k=12 的写入trace的簇。我们使用更大的k值的目的是通过增加来检查更多类型的集群。尽管图5a中的四个簇似乎很好地表示了一些已知的IO模式,但对于如此低的k值,可能会缺少模式。根据我们的实验,使用k-means算法时,k>6 时 k=12 的中间silhouette最高。对于其他类型的聚类算法,我们观察到具有17个聚类的A8的中值silhouette略高。但是,对于这种A8情况,集群成员数量的变化相当大,这意味着某些集群具有大量样本,而其他集群只有少数样本。因此,我们决定发掘k=12时的k-means算法。不出所料,图5b中的群集显示了更多不同的模式。

群集1和在k=4时一样,对应于顺序IO模式
群集2和3由长的连续模式和较短的随机模式组成(类似于k=4情况下的群集3)。
群集4看起来类似于图5a中的群集2。
群集9-12代表随机模式,类似于k=4情况下的群集4。
其他集群似乎与跨步模式有关,类似于k=4情况下的集群3和4的组合。
在这里插入图片描述

6 建立表征IO的模型

6.1 定义IO Traces类别

基于通过群集发现的IO trace的初步模式,我们最终确定了一组IO Trace模式。 初步的群集使我们了解了IO Trace中会出现哪些类型的模式。 我们执行聚类时不会反映任何知识,以防止出现意外的新模式。 在我们方法的第二阶段,我们进一步简化了上一步中发现的聚类,并定义了一组模式。 从图5汇总的聚类结果中,我们可以观察到以下内容:

O1: 段在塑造模式中发挥作用。 根据段的数量及其长度,我们可以分离模式。

O2:大致存在三种类型的模式,分别对应于顺序IO,跨步IO和随机IO。 顺序模式包括少量的长段,而随机模式则由许多短段组成。 跨步模式显示出中等程度节段的一定规则结构以及它们之间的间隙

O3:上面的三个基本模式中的每一个都有一些变体,在图5a中给出了4种类型的图形,在图5b中给出了12种类型的图形

O4:一种这样的变体是组合图案,它是两个或多个基本图案的混合(例如,顺序和大跨度的混合)

O5:另一个变体是具有基本模式的模式,该模式被看起来很杂乱的短随机访问破坏了

基于以上观察,我们简化了图5中的群集,并定义了9类IO trace。 它们在图6中进行了描述,并在表3中列出了标签和说明。尽管大多数trace 可以用三种基本模式(例如顺序,随机和跨步)表示(组合),但我们可能会遇到无法分类为预定义类别之一的trace。 如果出现此类痕迹,我们可以将其视为“未知”类,并跳过针对已知类设计的优化处理。 以后,如果观察到无法分类的痕迹的频率增加,我们可以重新运行表征和分析流程以更新预定义的类。 请注意,建议的方法是通用的,不限于当前介绍的九个类。

6.2 用树表示类

在这里插入图片描述
图6所示的9种模式的分类是设计上分层的。也就是说,在层次结构的第一级中,我们可以将IO Trace 分类为顺序,交错和随机类之一。在第二级中,根据更详细的特征,这三个类别中的每一个进一步分为三个子类别。假定树可以自然地代表分层结构,我们将建立一个基于树的模型来表示IO Trace跟踪的模式。与更复杂的替代方法(例如,人工神经网络和支持向量机[53],[55])相比,使用基于树的模型为我们提供了几个关键优势。我们可以立即将构建的基于树的模型用作存储控制器固件中使用的模式分类器。实现基于树的分类器很简单,并且其运行时间开销通常可以忽略不计,因为使用树模型的分类仅包含少量比较操作,并且不需要任何复杂的算术运算。

由于消费产品的严格资源要求(例如,成本,功耗和芯片尺寸),将高端微处理器用于SSD控制器实际上是不可行的。 典型的SSD控制器使用具有几百MHz时钟周期的嵌入式处理器,而没有浮点运算单元。 在SSD控制器的设计和实现中,使用的分类算法的计算复杂度至关重要。 使用更复杂的分类器可能会带来额外的实现复杂性和运行时损失,而仅需少量改进。

要构建基于树的模型,我们需要为树的每个级别确定做出决策的标准。 例如,在根级别,我们可以将完全顺序模式(SF)分组到左节点(不再考虑它们),然后继续向下的右节点继续对其余模式进行分类。 作为根本的决策标准,可以将SF模式与其余模式分开的特征在此示例中将很有用。

在我们方法的上一步中,通过后向消除找到的三个特征集(即F7,F9和F16)成功地发现了群集,但是在基于树的结构中使用这组特征时,我们发现了模型构建的一些问题。首先,如图7所示,这三个特征的分布都偏斜(第i-个对角线图显示第i-个特征的直方图;稍后将对该图进行更多说明)。此属性在聚类步骤中可能很有用,这可能就是为什么将这些特征集选择为向后消除中特征的最佳组合的原因。但是,仅使用那些具有高偏斜度的特征可能会产生严重不平衡的分类结果。有些类别可能有太多样本,而另一些类别可能只有少数。第二,鉴于最终将基于树的模型实现为IO系统固件的一部分,因此我们不应该忽略获取特征部件的计算开销。在这方面,由于需要计算标准偏差,因此F16特征(IO请求的起始LBA的标准偏差)不理想。

为了解决这些问题,我们从聚类过程中选择增加了特征集的选择如下:首先,我们将F3和F5添加到特征集中以减轻偏度问题。图7显示了表1中定义的20个特征中的一些的散布图矩阵[29],[56]。在散布图矩阵中,在位置( i , j i,j i,j), i , j 不 等 i,j不等 i,j,绘制的图是散布图,显示了特征 i i i j j j之间的相关性,第i-对角线图是表示其分布的特征直方图。在我们的数据中,F3-F6是前四个特征,其分布与正态分布最接近。其中,我们删除F4和F6是因为它们与F5的成对相关性很高(分别为0.916和0.908),并且F5比这两个可以更方便地用来定义表3中列出的9个类。其次,我们使用F8代替F16。我们可以根据以下理由证明这种替代是合理的。最重要的是,F8是除F7,F9和F16之外最后删除的功能。也就是说,如果我们通过向后消除选择了四个特征,而不是三个,那么该特征集将具有F7,F8,F9和F16。另外,与F16相关性最高的两个特征分别是F7和F8(分别为0.616和0.565)。但是,F7已经在功能集中。最后,用F8代替F16应该是一个合理的选择。
在这里插入图片描述
基于这些扩展的特征集(F3,F5,F7,F8和F9),我们可以为表3中定义的9个类建立一个基于树的模型图八。首先,我们可以通过关联有关F5的决策来分离SF类。 (BP数)与根节点。 然后,我们可以通过在第二级节点上应用F9(CP数量与BP数量之比)来找到SS类。 我们可以通过使用树下方的其余特征来对其他模式进行分类,如图8所示。使用图8所示的决策树模型,我们可以获得有关IO的九种类别中每个类别的定量外观的信息。 TRACE列在表3中。例如,SF模式的F5(断点数)值小于4,而SS模式的F5值在4到20之间,以及F9(连续点数与连续点数之比)。 断点的值)小于0.2。
在这里插入图片描述
在这里插入图片描述

7 IO Trace 分类决策树

现在,我们有了一个基于树的IO Trace模型,我们可以构建一个基于决策树的分类器,以便在运行时对IO跟踪进行分类(图1)。 本节说明如何训练分类器并使用真实踪迹对其进行验证。 此外,我们在分类准确性和运行时间方面将提出的基于树的分类器与其他现有的最新分类器进行了比较。 我们还考虑了trace 样本长度对分类性能的影响。

7.1 训练和验证分类器

我们从58,758个Trace 样本中收集了9个类别中每个类别的标记示例。 按照训练和验证分类器的标准程序[53],我们将分类标签的样本分为训练和验证集,使用训练集训练基于树的分类器,并通过验证集计算分类误差。 我们通过10倍交叉验证[55]执行此步骤。 在此过程中,我们将标记的示例划分为10个大小相等的块,并训练和验证分类器10次。 每次跑步时,将10个区块中的9个用于训练,其余的用于依次进行验证。 我们选择分类器的参数,以提供最低的验证误差。 图8显示了注释树的结果决策树,其中阈值用于在每个节点处进行决策,还提供了每个类的一些示例模式。

7.2 实际工作量中的类别分配

要查看表3中定义的9个类在我们收集的实际IO Trace样本中是如何分布的,我们对未用于训练和验证的未标记样本进行了分类。这样的样本集通常被称为出版物集。表4列出了9个类别的细分。所有IO Trace样本中大约有一半是随机模式,而其中40%以上是交错模式。在表3中定义的9个类别中,最常出现的模式是IM类,它由多个跨段和一些随机模式组成。 RI类主要具有随机模式和一些跨步模式,约占Trace样本的30%。看到完全顺序的SF模式的机会为2.58%,将SF,SS和SR类的所有百分比相加得出的值为4.22%。鉴于一些新的存储系统可以有效地处理顺序数据,看到更多顺序模式将是令人兴奋的。值得注意的是,跨步模式(IF,IL和IM类)总共占40%以上。利用这种模式在固态驱动器(SSD)中将是有益的,固态驱动器可以将每个短段同时分配给不同的通道,从而可以显着提高性能。完全随机模式的比例(RF类)略低于预期。

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个典型的规划问题,可以使用lingo18软件进行求解。以下是对应的lingo18代码: ``` Model: Sets: shifts /shift1, shift2, shift3, shift4/; times /time1, time2, time3, time4, time5, time6/; Params: demand(time) demand for each time period / time1 20, time2 25, time3 10, time4 30, time5 20, time6 10 /; salary(shift) cost of each shift / shift1 800, shift2 800, shift3 900, shift4 900 /; worktime(shift) work time for each shift / shift1 8, shift2 8, shift3 9, shift4 9 /; resttime(shift) rest time for each shift / shift1 1, shift2 1, shift3 1, shift4 1 /; Variables: x(shift, time) binary decision variables obj total cost to minimize work(shift) total work time for each shift rest(shift) total rest time for each shift workload(time) total workload for each time period Binary Variables: x; Equations: total_cost objective function worktime_con(work(shift)) work time constraint resttime_con(rest(shift)) rest time constraint demand_con(workload(time)) demand constraint Bounds: x(shift, time) binary End: total_cost = sum((shift, time), x(shift, time) * salary(shift)); work(shift) = sum(time, x(shift, time) * worktime(shift)); rest(shift) = sum(time, x(shift, time) * resttime(shift)); workload(time) = sum(shift, x(shift, time)); worktime_con(work) =E= 8; resttime_con(rest) =E= 1; demand_con(workload("time1")) =G= demand("time1"); demand_con(workload("time2")) =G= demand("time2"); demand_con(workload("time3")) =G= demand("time3"); demand_con(workload("time4")) =G= demand("time4"); demand_con(workload("time5")) =G= demand("time5"); demand_con(workload("time6")) =G= demand("time6")); ``` 其中,Sets定义了班次和时间段,Params定义了需求人数、工资、工作时间和休息时间等参数,Variables定义了决策变量,Binary Variables定义了决策变量的值域,Equations定义了约束条件,Bounds定义了决策变量的范围。 在lingo18中执行该代码即可得到最优解,即最小化总工资的情况下满足所有需求的服务人员安排方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值