文件I/O缓冲
xiaofei0859
这个作者很懒,什么都没留下…
展开
-
13.8 总结
13.8 总结输入输出数据的缓冲由内核和stdio库完成。有时可能希望阻止缓冲,但这需要了解其对应用程序性能的影响。可以使用各种系统调用和库函数来控制内核和stdio 缓冲,并执行一次性的缓冲区刷新。进程使用posix_fadvise()函数,可就进程对特定文件可能采取的数据访问模式向内核提出建议。内核可籍此来优化对缓冲区高速缓存的应用,进而提高I/O性能。在Linux环转载 2016-04-13 22:37:48 · 333 阅读 · 0 评论 -
Linux 性能优化之 IO 子系统 系列 图
http://blog.sina.com.cn/s/articlelist_1029388674_11_1.html Linux 性能优化之 IO 子系统(一)本文介绍了对 Linux IO 子系统性能进行优化时需要考虑的因素,以及一些 IO 性能检测工具。本文的大部分内容来自 IBM Redbook - Linux Performance and Tuning G转载 2017-08-01 11:38:37 · 1324 阅读 · 0 评论 -
文件IO - O_DIRECT和O_SYNC
一,O_DIRECT,绕过缓冲区高速缓存,直接IO直接IO:Linux允许应用程序在执行磁盘IO时绕过缓冲区高速缓存,从用户空间直接将数据传递到文件或磁盘设备,称为直接IO(direct IO)或者裸IO(raw IO)。应用场景:数据库系统,其高速缓存和IO优化机制均自成一体,无需内核消耗CPU时间和内存去完成相同的任务。使用直接IO的弊端:可能会大大降低性能,内核对转载 2017-07-07 16:28:02 · 1245 阅读 · 0 评论 -
read/fread write/fwrite 的实现原理
fread就是通过read来实现的,fread是C语言的库,而read是系统调用。差别在read每次读的数据是调用者要求的大小,比如调用者要求读取10个字节数据,read就会从内核缓冲区(操作系统开辟的一段空间用来存储磁盘上的数据)读10个字节数据到数组中,所以每次调用read会涉及到用户态与內核态之间的切换从而损耗一定的性能。而fread不一样,为了加快读的速度,fread每次都会从内核缓冲转载 2017-07-07 14:24:41 · 3802 阅读 · 0 评论 -
sendfile原理,实现文件传输性能的提升
在apache,nginx,lighttpd等web服务器当中,都有一项sendfile相关的配置,在一些网上的资料都有谈到sendfile会提升文件传输性能,那sendfile到底是什么呢?它的原理又是如何呢? 在传统的文件传输里面(read/write方式),在实现上其实是比较复杂的,需要经过多次上下文的切换,我们看一下如下两行代码: Java代码 rea转载 2016-11-03 09:44:43 · 477 阅读 · 0 评论 -
Linux 中的零拷贝技术,第 2 部分
http://www.ibm.com/developerworks/cn/linux/l-cn-zerocopy2/index.html?ca=drs-Linux 中的直接 I/O如果应用程序可以直接访问网络接口存储,那么在应用程序访问数据之前存储总线就不需要被遍历,数据传输所引起的开销将会是最小的。应用程序或者运行在用户模式下的库函数可以直接访问硬件设转载 2016-04-14 23:03:56 · 507 阅读 · 0 评论 -
Linux 中的零拷贝技术,第 1 部分
http://www.ibm.com/developerworks/cn/linux/l-cn-zerocopy1/index.html引言传统的 Linux 操作系统的标准 I/O 接口是基于数据拷贝操作的,即 I/O 操作会导致数据在操作系统内核地址空间的缓冲区和应用程序地址空间定义的缓冲区之间进行传输。这样做最大的好处是可以减少磁盘 I/O 的操作,因为如转载 2016-04-14 23:03:11 · 401 阅读 · 0 评论 -
sendfile:Linux中的"零拷贝"
如今几乎每个人都听说过Linux中所谓的"零拷贝"特性,然而我经常碰到没有充分理解这个问题的人们。因此,我决定写一些文章略微深入的讲述这个问题,希望能将这个有用的特性解释清楚。在本文中,将从用户空间应用程序的角度来阐述这个问题,因此有意忽略了复杂的内核实现。什么是”零拷贝”为了更好的理解问题的解决法,我们首先需要理解问题本身。首先我们以一个网络服务守护进程为例,考虑它在将存储在文件转载 2016-04-14 22:58:26 · 409 阅读 · 0 评论 -
DMA技术
DMA是指外部设备不通过CPU而直接与系统内存交换数据的接口技术。DMA技术的出现,使得外围设备可以通过DMA控制器直接访问内存,与此同时,CPU可以继续执行程序.那么DMA控制器与CPU怎样分时使用内存呢?通常采用以下三种方法:(1)停止CPU访内存;(2)周期挪用;(3)DMA与CPU交替访问内存. 要把外设的数据读入内存或把内存的数据传送到外设,一般都要通过CPU控制完转载 2016-04-14 22:37:33 · 1681 阅读 · 0 评论 -
sendfile()对Nginx性能的提升
Linux kernel 2.2之前,(如图)读写数据基本都是使用read系统调用和write系调用,以nginx来说如果一个请求建立,从磁盘的文件到网络连接之间会通过硬件(DMA)---内核层---用户层多次读写系统来完成文件数据的复制传输:从内核层用read系统调用读到用户层,再从用户层用write系统调用写到内核层,每一次用户层到内核层的进行一次上下文转换,这种代价是非常昂贵的。甚至在没有数转载 2016-04-14 22:21:33 · 580 阅读 · 0 评论 -
linux的sendfile系统调用
服务器响应一个http请求的步骤如下: 1 把磁盘文件读入内核缓冲区 2 从内核缓冲区读到内存 3 处理(静态资源不需处理) 4 发送到网卡的内核缓冲区(发送缓存) 5 网卡发送数据 数据从第一步中的内核缓冲区到第四步的内核缓冲区白白绕了一个圈,没有任何变化浪费了时间 而sendfile系统调用就是来解决这个问题的。sendfile省略了上面的 2、3步,磁盘文转载 2016-04-14 22:20:40 · 934 阅读 · 0 评论 -
13.6 绕过缓冲区高速缓存:直接I/O
13.6 绕过缓冲区高速缓存:直接I/O始于内核2.4,Linux允许应用程序在执行磁盘I/O时绕过缓冲区高速缓存,从用户空间直接将数据传递到文件或磁盘设备。有时也称此为直接I/O(direct I/O)或者裸I/O(raw I/O)。此处的描述细节为Linux所特有,SUSv3并未对其进行规范。尽管如此,大多数UNIX实现均对设备和文件提供了某种形式的直接I/O访问。有转载 2016-04-13 22:36:10 · 1572 阅读 · 0 评论 -
13.3 控制文件I/O的内核缓冲
13.3 控制文件I/O的内核缓冲(1)强制刷新内核缓冲区到输出文件是可能的。这有时很有必要,例如,当应用程序(诸如数据库的日志进程)要确保在继续操作前将输出真正写入磁盘(或者至少写入磁盘的硬件高速缓存中)。在描述用于控制内核缓冲的系统调用之前,有必要先熟悉一下SUSv3中的相关定义。同步I/O数据完整性和同步I/O文件完整性SUSv3将同步I/O完成 定义为:某转载 2016-04-13 22:34:02 · 579 阅读 · 0 评论 -
13.5 就I/O模式向内核提出建议
13.5 就I/O模式向内核提出建议posix_fadvise()系统调用允许进程就自身访问文件数据时可能采取的模式通知内核。内核可以(但不必非要)根据posix_fadvise()所提供的信息来优化对缓冲区高速缓存的使用,进而提高进程和整个系统的性能。调用posix_fadvise()对程序语义并无影响。参数fd所指为一文件描述符,调用期望通知内核进程对转载 2016-04-13 22:35:20 · 622 阅读 · 0 评论 -
13.7 混合使用库函数和系统调用进行文件I/O
13.7 混合使用库函数和系统调用进行文件I/O在同一文件上执行I/O操作时,还可以将系统调用和标准C语言库函数混合使用。fileno()和fdopen()函数有助于完成这一工作。给定一个(文件)流,fileno()函数将返回相应的文件描述符(即stdio库在该流上已经打开的文件描述符)。随即可以在诸如read()、write()、dup()和fcntl()之类的I/O系转载 2016-04-13 22:36:56 · 447 阅读 · 0 评论 -
13.4 I/O缓冲小结
13.4 I/O缓冲小结图13-1概括了stdio函数库和内核所采用的缓冲(针对输出文件),以及对各种缓冲类型的控制机制。从图中自上而下,首先是通过stdio库将用户数据传递到stdio缓冲区,该缓冲区位于用户态内存区。当缓冲区填满时,stdio库会调用write()系统调用,将数据传递到内核高速缓冲区(位于内核态内存区)。最终,内核发起磁盘操作,将数据传递到磁盘。转载 2016-04-13 22:34:44 · 629 阅读 · 0 评论 -
13.2 stdio库的缓冲
13.2 stdio库的缓冲当操作磁盘文件时,缓冲大块数据以减少系统调用,C语言函数库的I/O函数(比如,fprintf()、fscanf()、fgets()、fputs()、fputc()、fgetc())正是这么做的。因此,使用stdio库可以使编程者免于自行处理对数据的缓冲,无论是调用 write()来输出,还是调用 read()来输入。设置一个stdio流的缓冲模式转载 2016-04-13 22:32:43 · 618 阅读 · 0 评论 -
13.1 文件I/O的内核缓冲:缓冲区高速缓存
《Linux/UNIX系统编程手册(全2册)》第13章文件I/O缓冲,本章描述了这两种类型的缓冲,并讨论了其对应用程序性能的影响。本章还讨论了可以屏蔽或影响缓冲的各种技术,以及直接I/O技术--在某些需要绕过内核缓冲的场景中非常有用。本节为大家介绍文件I/O的内核缓冲:缓冲区高速缓存。第13章 文件I/O缓冲出于速度和效率考虑,系统I/O调用(即内核)和标准C语言库I/O函数(即std转载 2016-04-13 22:17:43 · 2714 阅读 · 0 评论 -
linux IO 内核参数调优 之 原理和参数介绍
1. page cachelinux操作系统默认情况下写都是有写缓存的,可以使用direct IO方式绕过操作系统的写缓存。当你写一串数据时,系统会开辟一块内存区域缓存这些数据,这块区域就是我们常说的page cache(操作系统的页缓存)。查看系统内存常用的命令有:vmstat、free、top等。可以使用 cat /proc/meminfo 查看详细的内存使用情况转载 2017-08-01 11:54:21 · 531 阅读 · 0 评论