虚拟机存储IO的那点事

2023-10-30

随机IO vs 顺序IO

一般90%以上的虚拟机都是随机IO模型,用户交互类应用,如桌面,Web,它们的存储IO在Hypervisor看来都是随机的,这主要是因为我们常见的文件格式如jpg, png, exe, elf一般都采用了元数据+数据的模式,应用程序经常需要来回移动文件指针读写文件中不同的部分,现代多核心多任务的操作系统会导致更多这样的并发任务,进一步加强了这种随机性。

顺序IO模型的典型应用比较少,据我目前所知,大数据应用是其中之一,比如hdfs一般都以很大的block size以数据流的方式读写大文件。

读缓存 vs 写缓存

随机io会导致更多的cache miss,在此情况下,读缓存(write through)不仅不会带来任何性能加速,反而还会导致额外的内存复制和上下文切换。

从可靠性的角度看,虚拟化一般不会采用写缓存(write back)。如果使用写缓存,在虚拟机中返回成功的写请求其实仅仅只是存在hypervisor的内存中,一旦主机重启或者掉电,这部分数据就会丢失。除非用户能保证他们的虚拟机可以承受数据丢失,否则我们尽量避免使用write back。

同步IO和异步IO

同步IO使用read/write调用,这些调用是阻塞的,为了保障主进程不被阻塞,以及能获得更大的IO吞吐,通常会使用多个IO线程。异步IO一般使用io_submit内核调用,它是非阻塞的,可以在一个线程内通过提交更多的IO,有利于IO合并算法,同时,对于IO密集应用,异步IO会节省更多的线程上下文切换开销,另外,io_submit会强制使用O_DIRECT的透写参数绕过缓存,所以能更好的适应随机IO模型,下面两幅图对比了同步IO和异步IO的系统处理流程:

同步IO读写流程

异步IO读写流程

KVM虚拟机的IO线程

几年前还是机械硬盘时代,单盘的容量虽然每年都能翻一番,但是读写性能特别是随机读写性能却是十年如一日,即使是15k转速的SAS磁盘,单盘仅仅100-200 IOPS,如今的NVME磁盘,随机读性能到100k-200k IOPS都不算个事。较早版本的QEMU(KVM的设备模拟程序)只有一个IO线程,这对于早期处理只有数百IOPS的虚拟机已经足够了,但是对于数十万IOPS的新介质,即使把一个CPU完全跑满,也处理不过来,因此,QEMU社区花了好几年的时间,历经好多版本,终于能够让IO处理能够完全脱离主线程,跑在多个不同的线程里面,充分利用现代多核处理器的能力,这个特性最早叫做dataplane,现在好像也叫iothread。

虚拟机配置

虚拟机磁盘sda配置

disk type='block':这个磁盘的后端是一个块设备,可以用lvcreate命令创建;这个参数也可以用type='file', 说明后端是一个文件,但是在生产环境中,逻辑卷的可靠性一般要高于文件系统,所以我更喜欢用block。

driver type='qcow2':KVM的磁盘格式默认为QCOW2, 我们一般从操作系统厂商下载的云镜像的格式也都是这个格式,它最大的好处是可以支持磁盘瘦分配(thin provisioning)。

driver cache=’none':使用无缓存模式(O_DIRECT)打开文件,这个参数还支持writethrough和writeback,对于随机IO 应用,建议使用none, 对于顺序IO应用,可以使用writethrough。

driver io='native':设置native,QEMU会调用异步io_submit来提交IO; 设置为threads,QEMU会最终调用pread/pwrite同步提交IO。

iothreads配置

iothreads:指定用4个独立的线程处理磁盘IO。

iothreadpin:将指定的iothread绑定到指定的cpu上运行。

https://segmentfault.com/a/1190000005981794

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

虚拟机存储IO的那点事 的相关文章

  • URL地址的两种格式

    1 传统格式 格式 scheme host port path query fragment scheme 协议 例如http https ftp等 必写 host 域名或IP地址 必写 port 端口号 http 默认端口为 80 可以省
  • React中使用百度地图

    1 找到百度地图首页 进入百度地图开放平台 地址如下 百度地图开放平台 百度地图API SDK 地图开发 2 找到开发文档中react BMapGL 如上图所示 我们进入React BMapGL JSAPI 地址如下 React BMapG
  • 超详细 Ubuntu安装PyTorch步骤

    目录 STEP1 进入PyTorch官网查看安装版本和指令 STEP2 为PyTorch单独创建conda环境 STEP3 进入STEP2中创建的conda环境 STEP4 输入STEP1中的安装指令安装PyTorch STEP5 安装Ju
  • CSS层叠上下文、层叠等级、层叠顺序、z-index

    一个 片面 的理解 以往 由于自己使用z index的频率不大 所以对这个CSS属性存在比较片面的认识 一直认为z index就是用来描述定义一个元素在屏幕Z轴上的堆叠顺序 z index值越大在Z轴上就越靠上 也就是离屏幕观察者越近 最后
  • yarn、pnpm 的常用命令

    yarn 下载 npm i yarn g 查看版本 yarn version yarn v 初始化 package json yarn init yarn init y 下载包 yarn add axios 默认生产环境 yarn add
  • 【100%通过率 】【华为OD机试c++/java/python】MVP争夺战【 2022 Q4 A卷

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 在星球争霸篮球赛对抗赛中 最大的宇宙战队希望每个人都能拿到MVP MVP的条件是单场最高分得分获得者 可以并列所以宇宙战队决定在比赛中尽可能让更
  • 1148.最大值

    include
  • Leetcode 刷题笔记(五) —— 链表篇之链表的基础操作和经典题目

    文章目录 系列文章目录 1 链表基本操作 707 设计链表 2 双指针迭代法 203 移除链表元素 206 反转链表 24 两两交换链表中的节点 3 双指针之快慢指针 19 删除链表的倒数第 N 个结点 160 相交链表 141 环形链表
  • Spring Boot CLI安装及快速入门示例

    Spring Boot CLI安装 Spring Boot是一个命令行工具 用于使用Spring进行快速原型搭建 它允许你运行Groovy脚本 这意味着你可以使用类Java的语法 并且没有那么多的模板代码 你没有必要为了使用Spring B
  • jpa|springboot|informix自定义SQL,条件判断

    jpa连mysql没什么说的 但是jpa连informix真的坑到家了 各种函数不支持 需求 在自定义sql的时候 需要判断参数是否为空 如果参数为空则不参与sql条件判断 就这么简单的一个需求 如果是jpa连mysql 那就用几个if判断
  • This application has no explicit mapping for /error, so you are seeing this as a fallback.

    Whitelabel Error Page This application has no explicit mapping for error so you are seeing this as a fallback Mon Nov 23
  • 矩阵打印(python实现)

    之前面试嵌入式软件的一道题 用c实现矩阵打印 考场上并没有写出来 之后总感觉自己写不出来也就没有去实现 在网上找也没能找到答案 结果这问题一直悬在脑海里 这才静下来想了想 发现并不难 便打算用python来实现 同时也是学习python之路
  • 基于PyTorch机器学习与深度学习实践应用与案例分析

    近年来 随着AlphaGo 无人驾驶汽车 医学影像智慧辅助诊疗 ImageNet竞赛等热点事件的发生 人工智能迎来了新一轮的发展浪潮 尤其是深度学习技术 在许多行业都取得了颠覆性的成果 另外 近年来 Pytorch深度学习框架受到越来越多科
  • azure 测试服务器性能,测试 Azure VM 网络吞吐量

    您现在访问的是微软AZURE全球版技术文档网站 若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站 请访问 https docs azure cn 带宽 吞吐量测试 NTTTCP 10 06 2020 本文内容 在
  • Python实现动态绘制爱心

    效果 源码 https download csdn net download x q x 87246985
  • 各种系统架构图及其简介

    各种系统架构图及其简介 转载请保留出处 不胜人生一场醉汇总 以下文字和架构图均在本人相关系统设计和架构方案中有所应用 原文出处 http space itpub net 6517 viewspace 609654 1 Spring架构图 S
  • QTextCodec中的setCodecForTr等终于消失了 (Qt5)

    在Qt4中 国内很多新手都喜欢 不分青红皂白地使用如下3行代码 QTextCodec setCodecForTr QTextCodec setCodecForCStrings QTextCodec setCodecForLocale 尽管之

随机推荐

  • linux修改host文件

    host文件位置 etc hosts vi etc hosts即可编辑 修改方式类似windows
  • 80X86微处理器堆栈指令

    压栈 弹栈指令 压栈 PUSH OP1 出栈 POP OP1 OP1可以是16位或32位的寄存器或存储器 压栈 弹栈数据存储过程 如SP 1000H BP 0FFFFH 执行下列指令后 DX SP STC Set CF 1 PUSH BP
  • 【Unity游戏开发】静态、动态合批与GPU Instancing

    https zhuanlan zhihu com p 356211912 前言 动态合批与静态合批其本质是对将多次绘制请求 在允许的条件下进行合并处理 减少cpu对gpu绘制请求的次数 达到提高性能的目的 目录 啥是合批 为啥要合批 调用D
  • socket通讯相互发送读取xml实例

    首先了解下socket通讯传输数据的特点 数据在网络传输时使用的都是字节流或字符流 Socket也不例外 所以我们发送数据的时候需要转换为字节发送 读取的时候也是以字节为单位读取 那么问题就在于socket通讯时 接收方并不知道此次数据有多
  • Python之Pandas绘图

    Pandas绘图
  • Qt --- 基本类

    位置和尺寸 在QT中我们常见的 点 线 尺寸 矩形 都被进行了封装 下面依次为大家介绍相关的类 QPoint QPoint类封装了我们常用用到的坐标点 x y 常用的 API如下 void QPoint setX int x void QP
  • CUDA8.0矩阵乘法例子解释(matrixMul.cpp)

    通过学习英伟达自带的例子matrixMul学CUDA库的使用 简略部分垃圾 只说核心代码 这个例子是实现 C A B的矩阵相乘 Use a larger block size for Fermi and above int block si
  • java:错误: 非法的表达式开始

    我写了这样一个代码 class Person private String name private int age Person System out println C name name age age Person String n
  • 记一道字节跳动的算法面试题

    来源公众号 苦逼的码农 作者 帅地 前几天有个朋友去面试字节跳动 面试官问了他一道链表相关的算法题 不过他一时之间没做出来 就来问了我一下 感觉这道题还不错 拿来讲一讲 题目 这其实是一道变形的链表反转题 大致描述如下 给定一个单链表的头节
  • CSAPP实验

    实验目的 1更好地熟悉和掌握计算机中整数和浮点数的二进制编码表示 2 实验中使用有限类型和数量的运算操作实现一组给定功能的函数 在此过程中加深对数据二进制编码表示的了解 3 熟悉linux基本操作命令 其中常用工具和程序开发环境 4 完善b
  • K8S安装部署的详细步骤与注意事项!

    目录 一 准备工作 1 关闭delinux和防火墙 2 配置 etc hosts文件 3 配置主机间的免密通道 4 关闭交换分区 提升性能 5 修改机器内核参数 6 配置阿里云repo源 7 配置时间同步 二 安装docker服务 1 安装
  • 百度网盘的最新插件(懂得都懂)

    下面先给大家介绍一下油猴插件 这个插件为什么叫油猴 现在我们经常提到的油猴插件 常指Tampermonkey 但Tampermonkey翻译过来是叫篡改猴 为什么会叫油猴呢 原因是因为另一个插件Greasemonkey 它翻译过来叫油猴 而
  • 010 Editor:二进制文件编辑利器

    使用010 Editor编辑二进制文件非常简单 只需打开目标文件即可 你可以使用导航面板轻松浏览文件内容 并直接在十六进制编辑器中进行编辑 010 Editor还提供了强大的模板功能 通过自定义模板 可以轻松解析二进制文件中的各种数据结构
  • 线程池任务队列和拒绝策略

    1 任务队列 BlockingQueue
  • SRTM1 V3.0数据批量下载

    USGS官网 EarthExplorer usgs gov 一 选取下载区域 可通过加载自己已有的shp文件选取 shp折点数属不能超过500 二 选取数据集 三 添加到Bulk Download 这里可选多页 然后点击 View Item
  • 按键点亮led灯

    原理图 K0这个按键按下时 开发板D1这个灯亮 松开 灯灭 代码如下 include stm32f4xx h void LED Init void 1 定义一个GPIO外设的结构体变量 GPIO InitTypeDef GPIO InitS
  • AHUT周赛2

    1 A Mahmoud and Ehab and the MEX Problem A Codeforces 核心在于x之前的数肯定是有的 x是没有的 所以从0开始一直到x 如果哪个数没有就加上哪个数 操作数 1 如果有x就删去x 操作数 1
  • 使用git将已有工程上传/push至Github完整初级过程

    相关链接 Github配置SSH基于Git Bash 设置Git的Username和Email 处理Key is invalid问题 如何在Eclipse平台使用git从GitHub上下载文件至本地及管理本地git项目 安装git Git下
  • Pandas库入门仅需10分钟

    数据处理的时候经常性需要整理出表格 在这里介绍pandas常见使用 目录如下 数据结构 导入导出文件 对数据进行操作 增加数据 创建数据 删除数据 改动数据 查找数据 常用操作 转置 常用统计值 参考链接 10 minutes to pan
  • 虚拟机存储IO的那点事

    随机IO vs 顺序IO 一般90 以上的虚拟机都是随机IO模型 用户交互类应用 如桌面 Web 它们的存储IO在Hypervisor看来都是随机的 这主要是因为我们常见的文件格式如jpg png exe elf一般都采用了元数据 数据的模