1.  操作系统缓存
在linux世界里,一切可读写设备都可看作是文件。文件cache设计的好坏直接影响着文件系统和磁盘的性能。最直观的是使用free命令看到的cached列。

这里面的cached列就是操作系统缓存,操作系统会把空闲的内存拿来做缓存,提高系统性能。当然这里的cached不仅仅缓存文件的数据。操作系统的cache是通过page的方式管理的,内从管理系统分配和回收cache的最小单位是page。这个cache由多个page cache组成,每个page cache又包含多个buffer cache。VF(虚拟文件系统)和内从管理系统只与page cache交互,具体的文件系统和buffer cache交互。
 
2. 操作系统缓存读写方式
操作系统默认的读写都是有缓存的,如果想使用直接io,需要设置direct_io为true。缓存可以提高系统的读取速度,当第一次读取一个文件的时候,操作系统会把文件内从读入cache中,然后返回给用户;第二次读取的时候首先会从cache中检查,命中后返回给用户。
操作系统IO有通写和回写两种写方式:
write through (通写)
可以理解IO通过的地方都写入。这种方式在写数据时,先写cache再写磁盘,写磁盘成功后通知磁盘控制器返告知操作系统本次IO成功,操作系统再通知上层应用IO成功。
write back (回写)
操作系统把数据写入cache后便告知上层应用IO成功,其实此时并没有把数据持久化到磁盘介质。何时把cache刷入磁盘由操作系统的实现策略:比如cache空间满、调用sync显示的把cache刷入磁盘等。
注意:回写和异步写不同,异步写在写成功后会通知调用层,而回写在写入磁盘后不会通知调用层。所以回写成功只意味着写入操作系统缓存成功了,在返回io返回成功的情况下依然可能丢数据;而异步写告诉调用层io成功意味着数据已经被持久化到存储介质中了。
通写和回写优缺点:
write through
优点:无丢数据风险:由于返回IO成功即表示持久化成功,那么掉电也不会丢失任何数据,
缺点:写入速度慢:要写内存和磁盘两份数据
write back
优点:写入速度快:只要写入cache成功即可返回
缺点:有丢数据风险:如果cache中的数据没有刷入磁盘时断电,cache中的数据会丢失。
 
两种方式应用场景:
write through 一般应用在数据一致性要求高的场合
write back 写方式一般应用在对一致性要求不高且需要很好读写性能场景
 
下面以cp命令做个例子

 
 
a. 初始时系统cache为60M
b. 使用dd命令生成一个10M的块设备,此时iotest.dat数据被缓存到cache中,cache变为70M
c. cp iotest.dat iotest.dat.1 会直接从内存中读取iotest.dat文件,然后写入到cache中。难道cache此时缓存了两份iotest.dat的数据?
d. 继续调用cp iotest.dat iotest.dat.2,cache变为了90M。可见cache中写时缓存不会对内容去重,缓存了3分相同内容的文件(iotest.dat iotest.dat.1 iotest.dat.2)。
e. 继续调用cp iotest.dat iotest.dat.1,由于在cache中iotest.dat 和iotest.dat.1都已被缓存,所以此处cache不在发生变化。(此处猜测cache支持文件级别去重,不支持内容去重)

linux系统读写缓存的更多相关文章

  1. Linux系统清除缓存

    1)缓存机制介绍在Linux系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回,如果没 ...

  2. LINUX - 文件读写缓存

    遇到一个进程core掉后日志打印不出来的问题: 参考如下: [引用] 只有正常退出,才能做到flush.否则将写失败. 之后有百度了下中文资料,发现同样的结论. "fflush库函数的作用是 ...

  3. Linux手动释放缓存的方法

    Linux释放内存的命令:syncecho 1 > /proc/sys/vm/drop_caches drop_caches的值可以是0-3之间的数字,代表不同的含义:0:不释放(系统默认值)1 ...

  4. linux系统缓存机制

    http://my.oschina.net/lenglingx/blog/425258 1.缓存机制 为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读 ...

  5. 释放Linux系统缓存

    清理Linux缓存使用下面的命令 sync; echo 3 > /proc/sys/vm/drop_caches 需求与原理 下面介绍buffer与cache的差别: A buffer is s ...

  6. 在Linux系统中使用Vim读写远程文件

    大家好,我是良许. 今天我们讨论一个 Vim 使用技巧--用 Vim 读写远程文件.要实现这个目的,我们需要使用到一个叫 netrw.vim 的插件.从 Vim 7.x 开始,netrw.vim 就被 ...

  7. Ubuntu等Linux系统清除DNS缓存的方法

    buntu等Linux系统清除DNS缓存的方法 直接说方法: 如果系统下有nscd,那么就直接 sudo /etc/init.d/nscd restart 如果没有也没关系,网上接受的方法大都是 su ...

  8. Linux系统性能测试工具(九)——文件系统的读写性能测试工具之iozone

    本文介绍关于Linux系统(适用于centos/ubuntu等)的文件系统的读写性能测试工具-iozone: 参考链接: https://www.cnblogs.com/Dev0ps/p/788938 ...

  9. Linux系统的buff/cache缓存清理脚本

    cacheClean.sh #!/bin/bash # 日期: # 作者: 黄慧丰/何鹏举 # 说明: fastdfs所在的linux系统的buffer cache过大, 且并没有有效的自动回收, 因 ...

随机推荐

  1. hash练习们

    610. 数对的个数 ★★   输入文件:dec.in   输出文件:dec.out   简单对比时间限制:1 s   内存限制:128 MB Description出题是一件痛苦的事情!题目看多了也 ...

  2. [Swift通天遁地]四、网络和线程-(7)检测服务器接口的访问状态:验证请求结果和可访问性

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  3. Akka源码分析-ask模式

    在我之前的博文中,已经介绍过要慎用Actor的ask.这里我们要分析一下ask的源码,看看它究竟是怎么实现的. 开发时,如果要使用ask方法,必须要引入akka.pattern._,这样才能使用ask ...

  4. Java经典算法之插入排序(Insert Sort)

    插入排序在局部有序的情况下比冒泡排序快一倍,比选择排序快一点. 那什么是插入排序,就是将局部有序的数据向右移动,将未排序的数据插到他的前面 下面我们来解析代码: 这里外层循环out变量从1开始向右移动 ...

  5. tomcat解决 java.lang.IllegalArgumentException: Request header is too large

    tomcat运行项目时,有一个请求过去后,后台报这样的错java.lang.IllegalArgumentException: Request header is too large 原因:请求头超过 ...

  6. linux命令(006) -- w

    w命令用于显示已经登陆系统的用户列表,并显示用户正在执行的指令.执行这个命令可得知目前登入系统的用户有那些人,以及他们正在执行的程序.单独执行w命令会显示所有的用户,您也可指定用户名称,仅显示某位用户 ...

  7. C与C艹的内存管理方式

    C 内存开辟出的空间一般可以分成:代码段,数据段(初始化的数据段, 为初始化的数据段BSS),堆,栈 代码段:保存程序文本,指令指针EIP就是指向代码段,可读可执行不可写 数据段:保存初始化的全局变量 ...

  8. cocos2d-x 调用第三方so文件

    一:假设.so文件名称 : libhi.so 1.jni文件下创建一个prebuilt 2.android.mk文件中找到  include $(CLEAR_VARS), 在这句后面添加如下代码 in ...

  9. 6.11---swagger文件上传的写法【照着写就行了,主要是需要声明contentType未mutilpart---如果不设置这个,就无法识别文件的】

    MultipartFile 是直接接收前台传过来的文件,File是抽象出来的文件对象,用来表示文件,一般操作都是操作的File,所以需要将MultipartFile转为File controller写 ...

  10. Puppeteer——自动化脚本设计

    我被分配了一个繁琐的任务,就是要给100个相同的站点做同样的配置.曾经就有做过相同的事,那时还不会写脚本,全靠手动配置.机械的配置了两天的时间,身体感觉被掏空.所以这次我决定还是写一个脚本自动的进行配 ...