文件系统缓存

filesystem cache

许多人没有意识到。文件系统缓存对于性能的影响。Linux系统默认的设置倾向于把内存尽可能的用于文件cache,所以在一台大内存机器上,往往我们可能发现没有多少剩余内存。(free命令显示的第二行输出,如下)。文件系统cache可以加速磁盘操作,使系统有更好的IO性能,代价只是把一些空闲的内存利用起来了。

我们需要预留多少内存做文件系统cache呢? 首先我们要理解“free”命令

             total       used       free     shared    buffers     cached
Mem: 2058824 1772172 286652 0 214708 879744
-/+ buffers/cache: 677720 1381104
Swap: 1048568 84 1048484

对于如上的命令输出,我们看下Mem 节,total列显示我们一共有2G内存。used列显示我们使用了约1.8G内存(1772172),快接近总内存了。其实used列包含了用于文件系统cache的部分,真实用到的内存可能远远没有这么多。

我们查看“-/+ buffers/cache.” 节,这里的“used”列(677,720)表明实际使用了多少内存。 “free”列=Mem节的buffers+cached+free ,即 free = 214708+879744+286652 = 1381104 ,表明如果bffers和cache都是空的,我们拥有多少空闲内存。所以这台机器实际只是用来661M内存(677720/1024/1024) .

那么,对于这个应用,这是合适的cache分配吗?需要更多内存用于cache吗?是否有浪费资源呢?答案是“依情况而定”。

cache的规则很简单:你希望cache能够尽可能满足正在执行的工作。从应用程序栈的角度考虑,越往下层,cache越不那么高效,越不知道应该缓存哪些内容,那么你就可能需要更大的内存,想想看磁盘阵列的巨大的cache就知道了。所以,如果你的应用程序有能力去cache,你最好把内存更多留给你的应用程序,而不是文件系统缓存。当然,也不是把所有空闲内存都分配给应用程序,因为文件系统缓存在一些场合仍然有用,比如写日志,我们也可能需要额外的buffers。但是如果让你做一个选择,是给你的数据库10GB内存还是给文件系统cache 10G内存,显然你应该把内存给数据库。所以高效的磁盘数据库往往自己实现了存储子系统,而不是依赖于文件系统缓存,从理论上来说,MySQL Innodb这样实现了自己的存储引擎,可以更智能的缓存数据的数据库天然就比Mongodb这样依赖文件系统来刷新数据的数据库高效得多。
所以,对于我们的操作系统,free命令显示出的空闲内存,应该更多关注-/+ buffers/cache:   这节内容。这表明了你的系统可能还剩余的空闲内存。我们需要确保我们有足够的剩余用于以后的负荷增长。对于数据库类应用,很多时候,我们希望越过文件系统,但对于一些日志操作,仍然需要利用文件系统cache的,由于文件系统cache不够可能导致对磁盘的压力突然增加,对于非数据库的其他应用,比如web服务器,虚拟机,往往利用好文件cache更高效,特别是对于改善IO有好处。

转载自:http://www.db110.com/文件系统缓存/

Linux 文件系统缓存 -针对不同数据库有不同作用的更多相关文章

  1. Linux 文件系统缓存dirty_ratio与dirty_background_ratio两个参数区别

    文件系统缓存dirty_ratio与dirty_background_ratio两个参数区别 (2014-03-16 17:54:32) 转载▼ 标签: linux 文件系统缓存 cache dirt ...

  2. linux文件系统 - 初始化(二)

    加载initrd(上) 一.目的 本文主要讲述linux3.10文件系统初始化过程的第二阶段:加载initrd. initrd是一个临时文件系统,由bootload负责加载到内存中,里面包含了基本的可 ...

  3. linux文件系统初始化过程(5)---加载initrd(下)

    一.目的 linux把文件分为常规文件.目录文件.软链接文件.硬链接文件.特殊文件(设备文件.管道文件.socket文件等)几种类型,分别对应不同的新建函数sys_open().sys_mkdir() ...

  4. Linux文件系统的目录结构详解

    Linux文件系统的目录结构详解   一.前 言 文章对Linux下所有目录一一说明,对比较重要的目录加以重点解说,以帮助初学者熟练掌握Linux的目录结构. 二.目 录 1.什么是文件系统 2.文件 ...

  5. Linux 文件系统剖析

    [转自]https://www.ibm.com/developerworks/cn/linux/l-linux-filesystem/ 按照分层结构讨论 Linux 文件系统 在文件系统方面,Linu ...

  6. linux文件系统相关资料

             linux下文件系统通常是通过虚拟文件系统(VFS)蔽下层具体文件系统操作的差异,为上层的操作提供一个统一的接口.文件系统底层都是用系统IO缓存层提供的块读写接口,实现逻辑块到物理块 ...

  7. 区块链阶段1-Linux基础- 2 Linux文件系统

    2.1 什么是文件系统 文件系统是操作系统在磁盘或分区上组织文件的方法和数据结构.负责对磁盘空间进行组织和分配,存储文件数据,并对其提供保护和检索服务.学习Linux,首先需要了解整个 Linux 文 ...

  8. linux文件系统体系结构 和 虚拟文件系统(VFS)

    图 1. Linux 文件系统组件的体系结构 用户空间包含一些应用程序(例如,文件系统的使用者)和 GNU C 库(glibc),它们为文件系统调用(打开.读取.写和关闭)提供用户接口.系统调用接口的 ...

  9. 磁盘、分区及Linux文件系统 [Disk, Partition, Linux File System]

    1.磁盘基础知识 1.1 物理结构 硬盘的物理结构一般由磁头与碟片.电动机.主控芯片与排线等部件组成:当主电动机带动碟片旋转时,副电动机带动一组(磁头)到相对应的碟片上并确定读取正面还是反面的碟面,磁 ...

随机推荐

  1. centos7编译安装memcached

    1.libevent 源码地址:https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent ...

  2. docker深入学习二

    dicker:数据管理 数据管理机制 docker使用union file system来管理数据,docker构建image和container也是采用了同样的技术. image层次 iamge由多 ...

  3. shell分享

    shell脚本分享 一.介绍shell Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序, ...

  4. Logrotate滚动openresty日志

    一.摘要 Linux服务器上我们用Logrotate来分割归档日志文件,结合crond我们可以指定每天在某个时间自动整理日志等文档.本文主要说明了Centos下Logrotate的使用和配置的方法. ...

  5. 为什么重写equals一定要重写hashCode方法?

    大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白. 下面我们看下Objec ...

  6. Python接口自动化基础---环境准备

    安装requests模块 pip install requests request帮助文档查看 import requests print(help(requests)) Help on packag ...

  7. OC与swift相互调用

    一.OC调用swift文件 二.swift调用OC文件 三.注意和总结 添加: 四.自定义桥接文件 一.OC调用swift文件 在OC项目中创建一个swift文件的时候,Xcode 会提示 需要创建一 ...

  8. Part_two:Redis之发布订阅

    Redis发布订阅 发布订阅的命令 PUBLISH channel msg 将信息 message 发送到指定的频道 channel SUBSCRIBE channel [channel ...] 订 ...

  9. Angular配置路由以及动态路由取值传值跳转

    Angular配置路由 1.找到 app-routing.module.ts 配置路由 引入组件 import { HomeComponent } from './home/home.componen ...

  10. python多进程并行代码

    from multiprocessing import Process import sys, os import time def timetask(string): while True: pri ...