内存发现自己的空闲空间越来越少,经过一番调查,发现罪魁祸首居然是Linux老大!

内存:Linux老大,这也没几个程序在运行,可是你为什么老是占用我的内存啊,内存都快被你吃光了!

Linux :你的容量那么大,空间闲着也是闲着,我啊,把那些空闲的空间都当成文件缓存了!

内存:  你看看你, 把这文件“拆成”了4K的碎片,这儿放一片,那儿放一片,把我的内存空间搞得乱糟糟的。

Linux :这叫做Page Cache , 其实一点也不乱,文件在哪一“片”内存中放着,我记得清清楚楚。我这么做也是不得已而为之啊,硬盘太慢,比你慢几万倍。CPU的一秒,你这里就是6分钟,硬盘那里就是好几个月!每次从他那里读点儿数据,几个月才给我回话, 我只好把读出来的数据先缓存到你这里了。

内存看到这张表格,不由得咂舌:没想到这外面的世界如此之慢啊!

正在此时, 一个叫helloworld的程序要读取文件。

helloworld :老大,我给你发了一个read系统调用,要读取config.txt的前1024个字节,把结果放到我的buffer中。

Linux :好,让我看看config.txt是不是已经在Page Cache中了,真不巧,还没缓存过。内存老弟,我又要吃你的空闲空间了。

Linux在内存中分配了一个4k 大小的page frame, 向硬盘发出DMA指令,读取cong.txt的4k的数据。

内存感觉奇怪:人家helloworld只要1024个字节,你干嘛让硬盘发过来4K数据?

Linux :我这里Page cache 都是以4K为单位的, 读一次得等几个月,还不多读一点?再说helloworld这小子很可能继续读文件的后续部分,下次就不用访问硬盘了。

过了“几个月” , 硬盘的数据复制到了内存的Page cache 中

内存说:这就完事了吧?

Linux :怎么可能!我得从Page cache 中取出前1024个字节,复制到helloworld指定的buffer 中。

这个buffer其实是helloworld虚拟地址空间heap上的地址,物理地址也是在你的内存中。

内存:我的天!难道数据要在我内存中出现两份?

Linux :没错!你不知道,复制数据还得用CPU呢!很费劲的。

helloworld:老大,能不能让我直接访问你Page cache 中的数据?

Linux :那怎么行,你在用户空间,我在内核空间,你要是能访问,在我这里捣乱怎么办?必须禁止!

内存:嗯,有道理,不过,要是还有个程序,也要读取config.txt的前1024个字节,怎么办?

Linux:  那就简单了啊, 我一查就知道数据已经在Page cache中了,不用等几个月从硬盘读了,直接复制到那个程序的缓冲区就行了。

内存:啊?这数据重复太多了吧!

Linux :嗯,确实是个问题,现在这些程序,动辄访问几十个文件,每个程序都复制一份,确实是巨大的浪费。

内存:我给你支个招,既然那些程序运行访问的都是虚拟地址,你让这些虚拟地址映射到Page cache上,大家不就可以共享了。

Linux :好主意,我来提供一个叫做mmap的系统调用,完成你说的功能。

helloworld运行结束,退出了。

内存:  helloworld退出了,你一会儿会清理掉对应的page cache吧?

Linux:暂时不会!

内存:啊?怪不得内存快被你吃光了!

Linux : 唉呀,你的内存闲着也是闲着,文件缓存着,下次再访问的时候,性能会有巨大提升!你放心,我会在合适的时机清理掉page cache的。

内存:那如果helloword修改文件内容呢?会立即写入硬盘吗?

Linux :也不会,我只是标记这个Page cache “dirty”了, 然后我定期写入硬盘。

内存:你怎么能这样!这不是欺骗那些程序吗!那要是断电怎么办?

Linux:对于需要及时写入硬盘的,有两种办法,一是调用我提供的fsync方法强制写入硬盘,二是在访问文件的时候,可以指定不用Page cache。

内存:相当于什么都没说,不用Page cache 多慢啊。

Linux :你现在也知道page cache的重要性了吧。page cache 是一种比较通用的文件缓存机制,是我来管理的。有些应用,比如数据库,他需要更加灵活、更加复杂的文件缓存,那他就不用page cache ,自己另起炉灶了。

内存:啊?数据库也在把我当作缓存?

Linux : 哈哈,是啊,要怪就怪硬盘吧,谁让它那么慢!不过他要是和你一样快,你小子就要下岗了,你想想,在一个访问速度超快,容量超大,还不怕断电威胁的存储器面前,你是不是就变成渣渣了?

内存叹了一口气: 好吧,我也管不了了,你们随意折腾吧。

后记:本文的第一个图和标题来自

https://www.linuxatemyram.com/, 文章的内容参考了https://manybutfinite.com/post/page-cache-the-affair-between-memory-and-files/ ,确切说,本文是加了料的改编版, 这个博客还有几篇关于虚拟内存的文章,非常棒,强烈建议大家去看看英文原文。

救命,Linux正在吃掉我的内存!相关推荐

  1. 文件读取 linux_救命,Linux正在吃掉我的内存

    内存发现自己的空闲空间越来越少,经过一番调查,发现罪魁祸首居然是Linux老大! 内存:Linux老大,这也没几个程序在运行,可是你为什么老是占用我的内存啊,内存都快被你吃光了! Linux :你的容 ...

  2. linux与windos 设置 tomcat 内存

    2019独角兽企业重金招聘Python工程师标准>>> linux与windos 设置 tomcat 内存资料路径 https://www.cnblogs.com/lcword/p/ ...

  3. Linux服务器Cache占用过多内存导致系统内存不足问题的排查解决

    Linux服务器Cache占用过多内存导致系统内存不足问题的排查解决 参考文章: (1)Linux服务器Cache占用过多内存导致系统内存不足问题的排查解决 (2)https://www.cnblog ...

  4. linux 增加 ip_conntrack_max 造成 内核内存问题

    1.由ip_conntrack引出的Linux内存映射 有很多文章在讨论关于ip_conntrack表爆满之后丢弃数据包的问题,对此研究深入一些的知道Linux有个内核参数ip_conntrack_m ...

  5. Linux内核之浅谈内存寻址

    Linux内核之浅谈内存寻址 前言 最近在看内存寻址的内容,略有所得,发此文与大家一起交流.我们知道计算机是由硬件和软件组成,硬件主要包括运算器.控制器.存储器.输入设备和输出设备,软件主要是操作系统 ...

  6. linux 查看java最大内存配置,Linux和Windows下的内存设置

    你对Tomcat JVM内存设置是否了解,本文向大家介绍一下Linux和Windows操作系统下Tomcat JVM内存设置方法,希望对你的学习有所帮助. Linux下修改Tomcat JVM内存设置 ...

  7. Linux进程地址空间与进程内存布局详解,内核空间与用户空间

    Linux进程地址空间与进程内存布局详解 程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码. 初始化过的数据(Data):在程序运行初已经对变量进行初始化的数据. 未初始化过的数据( ...

  8. 理解JVM如何使用Windows和Linux上的本机内存

    转至:http://www.chineselinuxuniversity.net/articles/23291.shtml 摘要:Java™ 堆耗尽并不是造成 java.lang.OutOfMemor ...

  9. Linux下实用的查看内存和多核CPU状态命令

    Linux下实用的查看内存和多核CPU状态命令 ]作者:zale0_0 来源:博客园 发布时间:2012-02-08 14:49 阅读:12 次 原文链接 [收藏] 查看多核CPU命令 mpstat ...

最新文章

  1. Facebook万字长文:AI模型全部迁移至PyTorch框架
  2. [转]Java——Servlet的配置和测试
  3. 机器学习之kNN算法(纯python实现)
  4. Google 开源的 Android 排版库:FlexboxLayout
  5. java 枚举 示例_Java枚举name()方法及示例
  6. 如何在MacBook连接鼠标时,停用内置触控式轨迹板?
  7. ThinkPHP RBAC如何自动获取所有模块的函数
  8. python中的commands模块
  9. 【分享】 图片轮换--函数化继承
  10. Django省市区三级联动
  11. 奶奶常说,黑白照片看的不清晰,还好我会Python,分分钟给她变成彩色的~
  12. 跨境电商亚马逊最新骗局揭秘:所谓的跨境电商亚马逊店铺真的能赚钱吗?真的靠谱?
  13. NLTK中使用Stanford parser 构建中文语法树
  14. switchover和failover
  15. Java实现 kiosk模式,適用於Linux Java Swing應用程序的Kiosk模式
  16. 信息数据管理思维导图(Xmind)
  17. Charles 乱码解决办法
  18. Python中类函数中self是什么
  19. etcd (一看就会)
  20. 【Java】一次简单实验经历——社交网络图的简化实现

热门文章

  1. 搜索引擎-倒排索引基础知识
  2. 《大话数据结构》第2章 算法基础 2.8 函数的渐近增长
  3. Ambrosus宣布推出用于Web Apps、iOS、Android的源代码开发套件
  4. 《Node.js设计模式》高级异步准则
  5. 使用LWA和Lync模拟外部测试无边缘单前端环境
  6. Python环境的安装
  7. Maven中如何禁止插件(plugin)在子模块(module)上执行
  8. CentOS安装setup
  9. Instance and Media Recovery Structures
  10. HDMI_VGA_CBVS同时显示