前面讲了KVM CPU(http://blog.csdn.net/dylloveyou/article/details/71169463)、内存(http://blog.csdn.net/dylloveyou/article/details/71338378)的优化,下面接着第三块的内容,KVM磁盘性能方面的调优。磁盘IO我们可以从以下四个方面去着手优化:

  1. 磁盘类型选择
  2. 缓存模式选择
  3. AIO 异步读写方式选择
  4. 磁盘IO调度器选择

磁盘类型选择

磁盘方面,建议是用Virtio模式,在CentOS7.1 中,磁盘的类型有IDE 、SATA 以及virtio 三种。磁盘这块也有完全虚拟化和半虚拟化之分。virtio它就是半虚拟化的,最初是由澳大利亚的一个天才级程序员Rusty Russell编写,是一个在hypervisor之上的抽象API接口,它让客户机知道自己运行在虚拟化环境中,从而与hypervisor一起根据 virtio 标准协作,因此,virtio能让客户机中达到更好的性能(特别是I/O性能)。

关于使用virtio的测试数据,如下图所示,virtio模式的读写能力远高于IDE的: 

图上淡紫色的数据条是virtio的数据,红色的是IDE的,性能几乎是相差很大。

所以大家在选择磁盘模式的时候,注意选择virtio模式,特别是在云环境里,你制作的虚拟机模版,最好选择virtio模式。

缓存模式选择

目前KVM这块支持5种磁盘缓存模式,writethrough、writeback、none、directsync或者unsafe。一般用到的就是前面3种,后面两种几乎不会使用。

  • writethrough:(直写模式)数据直接写入磁盘里,不使用缓存;在数据更新时,同时写入缓存Cache和后端存储。此模式的优点是操作简单;缺点是因为数据修改需要同时写入存储,数据写入速度较慢。
  • writeback:(回写模式)在数据更新时只写入缓存Cache。只在数据被替换出缓存时,被修改的缓存数据才会被写到后端存储。此模式的优点是数据写入速度快,因为不需要写存储;缺点是一旦更新后的数据未被写入存储时出现系统掉电的情况,数据将无法找回。
  • none:这种模式作用在Guest OS Pagecache和Physical Disk 
    Cache中,相当于虚拟机能直接访问宿主机的磁盘,性能不错!

 
从图中可以看到,writeback采用了guest和host两层的page cache,也就是说同一个文件会存在两份cache,这是没有必要的,none和writethrough都会绕过host层的page cache。

低于QEMU-KVM 1.2 的版本kvm默认的cache方式是writethrouh,这种方式是最安全的,不会造成数据的不一致性,但是性能也是最差的。

总的来说,这三种模式,从安全和性能两角度分析,效果如下: 
性能上: writeback > none > writethrough 
安全上 :writeback < none < writethrough 
关于这三种模式的测试结果,如下图所示: 
 
其中淡紫色的是 none模式,我们发现它的性能数据几乎很平均,所以选择它是最合适的方式,既安全稳定性能又不错。设置的方法也很简单,直接在XML里定义:

<driver name='qemu' type='qcow2' cache='none'/> 
  • 1

加上cache='none'即可

综合数据的安全性和性能,建议选择none模式,注意CentOS下默认是none。

AIO 异步读写方式选择

aio 这块分为两种,一种是native方式,还有一种是thread方式。

Linux系统上异步IO常见的有两种实现,一种是kernel native AIO,另外一种是threaded aio: user space AIO emulated by posix thread workers。

Kernel native AIO : Kernel的原生态异步IO实现。

Threaded aio : linux用户空间异步IO的实现,其实它不是真正的异步IO,是通过启动一定数量的 blocking IO线程来模拟异步IO。这种实现有不少缺点,毕竟有不少线程开销,还在改进中。

因此,我们KVM里选择AIO这块选择Kernel的原生态的native更好。 
开启方式是:

<driver name='qemu' type='qcow2' cache='none' aio='native'/>
  • 1

磁盘IO调度器选择

目前Linux 磁盘IO调度主要有3种,NOOP ,Deadline ,CFQ 。

Deadline I/O scheduler :用过期时间来排序io操作顺序,保证先出现的io请求有最短的延迟时间,相对于写操作,给读操作更优先的级别,是比较好的一个调度模式。特别适合于读取较多的环境(比如数据库,Oracle 10G 之类)。

NOOP (elevator=noop): 这个调度模式会把所有的数据请求直接合并到一个简单的队列里。在有些SAN 环境下,这个选择可能是最好选择。适用于随机存取设备, 不适合有机械结构的存储器。因为没有优化顺序,会增加额外的寻道时间。属于最简单的一个调度模式,无视io操作优先级和复杂性,执行完一个再执行一个,如果读写操作繁多的话,就会造成效率降低。

CFQ I/O scheduler:完全公平队列,是anticipatory模式的替代品,没有过多的做预测性调度,而是根据给定的进程io优先级,直接来分配操作的顺序。这个模式在linux上表现良好,但也许并不是最适合android的io调度模式,太强调均衡,而降低了连续读写数据的性能。适用于有大量进程的多用户系统。

Linux默认是deadline,我们可以通过命令 cat /sys/block/sd*/queue/scheduler 查看: 
 
如果要更改模式,我们就用: 
格式:echo {SCHEDULER-NAME} > /sys/block/{DEVICE-NAME}/queue/scheduler 
例:echo cfq > /sys/block/sda/queue/scheduler 改成cfq模式

这三种调度方式,得具体看你的虚拟机跑的应用去选择,一般的是选择CFQ模式。

转载自云技术实践微信公众号,作者宝哥。

KVM总结-KVM性能优化之磁盘IO优化的更多相关文章

  1. linux性能优化cpu 磁盘IO MEM

    系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不 是说现在优化了,测试了,以后就可以一劳永逸了,也不是说书本上 ...

  2. nginx 的磁盘IO优化

    磁盘IO优化的几个方面 优化读取 Sendfile 零拷贝.内存盘.SSD盘 减少写入 AIO 增大error_log级别的日志 关闭access_log  压缩access_log 是否启用prox ...

  3. kvm磁盘io优化以及性能测试以及与物理机对比

    ubuntu下kvm的磁盘io性能优化步骤 1.virsh shutdown wcltest2 2.virsh edit wcltest2 <driver name='qemu' type='q ...

  4. Linux性能监测:磁盘IO篇

    磁盘通常是计算机最慢的子系统,也是最容易出现性能瓶颈的地方,因为磁盘离 CPU 距离最远而且 CPU 访问磁盘要涉及到机械操作,比如转轴.寻轨等.访问硬盘和访问内存之间的速度差别是以数量级来计算的,就 ...

  5. KVM总结-KVM性能优化之网络性能优化

    前面已经介绍了KVM CPU优化(http://blog.csdn.net/dylloveyou/article/details/71169463).内存优化(http://blog.csdn.net ...

  6. 【好书摘要】性能优化中CPU、内存、磁盘IO、网络性能的依赖

    系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不 是说现在优化了,测试了,以后就可以一劳永逸了,也不是说书本上 ...

  7. 性能优化中CPU、内存、磁盘IO、网络性能的依赖(转)

    关于系统性能优化,推荐一篇不错的博客! 系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不 是说现在优化了,测试 ...

  8. 性能优化中CPU、内存、磁盘IO、网络性能的依赖

    系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不 是说现在优化了,测试了,以后就可以一劳永逸了,也不是说书本上 ...

  9. 转-性能优化中CPU、内存、磁盘IO、网络性能的依赖

    转自:https://www.cnblogs.com/Javame/p/3665565.html 系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估. ...

随机推荐

  1. react 学习资料

    react 学习资料 项目 学习资料 react 中文版:https://doc.react-china.org/ react-router https://reacttraining.com/rea ...

  2. Linux 命令之删除命令

    在Linux下删除文件用rm命令,具体用法如下: rm [选项] 文件 选项说明: -f -force 忽略不存在的文件,强制删除,无任何提示 -i --interactive 进行交互式地删除 -r ...

  3. ubuntu防火墙ufw使用教程

    查看ubuntu版本cat /etc/issue或者lsb_release -a 防火墙 由于Linux原始的防火墙工具iptables过于繁琐,所以ubuntu默认提供了一个基于iptable之上的 ...

  4. 自然语言处理工具python调用hanlp中文实体识别

    Hanlp作为一款重要的中文分词工具,在GitHub的用户量已经非常之高,应该可以看得出来大家对于hanlp这款分词工具还是很认可的.本篇继续分享一篇关于hanlp的使用实例即Python调用hanl ...

  5. Spring Boot中对自然语言处理工具包hanlp的调用详解

    概 述 HanLP 是基于 Java开发的 NLP工具包,由一系列模型与算法组成,目标是普及自然语言处理在生产环境中的应用.而且 HanLP具备功能完善.性能高效.架构清晰.语料时新.可自定义的特点, ...

  6. 12c R2 RAC Oracle Linux 7.3 ESXI6.5

    环境:ESXI6.5虚拟化 主机配置:操作系统 Oracle Linux 7.3 CPU:8个VCPU 内存:16G 本地磁盘:50G 全程默认最小化安装Oracle Linux 7.3操作系统 每个 ...

  7. Eclipse安装插件的“最好方法”:dropins文件夹的妙用

    在Eclipse3.4以前安装插件非常繁琐. 在Eclipse3.5以后插件安装的功能做了改进.而且非常方便易用. 我们只需要把需要的插件复制(拖放)到eclipse\dropins,然后插件就安装成 ...

  8. SDRAM读写操作

    SDRAM读写操作 1.读操作 2.写操作 SDRAM所有时序参数都可以在芯片手册上查到.

  9. 把指定的字符串翻译成 pig latin。

    freecodecamp上的算法题: 把指定的字符串翻译成 pig latin. Pig Latin 把一个英文单词的第一个辅音或辅音丛(consonant cluster)移到词尾,然后加上后缀 & ...

  10. javascript 对象的原型

    往往定义一个函数时,函数内部有关键字this时,就把这个函数当成对象,this相当于python中的self.都是对象中用到的,代表对象本身. js不像python,在函数内部定义的子函数,在每次创建 ...