网络io和磁盘io

10月,我将在纽约参加O'Reilly Velocity会议,并发表“当我们谈论磁盘IO时我们谈论的话题”的演讲 。 我决定将我的一些准备笔记发布为一系列博客文章。

了解IO的工作原理,使用哪种算法以及在什么情况下可以改善开发人员和操作员的生活:他们将能够预先做出更好的选择(基于他们所评估的数据库所使用的内容),进行故障排除数据库行为不当(通过将其工作负载与打算使用数据库堆栈的工作负载进行比较)并调整其堆栈(通过分散负载,切换到不同的磁盘类型,文件或操作系统或仅选择文件)时的性能问题不同的索引类型)。

根据Wikipedia的IO风味

尽管经常讨论和讨论网络IO,但文件系统IO却很少受到关注。 当然,在现代系统中,人们通常将数据库用作存储手段,因此应用程序通过网络上的驱动程序与它们进行通信。 我认为了解数据如何写入磁盘并从磁盘读回仍然很重要。 此外,网络IO还有更多的要讨论的内容以及实现不同事物的方式,这在一个操作系统与另一个操作系统之间是非常不同的,而文件系统IO的工具集要少得多。

IO有多种“特色”(为简洁起见,一些功能被省略):

  • 系统调用: 打开 , 写入 , 读取 , fsync , 同步 , 关闭
  • 标准IO: fopen , fwrite , fread , fflush , fclose
  • 向量IO: writev可以获得 , readv
  • 内存映射IO: open , mmap , msync , munmap

今天,我们将讨论标准IO与一系列“用户态”优化的结合。 在大多数情况下,应用程序开发人员都在使用它,并在此之上加上几个不同的标志。 让我们开始吧。

缓冲IO

在谈论stdio.h函数时,在“缓冲”方面存在一些混乱,因为它们自己进行一些缓冲。 使用标准IO时,可以在全缓冲和行缓冲之间进行选择,也可以从任何缓冲中退出 。 这种“用户空间”缓冲与内核后面的缓冲无关。 您还可以考虑将“缓冲”和“缓存”区分开来,这应该使概念不同且直观。

磁盘(HDD,SSD)称为块设备 ,其上最小的可寻址单元称为扇区:不可能传输小于扇区大小的数据量。 同样,文件系统的最小可寻址单元是一个 (通常大于扇区)。 块大小通常小于(或等于) 页面大小 (概念来自虚拟内存)。

我们试图在磁盘上处理的所有内容最终都被加载到RAM中,最有可能由操作系统在两者之间进行缓存。

页面缓存

页面缓存 (以前是完全分开的,缓冲区缓存和页面缓存在2.4 Linux内核中是统一的 ) 帮助保持缓存更可能在最近的时间访问的缓冲区。 时间局部性原则意味着读取的页面将在短时间内访问多次,而空间局部性则意味着相关元素很可能彼此靠近,因此保存数据以进行摊销是有意义的。 IO成本。 为了提高IO性能,内核通过延迟写入和合并相邻的读取在内部缓冲数据。

页面缓存不一定包含整个文件(尽管肯定会发生)。 根据文件大小和访问模式,仅最近访问的块。 由于所有IO操作都是通过Cache发生的,因此诸如读写操作之类的操作序列可以完全从内存中获取,而无需访问磁盘上的(同时过时的)数据。

执行读取操作时,将首先查询页面缓存。 如果数据已经可以在页面缓存中找到,则将其复制给用户。 否则,它将从磁盘加载并存储在页面缓存中以供进一步访问。 执行操作时,页面将首先写入高速缓存,并在高速缓存中标记为脏。

标记为脏的页面(由于其缓存的表示形式现在与持久的页面不同)将被刷新到磁盘。 此过程称为writeback 。 当然,回写有其自身的潜在弊端,例如排队过多的IO请求,因此值得了解使用回写时使用的阈值和比率,并检查队列深度以确保可以避免节流和高延迟。

延迟错误

在执行由内核和/或库缓冲区支持的写操作时,确保数据实际到达磁盘非常重要,因为它可能会缓存或缓存在某处。 当数据刷新到磁盘时(可能是在同步或关闭文件时),将出现错误。

直接IO

O_DIRECT是打开文件时可以传递的标志。 它指示操作系统绕过页面缓存。 这一切都意味着对于使用Direct IO的“传统”应用程序,很可能会导致性能下降而不是加速。

内核开发人员常常不赞成使用Direct IO,而且到目前为止,Linux手册页还引用了Linus Torwalds:“ 关于O_DIRECT一直困扰我的是整个接口都是愚蠢的 ”。

但是,诸如PostgreSQL和MySQL之类的数据库使用Direct IO是有原因的。 开发人员可以使用自定义IO调度程序和特定于应用程序的缓冲区缓存来确保对数据访问模式进行更细粒度的控制。 例如,PostgreSQL使用Direct IO进行WAL (预写日志),因为他们必须在确保持久性的同时尽可能快地执行写入操作,并且可以使用此优化方法,因为他们知道不会立即重用数据,因此绕过内核页面缓存编写它不会导致性能下降。

即使数据最近被访问并且可能位于缓存中,直接读取也将直接从磁盘进行读取。 这有助于避免创建额外的数据副本。 写操作也是如此:执行写操作时,直接从用户空间缓冲区进行写操作。

块对齐

因为DMA(直接内存访问)使请求直接绕过中间内核缓冲区而直接发送到后备存储,所以要求所有操作都按扇区对齐(对齐512B边界)。 换句话说,每个操作的起始偏移量必须为512的倍数,缓冲区大小也必须为512的倍数。

例如,RocksDB 通过预先检查操作来确保操作是按块对齐的 (较旧的版本通过在后台对齐来允许不对齐的访问)。

无论是否使用O_DIRECT标志,始终确保读写块对齐是一个好主意:进行未对齐的访问将导致从磁盘加载多个扇区(或写回磁盘)。

使用块大小或恰好适合块内部的值可以保证块对齐的I / O请求,并防止内核内部的多余工作。

非阻塞文件系统IO

我在这里添加此部分是因为我经常在文件系统IO的上下文中听到“非阻塞”的声音。 这是很正常的,因为网络和文件系统IO的大多数编程接口都是相同的。 但是值得一提的是, 没有真正的“非阻塞” IO可以用同样的方式理解。

对于常规文件(在磁盘上),通常会忽略O_NONBLOCK,因为块设备操作通常被认为是非阻塞的(例如,与套接字不同)。 系统不考虑文件系统IO延迟。 之所以做出此决定,是因为数据到达的时间或多或少受到限制。

出于相同的原因,通常会使用诸如selectepoll之类的内容禁止监视和/或检查常规文件的状态。

结束语

考虑到要覆盖的材料太多,很难找到最佳的帖子大小,但是在移动到mmap和矢量IO之前,对标准IO有所了解是正确的。

如果您发现任何要添加的内容或我的帖子中有错误,请随时与我联系,我们将很乐意进行相应的更新。

翻译自: https://hackernoon.com/on-disk-io-part-1-flavours-of-io-8e1ace1de017

网络io和磁盘io

网络io和磁盘io_在磁盘IO上,第1部分:IO的风味相关推荐

  1. 【Linux】基础IO --- 内核级和用户级缓冲区、磁盘结构、磁盘的分治管理、block group块组剖析…

    出身寒微,不是耻辱.能屈能伸,方为丈夫. 文章目录 一.缓冲区(语言级:IO流缓冲,内核级:块缓冲) 1.观察一个现象 2.理解缓冲区存在的意义(节省进程IO数据的时间) 3.语言级缓冲区的刷新策略( ...

  2. 磁盘相关:磁盘IO、扇区、块与页

    磁盘IO:主要出现在数据库优化和存储规划过程中 读/写IO,最为常见说法,读IO,就是发指令,从磁盘读取某段扇区的内容.指令一般是通知磁盘开始扇区位置,然后给出需要从这个初始扇区往后读取的连续扇区个数 ...

  3. Qt linux获取cpu使用率、内存、网络收发速度、磁盘读写速度、磁盘剩余空间等

    Qt linux获取cpu使用率.内存.网络收发速度.磁盘读写速度.磁盘剩余空间等,实际上大部分都和qt无关的,用其他语言也可以获取. code: .h #ifndef RESOURCE_MINITO ...

  4. 计算机磁盘网络怎么共享,电脑的某个磁盘如何设置成共享

    我们在日常生活中,为了提高工作效率,减少不必要的操作,我们就电脑的某个磁盘如何设置成共享,下面小编就为大家介绍电脑的某个磁盘如何设置成共享方法,来看看吧! 操作: 1 右键我点电脑-属性-计算机名-网 ...

  5. 五种I/O 模式——阻塞(默认IO模式),非阻塞(常用语管道),I/O多路复用(IO多路复用的应用场景),信号I/O,异步I/O

    From: http://blog.163.com/xychenbaihu@yeah/blog/static/13222965520112163171778/ 五种I/O 模式: [1]        ...

  6. centos7创建asm磁盘_Oracle ASM 磁盘组基础知识整理(收藏版)

    为什么要写这么一篇基础知识呢?还是有那么一点点原因的,不是胡编乱造还真是有真实存在的事件的,前两周里因一套生产环境数据库磁盘不足无法对其进行表空间扩容,需要向存储岗申请存储资源,当存储岗划好资源加完存 ...

  7. 计算机处理io和cpu,虚拟化技术原理(CPU、内存、IO)

    虚拟化 云计算现在已经非常成熟了,而虚拟化是构建云计算基础架构不可或缺的关键技术之一. 云计算的云端系统, 其实质上就是一个大型的分布式系统. 虚拟化通过在一个物理平台上虚拟出更多的虚拟平台, 而其中 ...

  8. linux 获得磁盘 寻道时间,Linux入门篇 —— Linux 磁盘管理之磁盘理论篇 | 七日打卡...

    Linux 磁盘管理之磁盘理论篇 磁盘简介作用: 用来存放数据(二进制方式来管理数据) 分类机械硬盘 固态硬盘 机械硬盘组成盘片: 上面布满磁性颗粒,保存写入数据 主轴: 带动盘片转动,转到磁头的下方 ...

  9. Linux 磁盘性能优化 ——磁盘性能及高I/O排查

    文章目录 磁盘容量查看:df 如何衡量磁盘性能 每块磁盘使用观测:iostat 进程io观测:pidstat.iotop 案例分析 参考文献 作者邮箱:2107810343@qq.com 时间:202 ...

最新文章

  1. 死机一个月后,31岁的哈勃望远镜又复活了
  2. TCP客户机-服务器
  3. Java虚拟机学习(7):对象内存分配与回收
  4. final—前后端分离的网站
  5. win10 安装SQL Server 2005
  6. 好用的论文翻译工具集锦
  7. C# .NET 爬虫抓取京东商城所有商品分类
  8. 锐浪报表 Grid++Report 模板文件的读取
  9. unity自定义Scene窗口
  10. 中企海外周报 | 华晨与力帆合作在乌拉圭建厂;奇瑞在沙特发布全新SUV
  11. python设置默认utf8编码_Python设置默认编码为utf8的方法
  12. 实用干货!正交试验设计及极差分析步骤总结!
  13. C编程 求1到100之间的奇偶数之和
  14. Java毕设项目二次元文化网站(java+VUE+Mybatis+Maven+Mysql)
  15. 2017年总结(补全)
  16. figma下载_在Figma中将约束与布局网格一起使用
  17. 2.4G无线音频模块方案测评之RODE录音麦
  18. 压铸件浇口去除导致裂纹与缺料问题的分析与解决
  19. 中国石油大学远程教育《弟子规》
  20. 数据库udf提权,WAF绕过

热门文章

  1. antd table 超出显示省略号无效果
  2. 清华源阿里源 centos
  3. HTML之FrameSet,Frame和Iframe区别
  4. 10蓝牙模块 hm 电脑蓝牙 连接_树莓派与HM-10蓝牙模块搭建iBeacon | 学步园
  5. 基于Eclipse的毕业设计题目50例
  6. 如何使用overleafLaTeX
  7. MySQL-InnoDB的索引原理及优化技术
  8. Linux常用文件管理命令详解
  9. 爬虫项目实战二:爬取起点小说网
  10. android 汉字转字节,利用android源码实现获取汉字的拼音(修复BUG)