ebs缓存
① openstack的问题。
OpenStack其实有三个与存储相关的组件,这三个组件被人熟知的程度和组件本身出现时间的早晚是相符的,按熟悉程度排列如下:
Swift——提供对象存储 (Object Storage),在概念上类似于Amazon S3服务,不过swift具有很强的扩展性、冗余和持久性,也兼容S3 API
Glance——提供虚机镜像(Image)存储和管理,包括了很多与Amazon AMI catalog相似的功能。(Glance的后台数据从最初的实践来看是存放在Swift的)。
Cinder——提供块存储(Block Storage),类似于Amazon的EBS块存储服务,目前仅给虚机挂载使用。
(Amazon一直是OpenStack设计之初的假象对手和挑战对象,所以基本上关键的功能模块都有对应项目。除了上面提到的三个组件,对于AWS中的重要的EC2服务,OpenStack中是Nova来对应,并且保持和EC2 API的兼容性,有不同的方法可以实现)
三个组件中,Glance主要是虚机镜像的管理,所以相对简单;Swift作为对象存储已经很成熟,连CloudStack也支持它。Cinder是比较新出现的块存储,设计理念不错,并且和商业存储有结合的机会,所以厂商比较积极。
Swift
关于Swift的架构和部署讨论,除了官方网站,网上也有很多文章,这里就不重复.(也可以参考我之前在OpenStack中国行活动中上海站演讲的PPT)。从开发上看,最近也没有太大的结构性调整,所以我想主要说说比较适用的应用领域好了。
从我所了解的实际案例来看,Swift出现的领域有4个,(应该还有更多,希望大家看到实际用例能够指教)
1.网盘。
Swift的对称分布式架构和多proxy多节点的设计导致它从基因里就适合于多用户大并发的应用模式,最典型的应用莫过于类似Dropbox的网盘应用,Dropbox去年底已经突破一亿用户数,对于这种规模的访问,良好的架构设计是能够支撑的根本原因。
Swift的对称架构使得数据节点从逻辑上看处于同级别,每台节点上同时都具有数据和相关的元数据。并且元数据的核心数据结构使用的是哈希环,一致性哈希算法对于节点的增减都只需重定位环空间中的一小部分数据,具有较好的容错性和可扩展性。另外数据是无状态的,每个数据在磁盘上都是完整的存储。这几点综合起来保证了存储的本身的良好的扩展性。
另外和应用的结合上,Swift是说HTTP协议这种语言的,这使得应用和存储的交互变得简单,不需要考虑底层基础构架的细节,应用软件不需要进行任何的修改就可以让系统整体扩展到非常大的程度。
2.IaaS公有云
Swift在设计中的线性扩展,高并发和多租户支持等特性,使得它也非常适合做为IaaS的选择,公有云规模较大,更多的遇到大量虚机并发启动这种情况,所以对于虚机镜像的后台存储具体来说,实际上的挑战在于大数据(超过G)的并发读性能,Swift在OpenStack中一开始就是作为镜像库的后台存储,经过RACKSpace上千台机器的部署规模下的数年实践,Swift已经被证明是一个成熟的选择。
另外如果基于IaaS要提供上层的SaaS 服务,多租户是一个不可避免的问题,Swift的架构设计本身就是支持多租户的,这样对接起来更方便。
3.备份归档
RackSpace的主营业务就是数据的备份归档,所以Swift在这个领域也是久经考验,同时他们还延展出一种新业务--“热归档”。由于长尾效应,数据可能被调用的时间窗越来越长,热归档能够保证应用归档数据能够在分钟级别重新获取,和传统磁带机归档方案中的数小时而言,是一个很大的进步。
4. 移动互联网和CDN
移动互联网和手机游戏等产生大量的用户数据,数据量不是很大但是用户数很多,这也是Swift能够处理的领域。
至于加上CDN,如果使用Swift,云存储就可以直接响应移动设备,不需要专门的服务器去响应这个HTTP的请求,也不需要在数据传输中再经过移动设备上的文件系统,直接是用HTTP 协议上传云端。如果把经常被平台访问的数据缓存起来,利用一定的优化机制,数据可以从不同的地点分发到你的用户那里,这样就能提高访问的速度,我最近看到Swift的开发社区有人在讨论视频网站应用和Swift的结合,窃以为是值得关注的方向。
Glance
Glance比较简单,是一个虚机镜像的存储。向前端nova(或者是安装了Glance-client的其他虚拟管理平台)提供镜像服务,包括存储,查询和检索。这个模块本身不存储大量的数据,需要挂载后台存储(Swift,S3。。。)来存放实际的镜像数据。
Glance主要包括下面几个部分:
l API service: glance-api 主要是用来接受Nova的各种api调用请求,将请求放入RBMQ交由后台处理,。
l Glacne-registry 用来和MySQL数据库进行交互,存储或者获取镜像的元数据,注意,刚才在Swift中提到,Swift在自己的Storage Server中是不保存元数据的,这儿的元数据是指保存在MySQL数据库中的关于镜像的一些信息,这个元数据是属于Glance的。
l Image store: 后台存储接口,通过它获取镜像,后台挂载的默认存储是Swift,但同时也支持Amazon S3等其他的镜像。
Glance从某种角度上看起来有点像虚拟存储,也提供API,可以实现比较完整的镜像管理功能。所以理论上其他云平台也可以使用它。
Glance比较简单,又限于云内部,所以没啥可以多展开讨论的,不如看看新出来的块存储组件Cinder,目前我对Cinder基本的看法是总体的设计不错,细节和功能还有很多需要完善的地方,离一个成熟的产品还有点距离。
Cinder
OpenStack到F版本有比较大的改变,其中之一就是将之前在Nova中的部分持久性块存储功能(Nova-Volume)分离了出来,独立为新的组件Cinder。它通过整合后端多种存储,用API接口为外界提供块存储服务,主要核心是对卷的管理,允许对卷,卷的类型,卷的快照进行处理。
Cinder包含以下三个主要组成部分
API service:Cinder-api 是主要服务接口, 负责接受和处理外界的API请求,并将请求放入RabbitMQ队列,交由后端执行。 Cinder目前提供Volume API V2
Scheler service: 处理任务队列的任务,并根据预定策略选择合适的Volume Service节点来执行任务。目前版本的cinder仅仅提供了一个Simple Scheler, 该调度器选择卷数量最少的一个活跃节点来创建卷。
Volume service: 该服务运行在存储节点上,管理存储空间,塔处理cinder数据库的维护状态的读写请求,通过消息队列和直接在块存储设备或软件上与其他进程交互。每个存储节点都有一个Volume Service,若干个这样的存储节点联合起来可以构成一个存储资源池。
Cinder通过添加不同厂商的指定drivers来为了支持不同类型和型号的存储。目前能支持的商业存储设备有EMC 和IBM的几款,也能通过LVM支持本地存储和NFS协议支持NAS存储,所以Netapp的NAS应该也没问题,好像华为也在努力中。我前段时间还在Cinder的blueprints看到IBM的GPFS分布式文件系统,在以后的版本应该会添加进来
到目前为止,Cinder主要和Openstack的Nova内部交互,为之提供虚机实例所需要的卷Attach上去,但是理论上也可以单独向外界提供块存储。
部署上,可以把三个服务部署在一台服务器,也可以独立部署到不同物理节点
现在Cinder还是不够成熟,有几个明显的问题还没很好解决,一是支持的商业存储还不够多,而且还不支持FC SAN,另外单点故障隐患没解决,内部的schele调度算法也太简单。另外由于它把各种存储整合进来又加了一层,管理倒是有办法了,但是效率肯定是有影响,性能肯定有损耗,但这也是没办法的事了。
Openstack通过两年多发展,变得越来越庞大。目前光存储就出现了三种:对象存储、镜像存储和块存储。这也是为了满足更多不同的需求,体现出开源项目灵活快速的特性。总的说来,当选择一套存储系统的时候,如果考虑到将来会被多个应用所共同使用,应该视为长期的决策。Openstack作为一个开放的系统,最主要是解决软硬件供应商锁定的问题,可以随时选择新的硬件供应商,将新的硬件和已有的硬件组成混合的集群,统一管理,当然也可以替换软件技术服务的提供商,不用动应用。这是开源本身的优势!
② EBS系统菜单、职责的问题
1. 如果是对用户的,用系统管理员职责,安全性->用户 然后对要取消的职责设置失效日期 2. 要失效职责,同样用系统管理员职责,安全性->职责 在职责的有效性上取消掉即可
③ 关于盗链下载的问题
[Reference]
Ref1=http://222.122.181.29/ebscul1/2006/CH01/0001182/VOD/300k/MSWMExt=.asf
Ref2=http://222.122.181.29:80/ebscul1/2006/CH01/0001182/VOD/300k/MSWMExt=.asf
流媒体做了隐藏,找方法下载。好像没有好的办法,只有看完一遍,在缓存里面拷贝出来!
④ 大家常用的块存储工具有哪些
大家常用的块存储工具有哪些?
有奖励写回答共3个回答
jinnow1
2021-12-03
超过90用户采纳过TA的回答
储存器具有记忆功能,用来保存信息,如数据,指令和运算结果等等。 它可以分为外储存器和内储存器两种。下面进行详细说明。 1) 内储存器(内存) 内储存器直接与CPU相连接,储存容量较小,但速度快,用来存放当前运行程序的指令和数据,并直接与CPU交换信息。内储存器由许多储存单元组成,每个单元能存放一个二进制数或一条由二进制编码表示的指令。 2) 外储存器(外存) 外储存器是内储存器的扩充。它储存容量大,价格低,但储存速度慢,一般用来存放大量暂时不用的程序,数据和中间结果,需要时,可成批的与内存进行信息交换。外存只能与内存交换信息,不能被计算机系统的其他部件直接访问。常用的外存有磁盘,磁带,光盘等。 内存一般采用半导体存储单元,包括随机存储器(RAM),只读存储器(ROM),以及高速缓存(CACHE)。只不过因为RAM是其中最重要的存储器。S(synchronous)DRAM 同步动态随机存取存储器:SDRAM为168脚,这是目前PENTIUM及以上机型使用的内存。SDRAM将CPU与RAM通过一个相同的时钟锁在一起,使CPU和RAM能够共享一个时钟周期,以相同的速度同步工作,每一个时钟脉冲的上升沿便开始传递数据,速度比EDO内存提高50%。DDR(DOUBLE DATA RAGE)RAM :SDRAM的更新换代产品,他允许在时钟脉冲的上升沿和下降沿传输数据,这样不需要提高时钟的频率就能加倍提高SDRAM的速度。 ●只读存储器(ROM) ROM表示只读存储器(Read Only Memory),在制造ROM的时候,信息(数据或程序)就被存入并永久保存。这些信息只能读出,一般不能写入,即使机器掉电,这些数据也不会丢失。ROM一般用于存放计算机的基本程序和数据,如BIOS ROM。其物理外形一般是双列直插式(DIP)的集成块。 ●随机存储器(RAM) 随机存储器(Random Access Memory)表示既可以从中读取数据,也可以写入数据。当机器电源关闭时,存于其中的数据就会丢失。我们通常购买或升级的内存条就是用作电脑的内存,内存条(SIMM)就是将RAM集成块集中在一起的一小块电路板,它插在计算机中的内存插槽上,以减少RAM集成块占用的空间。目前市场上常见的内存条有1G/条,2G/条,4G/条等。 ●高速缓冲存储器(Cache) Cache也是我们经常遇到的概念,它位于CPU与内存之间,是一个读写速度比内存更快的存储器。当CPU向内存中写入或读出数据时,这个数据也被存储进高速缓冲存储器中。当CPU再次需要这些数据时,CPU就从高速缓冲存储器读取数据,而不是访问较慢的内存,当然,如需要的数据在Cache中没有,CPU会再去读取内存中的数据。
⑤ 什么是分布式存储系统
分布式存储系统
定义
分布式存储系统是大量普通PC服务器通过Internet互联,对外作为一个整体提供存储服务
特性
可扩展
低成本
高性能
易用
挑战
分布式存储系统的挑战主要在于数据、状态信息的持久化,要求在自动迁移、自动容错、并发读写的过程中保证数据的一致性。分布式存储涉及的技术主要来自两个领域:分布式系统以及数据库。
分类
非结构化数据,一般的文档
结构化数据, 存储在关系数据库中
半结构化数据,HTML文档
不同的分布式存储系统适合处理不同类型的数据:
分布式文件系统
非结构化数据,这类数据以对象的形式组织,不同对象之间没有关联,这样的数据一般称为Blob(二进制大对象)数据
典型的有Facebook Haystack 以及 Taobao File System
另外,分布式文件系统也常作为分布式表格系统以及分布式数据库的底层存储,如谷歌的GFS可以作为分布式表格系统Google Bigtable 的底层存储,Amazon的EBS(弹性存储块)系统可以作为分布式数据库(Amazon RDS)的底层存储
总体上看,分布式文件系统存储三种类型的数据:Blob对象、定长块以及大文件
分布式键值系统
较简单的半结构化数据,只提供主键的CRUD(创建、读取、更新、删除)
典型的有Amazon Dynamo 以及 Taobao Tair
分布式表格系统
较复杂的半结构化数据,不仅支持CRUD,而且支持扫描某个主键范围
以表格为单位组织数据,每个表格包括很多行,通过主键标识一行,支持根据主键的CRUD功能以及范围查找功能
典型的有Google Bigtable 以及 Megastore,Microsoft Azure Table Storage,Amazon DynamoDB等
分布式数据库
存储结构化数据,一般是由单机关系数据库扩展而来
典型的包括MySQL数据库分片集群、Amazon RDS以及Microsoft SQL Azure
⑥ oracle FORM报错 FRM-92101
安装EBS12后,可以成功登录EBS,但是却不能打开FORM界面,打开FORM界面时报错:FRM-92101:然后我去到$LOG_TOP/ora/10.1.3/j2ee/forms/forms_default_group_1(我的链接的完全路径是:/d01/oracle/test/inst/apps/test_test/logs/ora/10.1.3/j2ee/forms/forms_default_group_1)的application.log日志中查看,发现具体的原因如下:
Forms 会话 <1> 中止: 运行时进程在启动过程中失败, 并出现错误 /d01/oracle/test/apps/tech_st/10.1.2/bin/frmweb: error while loading shared libraries: libXm.so.2: cannot open shared object file: No such file or directory
在网络上查找,发现是我的:openmotif21-2.1.30-11.EL5.i386.rpm没有安装。但是在安装之前,我是安装了RehHat5光盘里的openmotif-2.3.0-0.3.el5和openmotif22-2.2.3-18了的。看来还是版本兼容的问题,所以我到https://oss.oracle.com/projects/compat-oracle/files/Enterprise_Linux/里直接去下载了openmotif21-2.1.30-11.EL5.i386.rpm来安上,然后重启EBS应用后,就可以成功打开EBS FORM界面了。
⑦ 中国银行 安全控件问题
您好,遇到这种情况,请您首先,清空IE缓存~1.如您使用IE8,请你依次在浏览器上点击“安全”——删除浏览的历史记录。2.然后在使用“360安全卫士”等辅助软件,扫描系统中的插件。看用没有中国银行的网银控件。3.如果有,请点击“立即清除”,然后请您登录“www.boc.cn“下载最新的登录控件。同时,在下载完成以后,请您关闭所有浏览器,重启电脑后再重新打开中国银行网站使用。4.如果您使用IE6或者IE7,请您直接使用辅助软件清除IE缓存。然后重复2.3步骤即可。如您还有其他的任何问题,请补充。
⑧ 如何在数据库应用中发挥SSD的优势
利用固态硬盘(SSD)技术的优势设计数据库应用架构是非常有吸引力的一件事。特别值得注意的是,固态硬盘并行访问数据的能力已经有了很大的提升。这些提升使得固态硬盘对于许多类型的数据库应用几乎能达到了随机访问内存存储的性能,而成本只是其八分之一。
在过去的几年里,固态硬盘的性能得到了突飞猛进的增长,同时相比于传统硬盘和RAM,其成本却在持续降低。但是要利用好这些改进的优势,需要掌握存储特性选择合适的AWS实例大小,理解应用特性并利用合适的编程语言。
掌握AWS选项
AWS IaaS EC2实例可以配置不同级别的存储:
A)内存。对应于传统物理计算机的RAM。
B)实例存储。也称为临时存储。它对应于传统物理计算机的磁盘大小。
C)灵活的持久化补充存储(比如EBS和S3)。基本上可以把它视为物理PC的网络存储。
Amazon现在把SSD作为部署临时存储和通用存储的默认配置,也是EBS的默认配置(早期的实例类型默认不是SSD)。EBS的其它好处是存储系统可以在数据库服务器本身退役以后仍然继续可用。
此外,AWS还提供SSD存储作为Amazon DynamoDB的默认选项。SSD同时也是Amazon RDS和Amazon
Redshift的可选配置。这个配置非常好,它可以降低数据库应用需要的开发代价。但是,如果企业需要部署其它数据库,也有很多其它可配置项可以帮助他
们利用到SSD的并行特性。
并行存储的物理原理
物理计算机通常设置有三种主要存储类型。RAM安装在主板上,紧挨着CPU,它提供最高的性能,成本代价也最高,计算机关闭以后内容不会保存。
SSD和传统硬盘是连接到计算机上的补充存储,通过PCI-e,SCSI和SATA线缆连接,或者在网络上通过eSATA或者光纤通道连接。
传统硬盘包含有一个物理读写头,一次可以跨多个物理盘片读取数据流。如果数据可以顺序读取(比如读取较大的多媒体视频音频文件),或者对于一些
数据库分析应用(比如Hadoop应用),这种模式都非常合适。然而,如果读取数据要搜索盘片的多个扇区,那么传统硬盘读写头的性能会急剧下降。
与此相反,闪存驱动的物理构成就是成百上千个可以随机访问的块,是由分散的许多芯片组成的,读取哪一块的数据不会影响访问性能。闪存盘有两个瓶颈:第一就是计算机处理器和个体芯片储存区之间的存储控制器;第二是不能从单个芯片上的不同块区同时读取随机数据。
当今时代的大部分数据库引擎都没有利用闪存盘访问数据随机位的功能优势。其结果是,数据库都比较慢,或者虽然其访问模式可以被缓存,但需要更多
RAM才能实现同样的性能效果。而RAM存储肯定比闪存盘速度快,不过对于相同数量的存储空间,RAM的成本是闪存盘的十倍。在物理层面上,RAM比
SSD有更好的IO处理能力,但是成本也是其大约三到四倍。这些相对成本也被反映到了Amazon Web服务上可用的不同计算机实例相对成本上。
写入队列
利用跨多个芯片并行访问数据能力优势的关键在于编写程序时要考虑到队列深度这一特性。在数据库应用中增加队列深度可以使应用从SSD不同个体芯片中并行读写数据,这对提高数据库性能有直接的效果。
如果队列深度设置过大,访问同一芯片中不同数据位的可能性就增大了,这也会破坏性能。因此,大部分应用的最佳队列深度是每驱动器32到64个并
发请求,尽管驱动器本身支持更多并发请求。通过优化数据库应用访问SSD的队列深度,应用程序可以花更少的代价就能达到用更昂贵RAM才能实现的更佳性能
状态。
在应用层面,开发者需要考虑如何实现应用对存储系统的请求队列化,以实现并行处理。但是,软件方面要获得较好的并行有许多陷阱。要用像
JavaScript、Ruby和Python这样的编程语言实现并行是很困难的,因为这些语言对实现多线程支持的不太好,Java和C#相对更容易一
些。
C和C++是实现高并发系统代码最合适的编程语言,因为它们直接操作操作系统核心功能。例如,互斥扩展(也叫互斥量)就是简化编程生成低级系统并行调用的语言特性。另一种选择是使用自带SSD存储优化方案的商业数据库,比如Aerospike。
为应用选择合适的架构
不是所有的数据库应用都需要闪存存储功能来并行访问随机数据。处理大量并发用户Web请求的数据库很容易看到闪存存储的最大优势。
与此相反,像Hadoop这种分析应用在某种意义上是并行的,但是通常这些应用最后都需要访问存储驱动器上的大量数据流来完成数据访问。例如,
处理一个月的用户日志来分析其行为或者分析用户,本质上都要按顺序提取数据,因此迁移到SSD并不能带来太多益处。在这两种极端场景之间,还有一些实时分
析类型的应用,它们既需要一定的随机搜索和也需要数据流处理。
专家建议,充分利用各种层次成本差异的一种方式是,配置数据库利用临时存储读取数据以获得最佳性能。这一点可以通过存储在EBS持久化数据层的数据进行备份。这种方案提供了AWS上价格和性能的最佳平衡组合。
后台进程也需要考虑
数据库应用架构师还应该考虑其它细微特征。要理解数据库软件如何利用RAM,如何把数据刷到磁盘,这些对于优化SSD应用配置非常重要。这对于
评估数据库与文件系统交互的各种方式也非常重要。最明显的读负载繁重会有大量后台IO竞争。而其他进程像报表系统、日志文件生成是需要后台维护的。
要想找到合适的平衡点,专家建议以真实世界部署的强大指标为基准进行参考。这样可以帮助企业判断部署和优化SSD系统有多大益处。不过,在RAM和SSD之间选择,最重要的考虑因素是深刻掌握要处理的数据集大小。
配置合适的SSD和RAM容量有许多种组合,会增加数据库更高的复杂度。更多的是传统数据库系统,它们会部署一台主服务器和许多备用服务器用于
故障恢复,除了在磁盘级别的情况它们的配置都很简单。另一方面,分布式数据库系统根据节点数量不同,RAM数量和网络设置的不同会有更多的变化。
尽管在大多数情况下,如果你关注技术的力量和数据库系统的可操作性作为选择硬件驱动器的考虑因素,那么你需要比较评估的系统应该相对不会很多。
⑨ Oracle EBS系统中报这个错,ORA-00054:resource busy and acquire with NOWAIT specified。求答案。。。
设置一个大一点的缓存吧
⑩ 如何测试云硬盘
问题
UOS公有云开放以来,一些用户反应用dd命令测试出来的1TB云硬盘的吞吐率(MBPS)只有128MB/s,而不是我们SLA保证的170MB /s ,这是为什么?下面我会简单介绍如何测试硬盘,RAID,SAN,SSD,云硬盘等,然后再来回答上面的问题。
测试前提
我们在进行测试时,都会分清楚:
测试对象:要区分硬盘、SSD、RAID、SAN、云硬盘等,因为它们有不同的特点
测试指标:IOPS和MBPS(吞吐率),下面会具体阐述
测试工具:Linux下常用Fio、dd工具, Windows下常用IOMeter,
测试参数: IO大小,寻址空间,队列深度,读写模式,随机/顺序模式
测试方法:也就是测试步骤。
测试是为了对比,所以需要定性和定量。在宣布自己的测试结果时,需要说明这次测试的工具、参数、方法,以便于比较。
存储系统模型
为了更好的测试,我们需要先了解存储系统,块存储系统本质是一个排队模型,我们可以拿银行作为比喻。还记得你去银行办事时的流程吗?
去前台取单号
等待排在你之前的人办完业务
轮到你去某个柜台
柜台职员帮你办完手续1
柜台职员帮你办完手续2
柜台职员帮你办完手续3
办完业务,从柜台离开
如何评估银行的效率呢:
服务时间 = 手续1 + 手续2 + 手续3
响应时间 = 服务时间 + 等待时间
性能 = 单位时间内处理业务数量
那银行如何提高效率呢:
增加柜台数
降低服务时间
因此,排队系统或存储系统的优化方法是
增加并行度
降低服务时间
硬盘测试
硬盘原理
我们应该如何测试SATA/SAS硬盘呢?首先需要了解磁盘的构造,并了解磁盘的工作方式:
每个硬盘都有一个磁头(相当于银行的柜台),硬盘的工作方式是:
收到IO请求,得到地址和数据大小
移动磁头(寻址)
找到相应的磁道(寻址)
读取数据
传输数据
则磁盘的随机IO服务时间:
服务时间 = 寻道时间 + 旋转时间 + 传输时间
对于10000转速的SATA硬盘来说,一般寻道时间是7 ms,旋转时间是3 ms, 64KB的传输时间是 0.8 ms, 则SATA硬盘每秒可以进行随机IO操作是 1000/(7 + 3 + 0.8) = 93,所以我们估算SATA硬盘64KB随机写的IOPS是93。一般的硬盘厂商都会标明顺序读写的MBPS。
我们在列出IOPS时,需要说明IO大小,寻址空间,读写模式,顺序/随机,队列深度。我们一般常用的IO大小是4KB,这是因为文件系统常用的块大小是4KB。
使用dd测试硬盘
虽然硬盘的性能是可以估算出来的,但是怎么才能让应用获得这些性能呢?对于测试工具来说,就是如何得到IOPS和MBPS峰值。我们先用dd测试一下SATA硬盘的MBPS(吞吐量)。
#dd if=/dev/zero of=/dev/sdd bs=4k count=300000 oflag=direct
记录了300000+0 的读入 记录了300000+0 的写出 1228800000字节(1.2 GB)已复制,17.958 秒,68.4 MB/秒
#iostat -x sdd 5 10
...
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sdd 0.00 0.00 0.00 16794.80 0.00 134358.40 8.00 0.79 0.05 0.05 78.82
...
为什么这块硬盘的MBPS只有68MB/s? 这是因为磁盘利用率是78%,没有到达95%以上,还有部分时间是空闲的。当dd在前一个IO响应之后,在准备发起下一个IO时,SATA硬盘是空闲的。那么如何才能提高利用率,让磁盘不空闲呢?只有一个办法,那就是增加硬盘的队列深度。相对于CPU来说,硬盘属于慢速设备,所有操作系统会有给每个硬盘分配一个专门的队列用于缓冲IO请求。
队列深度
什么是磁盘的队列深度?
在某个时刻,有N个inflight的IO请求,包括在队列中的IO请求、磁盘正在处理的IO请求。N就是队列深度。
加大硬盘队列深度就是让硬盘不断工作,减少硬盘的空闲时间。
加大队列深度 -> 提高利用率 -> 获得IOPS和MBPS峰值 -> 注意响应时间在可接受的范围内
增加队列深度的办法有很多
使用异步IO,同时发起多个IO请求,相当于队列中有多个IO请求
多线程发起同步IO请求,相当于队列中有多个IO请求
增大应用IO大小,到达底层之后,会变成多个IO请求,相当于队列中有多个IO请求 队列深度增加了。
队列深度增加了,IO在队列的等待时间也会增加,导致IO响应时间变大,这需要权衡。让我们通过增加IO大小来增加dd的队列深度,看有没有效果:
dd if=/dev/zero of=/dev/sdd bs=2M count=1000 oflag=direct
记录了1000+0 的读入 记录了1000+0 的写出 2097152000字节(2.1 GB)已复制,10.6663 秒,197 MB/秒
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sdd 0.00 0.00 0.00 380.60 0.00 389734.40 1024.00 2.39 6.28 2.56 97.42
可以看到2MB的IO到达底层之后,会变成多个512KB的IO,平均队列长度为2.39,这个硬盘的利用率是97%,MBPS达到了197MB/s。(为什么会变成512KB的IO,你可以去使用Google去查一下内核参数 max_sectors_kb的意义和使用方法 )
也就是说增加队列深度,是可以测试出硬盘的峰值的。
使用fio测试硬盘
现在,我们来测试下SATA硬盘的4KB随机写的IOPS。因为我的环境是Linux,所以我使用FIO来测试。
$fio -ioengine=lio -bs=4k -direct=1 -thread -rw=randwrite -size=1000G -filename=/dev/vdb \
-name="EBS 4K randwrite test" -iodepth=64 -runtime=60
简单介绍fio的参数
ioengine: 负载引擎,我们一般使用lio,发起异步IO请求。
bs: IO大小
direct: 直写,绕过操作系统Cache。因为我们测试的是硬盘,而不是操作系统的Cache,所以设置为1。
rw: 读写模式,有顺序写write、顺序读read、随机写randwrite、随机读randread等。
size: 寻址空间,IO会落在 [0, size)这个区间的硬盘空间上。这是一个可以影响IOPS的参数。一般设置为硬盘的大小。
filename: 测试对象
iodepth: 队列深度,只有使用lio时才有意义。这是一个可以影响IOPS的参数。
runtime: 测试时长
下面我们做两次测试,分别 iodepth = 1和iodepth = 4的情况。下面是iodepth = 1的测试结果。
上图中蓝色方框里面的是测出的IOPS 230, 绿色方框里面是每个IO请求的平均响应时间,大约是4.3ms。黄色方框表示95%的IO请求的响应时间是小于等于 9.920 ms。橙色方框表示该硬盘的利用率已经达到了98.58%。
下面是 iodepth = 4 的测试:
我们发现这次测试的IOPS没有提高,反而IO平均响应时间变大了,是17ms。
为什么这里提高队列深度没有作用呢,原因当队列深度为1时,硬盘的利用率已经达到了98%,说明硬盘已经没有多少空闲时间可以压榨了。而且响应时间为 4ms。 对于SATA硬盘,当增加队列深度时,并不会增加IOPS,只会增加响应时间。这是因为硬盘只有一个磁头,并行度是1, 所以当IO请求队列变长时,每个IO请求的等待时间都会变长,导致响应时间也变长。
这是以前用IOMeter测试一块SATA硬盘的4K随机写性能,可以看到IOPS不会随着队列深度的增加而增加,反而是平均响应时间在倍增。
队列深度 IOPS 平均响应时间
1 332.931525 3.002217
2 333.985074 5.986528
4 332.594653 12.025060
8 336.568012 23.766359
16 329.785606 48.513477
32 332.054590 96.353934
64 331.041063 193.200815
128 331.309109 385.163111
256 327.442963 774.401781
寻址空间对IOPS的影响
我们继续测试SATA硬盘,前面我们提到寻址空间参数也会对IOPS产生影响,下面我们就测试当size=1GB时的情况。
我们发现,当设置size=1GB时,IOPS会显着提高到568,IO平均响应时间会降到7ms(队列深度为4)。这是因为当寻址空间为1GB时,磁头需要移动的距离变小了,每次IO请求的服务时间就降低了,这就是空间局部性原理。假如我们测试的RAID卡或者是磁盘阵列(SAN),它们可能会用Cache把这1GB的数据全部缓存,极大降低了IO请求的服务时间(内存的写操作比硬盘的写操作快很1000倍)。所以设置寻址空间为1GB的意义不大,因为我们是要测试硬盘的全盘性能,而不是Cache的性能。
硬盘优化
硬盘厂商提高硬盘性能的方法主要是降低服务时间(延迟):
提高转速(降低旋转时间和传输时间)
增加Cache(降低写延迟,但不会提高IOPS)
提高单磁道密度(变相提高传输时间)
RAID测试
RAID0/RAID5/RAID6的多块磁盘可以同时服务,其实就是提高并行度,这样极大提高了性能(相当于银行有多个柜台)。
以前测试过12块RAID0,100GB的寻址空间,4KB随机写,逐步提高队列深度,IOPS会提高,因为它有12块磁盘(12个磁头同时工作),并行度是12。
队列深度 IOPS 平均响应时间
1 1215.995842 0.820917
2 4657.061317 0.428420
4 5369.326970 0.744060
8 5377.387303 1.486629
16 5487.911660 2.914048
32 5470.972663 5.846616
64 5520.234015 11.585251
128 5542.739816 23.085843
256 5513.994611 46.401606
RAID卡厂商优化的方法也是降低服务时间:
使用大内存Cache
使用IO处理器,降低XOR操作的延迟。
使用更大带宽的硬盘接口
SAN测试
对于低端磁盘阵列,使用单机IOmeter就可以测试出它的IOPS和MBPS的峰值,但是对于高端磁盘阵列,就需要多机并行测试才能得到IOPS和MBPS的峰值(IOmeter支持多机并行测试)。下图是纪念照。
磁盘阵列厂商通过以下手段降低服务时间:
更快的存储网络,比如FC和IB,延时更低。
读写Cache。写数据到Cache之后就马上返回,不需要落盘。 而且磁盘阵列有更多的控制器和硬盘,大大提高了并行度。
现在的存储厂商会找SPC帮忙测试自己的磁盘阵列产品(或全闪存阵列), 并给SPC支付费用,这就是赤裸裸的标准垄断。国内也有做存储系统测试的,假如你要测试磁盘阵列,可以找NSTC (广告时间)。
SSD测试
SSD的延时很低,并行度很高(多个nand块同时工作),缺点是寿命和GC造成的响应时间不稳定。
推荐用IOMeter进行测试,使用大队列深度,并进行长时间测试,这样可以测试出SSD的真实性能。
下图是storagereview对一些SSD硬盘做的4KB随机写的长时间测试,可以看出有些SSD硬盘的最大响应时间很不稳定,会飙高到几百ms,这是不可接受的。
云硬盘测试
我们通过两方面来提高云硬盘的性能的:
降低延迟(使用SSD,使用万兆网络,优化代码,减少瓶颈)
提高并行度(数据分片,同时使用整个集群的所有SSD)
在Linux下测试云硬盘
在Linux下,你可以使用FIO来测试
操作系统:Ubuntu 14.04
CPU: 2
Memory: 2GB
云硬盘大小: 1TB(SLA: 6000 IOPS, 170MB/s吞吐率 )
安装fio:
#sudo apt-get install fio
再次介绍一下FIO的测试参数:
ioengine: 负载引擎,我们一般使用lio,发起异步IO请求。
bs: IO大小
direct: 直写,绕过操作系统Cache。因为我们测试的是硬盘,而不是操作系统的Cache,所以设置为1。
rw: 读写模式,有顺序写write、顺序读read、随机写randwrite、随机读randread等。
size: 寻址空间,IO会落在 [0, size)这个区间的硬盘空间上。这是一个可以影响IOPS的参数。一般设置为硬盘的大小。
filename: 测试对象
iodepth: 队列深度,只有使用lio时才有意义。这是一个可以影响IOPS的参数。
runtime: 测试时长
4K随机写测试
我们首先进行4K随机写测试,测试参数和测试结果如下所示:
#fio -ioengine=lio -bs=4k -direct=1 -thread -rw=randwrite -size=100G -filename=/dev/vdb \
-name="EBS 4KB randwrite test" -iodepth=32 -runtime=60
蓝色方框表示IOPS是5900,在正常的误差范围内。绿色方框表示IO请求的平均响应时间为5.42ms, 黄色方框表示95%的IO请求的响应时间是小于等于 6.24 ms的。
4K随机读测试
我们再来进行4K随机读测试,测试参数和测试结果如下所示:
#fio -ioengine=lio -bs=4k -direct=1 -thread -rw=randread -size=100G -filename=/dev/vdb \
-name="EBS 4KB randread test" -iodepth=8 -runtime=60
512KB顺序写测试
最后我们来测试512KB顺序写,看看云硬盘的最大MBPS(吞吐率)是多少,测试参数和测试结果如下所示:
#fio -ioengine=lio -bs=512k -direct=1 -thread -rw=write -size=100G -filename=/dev/vdb \
-name="EBS 512KB seqwrite test" -iodepth=64 -runtime=60
蓝色方框表示MBPS为174226KB/s,约为170MB/s。
使用dd测试吞吐率
其实使用dd命令也可以测试出170MB/s的吞吐率,不过需要设置一下内核参数,详细介绍在 128MB/s VS 170MB/s 章节中。
在Windows下测试云硬盘
在Windows下,我们一般使用IOMeter测试磁盘的性能,IOMeter不仅功能强大,而且很专业,是测试磁盘性能的首选工具。
IOMeter是图形化界面(浓浓的MFC框架的味道),非常方便操作,下面我将使用IOMeter测试我们UOS上1TB的云硬盘。
操作系统:Window Server 2012 R2 64
CPU: 4
Memory: 8GB
云硬盘大小: 1TB
当你把云硬盘挂载到Windows主机之后,你还需要在windows操作系统里面设置硬盘为联机状态。
4K随机写测试
打开IOMeter(你需要先下载),你会看到IOMeter的主界面。在右边,你回发现4个worker(数量和CPU个数相同),因为我们现在只需要1个worker,所以你需要把其他3个worker移除掉。现在让我们来测试硬盘的4K随机写,我们选择好硬盘(Red Hat VirtIO 0001),设置寻址空间(Maximum Disk Size)为50GB(每个硬盘扇区大小是512B,所以一共是 50*1024*1024*1024/512 = 104857600),设置队列深度(Outstanding I/Os)为64。
然后在测试集中选择”4KiB ALIGNED; 0% Read; 100% random(4KB对齐,100%随机写操作)” 测试
然后设置测试时间,我们设置测试时长为60秒,测试之前的预热时间为10秒(IOMeter会发起负载,但是不统计这段时间的结果)。
在最后测试之前,你可以设置查看实时结果,设置实时结果的更新频率是5秒钟。最后点击绿色旗子开始测试。
在测试过程中,我们可以看到实时的测试结果,当前的IOPS是6042,平均IO请求响应时间是10.56ms,这个测试还需要跑38秒,这个测试轮回只有这个测试。
我们可以看到IOMeter自动化程度很高,极大解放测试人员的劳动力,而且可以导出CSV格式的测试结果。
顺序读写测试
我们再按照上面的步骤,进行了顺序读/写测试。下面是测试结果:
IO大小 读写模式 队列深度 MBPS
顺序写吞吐测试 512KB 顺序写 64 164.07 MB/s
顺序读吞吐测试 256KB 顺序读 64 179.32 MB/s
云硬盘的响应时间
当前云硬盘写操作的主要延迟是
网络传输
多副本,写三份(数据强一致性)
三份数据都落盘(数据持久化)之后,才返回
IO处理逻辑
我们当前主要是优化IO处理逻辑,并没有去优化2和3,这是因为我们是把用户数据的安全性放在第一位。
128MB/s VS 170MB/s
回到最开始的问题 “为什么使用dd命令测试云硬盘只有128MB/s”, 这是因为目前云硬盘在处理超大IO请求时的延迟比SSD高(我们会不断进行优化),现在我们有两种方法来获得更高的MBPS:
设置max_sectors_kb为256 (系统默认为512),降低延迟
使用fio来测试,加大队列深度
通过设置max_sectors_kb这个参数,使用dd也可以测出170MB/s的吞吐量
root@ustack:~# cat /sys/block/vdb/queue/max_sectors_kb
512
root@ustack:~# echo "256" > /sys/block/vdb/queue/max_sectors_kb
root@ustack:~#
root@ustack:~# dd if=/dev/zero of=/dev/vdb bs=32M count=40 oflag=direct
40+0 records in
40+0 records out
1342177280 bytes (1.3 GB) copied, 7.51685 s, 179 MB/s
root@ustack:~#
同时查看IO请求的延迟:
root@ustack:~# iostat -x vdb 5 100
...
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vdb 0.00 0.00 0.00 688.00 0.00 176128.00 512.00 54.59 93.47 0.00 93.47 1.40 96.56
下面是使用fio工具的测试结果,也可以得到170MB/s的吞吐率。
不可测试的指标
IOPS和MBPS是用户可以使用工具测试的指标,云硬盘还有一些用户不可测量的指标
数据一致性
数据持久性
数据可用性
这些指标我们只能通过根据系统架构和约束条件计算得到,然后转告给用户。这些指标衡量着公有云厂商的良心,有机会会专门进行介绍。
总结
上面介绍了一下测试工具和一些观点,希望对你有所帮助。
测试需要定性和定量
了解存储模型可以帮助你更好的进行测试
增加队列深度可以有效测试出IOPS和MBPS的峰值