• Linux偷偷“吃”了我的内存?


    不知道刚使用Linux的小伙伴有没有遇到过这样的情况,有一天你看到自己的内存空间变少了,在一探究竟后,发现幕后“真凶”竟然是Linux!这到底怎么回事呢?

    发生了什么事?

    其实这是Linux正在借用未使用的内存进行磁盘缓存。这意味着内存看起来变少了,但实际上并没有。Linux之所有这么做,主要是为了让系统运行的更快,更流畅。除了让新手感到困惑外,它不会以任何方式占用应用程序的内存。

    我如果想运行更多的应用程序怎么办?

    当然,Linux确实借用了你的内存,注意这里是借用,不是占用。当应用程序需要更多的内存运行时,它们可以拿回被Linux借去用来做磁盘缓存的那块内存。Linux只是暂时借用,所以它可以立即将借走的内存还给应用程序,你的内存并没有实质上的减少。

    我需要更多的swap空间吗?

    Linux磁盘缓存只是借用了应用程序目前不需要的内存。它不会使用Swap空间。如果应用程序需要更多的内存,只需要从磁盘缓存中取回就可以了。这个过程不会用到Swap空间。

    我就想禁止磁盘缓存,这样做有害吗?

    可能你还是觉得Linux占用了你的应用程序内存,所以你就想阻止Linux进行磁盘缓存。但你最好别这么做。因为Linux进行磁盘缓存会使应用程序的加载速度更快,运行更流畅,除非你不希望它更快,更流畅。磁盘缓存在实质上永远都不会占用内存,所以你也没理由禁用它。

    当然,如果你发现自己需要通过清除一些内存来解决一个问题的时候,比如说你的虚拟机不听你的话了,你就可以用下面的这个命令来无损的删除Linux的磁盘缓存。

    echo 3 | sudo tee /proc/sys/vm/drop_caches

    为什么top和free说我所有的内存都用完了,而实际上并没有?

    这只是一个对术语理解上的差异。你和Linux系统都有一个共同的默认点,认为只要是被应用程序占用了那就是 "使用的",而没有被占用的内存就是 "空闲的"或者说是"可用的"。由于磁盘缓存占用了内存,所以在你的眼里这部分内存都是"使用的",但在Linux眼里它们既是"使用的"也是"可用的"。也就是top和free里的"缓冲区"和"缓存",这就是我所说的对术语理解的差异,由于这个理解差异的存在,所以你才会认为内存不足,但实际上并非如此。

    图片来源VidarHolen.net

    那到底还有多少内存呢?

    要想知道你的应用程序在不交换的情况下可以使用多少内存,可以运行free -m并查看 "available"栏。这些数据的单位是MiB。

    1. $ free -m
    2. total used free shared buff/cache available
    3. Mem: 1504 1491 13 0 855 792
    4. Swap: 2047 6 2041

    (如果你的Linux是2016年以前的版本,请看"-/+缓冲区/缓存 "行中的 "free "列。)

    就像上面的查询看到的一样,如果你非常天真地只看"已用"和"空闲",你就会认为你的内存已经用掉了99%,基本满了,可是实际上它只用了47%,也就是说你的认知内存和实际内存相差了52%!

    什么时候应该担心内存不足?

    一个健康的,有足够内存的Linux系统,在运行一段时间后,会出下以下无害的行为。

    •     free可用内存接近于0
    •     used内存接近于total
    •     acailable(或 "free+buffers/cache")有足够的空间(比方说,占总数的20%以上)。
    •     使用的swap空间没有变化

    而当系统真正进入低内存的状态,会出现以下的警告信号。

    •     available内存(或 "free+buffers/cache")接近于零
    •     使用的swap空间增加或波动
    •     dmesg | grep oom-killer显示 OutOfMemory-killer 在工作。

    Linux并不会偷偷"吃"掉你的内存,它只是再用磁盘缓存这种方式让你的系统运行的更快,更流畅,提高你的使用体验,仅此而已。

    了解"可用"的详细描述:kernel/git/torvalds/linux.git - Linux kernel source tree

    验证磁盘缓存相关特性:Experiments and fun with the Linux disk cache

    参考链接:Help! Linux ate my RAM!

  • 相关阅读:
    基于JavaSwing开发医院信息管理系统 毕业设计 课程设计 大作业
    【最多等和不相交连续子序列】python实现-附ChatGPT解析
    8位ADC是256还是255?
    【SIP&MRCP】freeswitch中的transfer和bridge有什么区别
    基于SSH的客户关系管理系统的设计与实现(JavaWeb开发的CRM管理系统)
    【Mysql面试加分项】——Innodb的死锁检测机制【文末送书】
    缓存策略与Apollo:优化网络请求性能
    【c++百日刷题计划】 ———— DAY18,刷题百天,养成刷题好习惯
    Rust 构建开源 Pingora 框架可以与nginx媲美
    python时间转换
  • 原文地址:https://blog.csdn.net/qq_43529978/article/details/122113176