详解Linux手动释放缓存的方法

2023-10-29

详解Linux手动释放缓存的方法

Linux释放内存的命令:

sync
echo 1 > /proc/sys/vm/drop_caches

0:不释放(系统默认值) 1:释放页缓存 2:释放dentries和inodes 3:释放所有缓存

释放完内存后改回去让系统重新自动分配内存。

echo 0 >/proc/sys/vm/drop_caches
free -m #看内存是否已经释放掉了

如果我们需要释放所有缓存,就输入下面的命令:

echo 3 > /proc/sys/vm/drop_caches

在Linux系统下,我们一般不需要去释放内存,因为系统已经将内存管理的很好。但是凡事也有例外,有的时候内存会被缓存占用掉,导致系统使用SWAP空
间影响性能,例如当你在linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching。,此时就需
要执行释放内存(清理缓存)的操作了。
Linux系统的缓存机制是相当先进的,他会针对dentry(用于VFS,加速文件路径名到inode的转换)、Buffer
Cache(针对磁盘块的读写)和Page
Cache(针对文件inode的读写)进行缓存操作。但是在进行了大量文件操作之后,缓存会把内存资源基本用光。但实际上我们文件操作已经完成,这部分
缓存已经用不到了。这个时候,我们难道只能眼睁睁的看着缓存把内存空间占据掉吗?所以,我们还是有必要来手动进行Linux下释放内存的操作,其实也就是
释放缓存的操作了。/proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段.也就是说可以通过修改
/proc中的文件,来对当前kernel的行为做出调整.那么我们可以通过调整/proc/sys/vm/drop_caches来释放内存。要达到释
放缓存的目的,我们首先需要了解下关键的配置文件/proc/sys/vm/drop_caches。这个文件中记录了缓存释放的参数,默认值为0,也就
是不释放缓存。 一般复制了文件后,可用内存会变少,都被cached占用了,这是linux为了提高文件读取效率的做法:为了提高磁盘存取效率,
Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换),
还采取了两种主要Cache方式:Buffer Cache和Page
Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了
I/O系统调用(比如read,write,getdents)的时间。”
释放内存前先使用sync命令做同步,以确保文件系统的完整性,将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O
和读写映射文件。否则在释放缓存的过程中,可能会丢失未保存的文件。

[root@fcbu.com ~]# free -m
       total    used    free   shared  buffers   cached
Mem:     7979    7897     82     0     30    3918
-/ buffers/cache:    3948    4031
Swap:     4996    438    4558

第一行用全局角度描述系统使用的内存状况: total 内存总数 used
已经使用的内存数,一般情况这个值会比较大,因为这个值包括了cache 应用程序使用的内存 free 空闲的内存数 shared
多个进程共享的内存总额 buffers 缓存,主要用于目录方面,inode值等(ls大目录可看到这个值增加) cached
缓存,用于已打开的文件 第二行描述应用程序的内存使用: -buffers/cache 的内存数:used – buffers –
cached buffers/cache 的内存数:free buffers cached 前个值表示-buffers/cache
应用程序使用的内存大小,used减去缓存值 后个值表示 buffers/cache 所有可供应用程序使用的内存大小,free加上缓存值
第三行表示swap的使用: used 已使用 free 未使用 可用的内存=free memory buffers cached。
为什么free这么小,是否关闭应用后内存没有释放?
但实际上,我们都知道这是因为Linux对内存的管理与Windows不同,free小并不是说内存不够用了,应该看的是free的第二行最后一个值:-/
buffers/cache: 3948 4031 ,这才是系统可用的内存大小。
实际项目中的经验告诉我们,如果因为是应用有像内存泄露、溢出的问题,从swap的使用情况是可以比较快速可以判断的,但free上面反而比较难查看。我觉得既然核心是可以快速清空buffer或cache,但核心并没有这样做(默认值是0),我们不应该随便去改变它。
一般情况下,应用在系统上稳定运行了,free值也会保持在一个稳定值的,虽然看上去可能比较小。当发生内存不足、应用获取不到可用内存、OOM错
误等问题时,还是更应该去分析应用方面的原因,如用户量太大导致内存不足、发生应用内存溢出等情况,否则,清空buffer,强制腾出free的大小,可
能只是把问题给暂时屏蔽了,所以说一般情况下linux都不用经常手动释放内存。

参考:https://cloud.tencent.com/developer/article/1722283

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

详解Linux手动释放缓存的方法 的相关文章

  • 编辑 CMakeLists.txt 以使用 -fPIC 进行编译

    我正在尝试为名为 libnifalcon 的 NOVINT Falcon 安装驱动程序 我使用 cmake 创建 make 文件 但是当我运行 make 时出现错误 Linking CXX shared library lib libnif
  • 变量名称后面的“-”(破折号)在这里有什么作用?

    if n BASH o n ZSH VERSION then hash r 2 gt dev null fi 我在哪里可以找到这方面的参考资料 谢谢 a 内的变量 称为 参数扩展 搜索该词在在线手册中 https man cx bash h
  • Linux 上的最大子进程数

    下面的代码将产生尽可能多的子级 自己不会进一步fork 一旦父进程退出就会变成僵尸 父进程将产生多少个子进程 int main int argc char arg while fork gt 0 子进程的数量可以通过以下方式限制设置限制 2
  • php.ini 更改,但在 Ubuntu 上无效

    我想更改 PHP 上传文件大小的限制 这是我的输出的一些信息phpinfo https www php net manual en function phpinfo php Configuration File php ini Path e
  • 在C中获取终端宽度?

    我一直在寻找一种从 C 程序中获取终端宽度的方法 我不断想出的是这样的东西 include
  • 窗口放置:适用于 Linux (KDE) 的类似 WinSplit Revolution 的应用程序? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 适用于 Linux KDE 的类似 WinSplit Revolution 的应用程序是什么 或者也许 KDE 中有一个我缺少的功能 平铺通常是窗口管
  • 从 Linux 内核模块的文件描述符获取文件名/路径?

    在Linux内核模块中 有没有一种方法可以从文件名 路径中获取文件名 路径 unsigned int fd 我知道这个答案 如何从内核模块内的文件描述符获取文件名 https stackoverflow com questions 8250
  • 为 bash 脚本创建应答文件

    我想为别人的 bash 脚本创建一个应答文件 当您运行 bash 脚本时 第一次安装该软件时 系统会询问您 5 个问题 我用的是yes script命令并且有效 它会自动应答yes对所有问题 不过我还是想回答一下no对于最后一个问题 有办法
  • 产生并处理软件中断

    有人可以告诉我如何在Linux下生成软件中断然后用request irq处理它吗 或者也许这是不可能的 您可以使用软中断来代替 您可以通过编辑 include linux interrupt h 来定义您的 sofirq 然后使用函数 ra
  • 编译错误:linux/module.h:没有这样的文件或目录

    我写了一个简单的模块 define KERNEL define MODULE include
  • 为什么我的 Linux 应用程序引入了错误的 .so 库?

    我正在构建一个使用 NetCDF C 库的应用程序 并且 NetCDF 正在引入 HDF 4 库 然而 它正在拉动wrongHDF 4 库 我的应用程序的链接方式如下 apps1 intel bin icpc gxx name apps1
  • 打印堆栈指针的值

    如何在 Linux Debian 和 Ubuntu 中用 C 打印堆栈指针的当前值 我尝试谷歌但没有找到结果 一个技巧是简单地将本地地址作为指针打印出来 但它不可移植 甚至无法保证有效 void print stack pointer vo
  • 将尾部输出重定向到程序中

    我想使用 tail 作为标准输入向程序发送文本文件中的最新行 首先 我向程序回显一些每次都相同的输入 然后从输入文件发送尾部输入 该输入文件应首先通过 sed 处理 以下是我期望工作的命令行 但是当程序运行时 它只接收回显输入 而不接收尾部
  • Linux 缓冲区溢出环境变量

    我一直在审查不同类型的缓冲区溢出 并遇到了一个我不记得为什么会发生的问题 下面的代码是我尝试执行缓冲区溢出的程序 include
  • /etc/php5/conf.d 文件夹中的 .ini 文件有什么用?

    我知道 ini 文件位于 etc php5 cli与 PHP 的 CLI 使用有关 文件位于 etc php5 fpm是关于 PHP 的 FastCGI FPM 方面 但是位于以下位置的 ini 文件又如何呢 etc php5 conf d
  • 使用Linux虚拟鼠标驱动

    我正在尝试实施一个虚拟鼠标驱动程序根据基本 Linux 设备驱动程序书 有一个用户空间应用程序 它生成坐标以及内核模块 See 虚拟鼠标驱动程序和用户空间应用程序代码 http www embeddedlinux org cn Essent
  • 更改子进程中的 iostream

    现在 我正在开发一个项目 其中我需要启动一个子进程来使用 C 在 Linux 中执行一个新程序 并且我需要重定向标准输入和输出 就像在 C 中一样 它们是cin and cout 到一个文件 这意味着在子进程中 标准输入和输出都是文件 子进
  • 如何永久清除 linux/ubuntu 终端或 bash 中的所有历史记录? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 当您在 Linux 终端中使用向上键时 可以再次使用之前的命令 很棒的功能 但是 我开始使用命令中的敏感详细信息将 mysql 记录到 mysql 中
  • 如何获取uinput创建的设备的名称(路径)

    我已经成功设置了一个小程序来创建uinput questions tagged uinput我计划使用它来自动测试接收键盘输入事件的应用程序 我已关注both http thiemonge org getting started with
  • 使用 perf 查找线程瓶颈并优化挂机时间

    对 cpu 周期进行采样perf record如果核心利用率大致恒定 则对于寻找优化候选非常有用 但对于具有并行性不同的多个阶段的代码 计算 cpu 周期将重点强调并行阶段 而低估影响挂机时间的顺序或有限并行阶段 简而言之 天真的 perf

随机推荐

  • powershell 脚本启动优化

    需求分析 powershell 启动慢的主要原因是 profile中的终端配置加载时间长 当我们打开powershell终端进行交互时 加载时间长 尚可忍受 但当我们的脚本 执行powershell脚本时 较长的加载时间 是不可接受的 优化
  • 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java动物爱心救助平台s9dza

    如果你自己基础不好或者是小白的情况下那就建议你选择网站 系统类的去做 但是还得问问你们导师 如果你们导师没问题就可以 因为有的导师是不愿意你们选择做网站 系统的 毕竟做的人比较多 重复率调高 选择这种题目都是要创新功能 所以会比较棘手 以下
  • RT-Thread动态和静态创建线程

    上一篇 RT Thread线程管理教程 http t csdn cn phnwQ 目录 一 静态创建线程和动态创建线程的区别 二 创建线程的常用函数 三 动态创建线程 四 静态创建线程 五 动态和静态创建线程结合 线程调度hook函数使用
  • 计算机科学与技术专业课程有哪些,计算机科学与技术专业课程有哪些

    计算机科学与技术专业简介 计算机科学与技术类专业毕业生的职业发展路线基本上有两条路线 一是纯技术路线 二是由技术转型为管理的路线 计算机科学与技术专业课程 电路原理 模拟电子技术 数字逻辑 数字分析 计算机原理 微型计算机技术 计算机系统结
  • Python——模拟退火在背包问题上的运用(详细代码)

    一 模拟退火简介 二 详细代码 import math import random import matplotlib pyplot as plt def init population n 生成一个种群 个体为全排列的随机排列 popul
  • [每日两题系列]刷算法题咯~~

    今日题目 反转链表 环形链表II 本系列所选题目均来自力扣或者牛客网站 所选题目主要是以其中的简单题为主 中等题为辅 包含少数困难题 原因是 本人目前能力还不够 开展这个系列的目的是督促自己 在暑假的时间里也要保持有一定的刷题量 拒绝摆烂
  • 测试用例(边界值法)

    1 什么是边界值法 有效数据和无效数据的分界点 往往作为程序员编写程序的判断点 是程序员容易犯错的地方 也是测试人员重点测试的内容 我们把这些分界点的值找到 并进行测试的方法 称为边界值法 2 边界值法应用的场合 1 有数据输入的地方 一般
  • 【毕业设计】基于M5Stack UnitV2的手写识别计算器的设计与制作

    目录 一 简介 二 设计原理 三 系统设计 四 注意点 五 困难 一 简介 耗时五个月 终于完成了毕业设计和毕业答辩 在这里记录一下学习与实现过程 题目是导师给的 这是主要任务和工作内容 利用M5Stack UnitV2的目标检测功能 用摄
  • Java中final 关键字

    final在Java中并不常用 然而它却为我们提供了诸如在C语言中定义常量的功能 不仅如此 final还可以让你控制你的成员 方法或者是一个类是否可被覆写或继承等功能 这些特点使final在Java中拥有了一个不可或缺的地位 也是学习Jav
  • python下载文件损坏_Python爬虫,图片下载完后是损坏的,怎么解决?

    coding utf 8 import requests from bs4 import BeautifulSoup import os import sys reload sys sys setdefaultencoding utf8 爬
  • Unknown column 'rownum' in 'where clause'解决方案

    Unknown column rownum in where clause 当在嵌套的查询语句里面用到rownum的时候会遇到这个问题 比如 SELECT FROM select t id t name from USER INFO t w
  • 矩阵的等价,相似,合同

    转自http blog csdn net abraham li article details 50058123 矩阵等价 定义 对同型矩阵A B 存在可逆阵P和Q 使得B PAQ 充要条件 A和B的秩相等 两个矩阵对应着两个不同的线性变换
  • [大话设计模式C++版] 第8章 雷锋依然在人间 —— 工厂方法模式

    源码可以在这里找到 大话设计模式C 版 模拟大学生学雷锋 main cpp class LeiFeng public void Sweep cout lt lt 扫地 lt lt endl void Wash cout lt lt 洗衣 l
  • Redis高可用方案--sentinel(哨兵模式)和集群

    redis高可用方案 sentinel 哨兵模式 和集群 一 redis高可用方案 sentinel 哨兵模式 哨兵模式简介 sentinel工作过程 关于sentinel的三个定时任务 sentinel网络 sentinel网络故障修复原
  • 坐得越久 死得越快 还是站着编程吧

    导读 一项对超过 20 万个澳大利亚人的研究结果给这样一个事实又增加了一份活体证明 坐得越久的人死得越快 研究同时还发现 锻炼不能改变这种趋势 尽管它能有效降低这种风险 老话题了 研究显示 久坐对你的健康是真的 真的 真的非常有害 请买一个
  • STM32 最简单的边沿触发脉冲计数程序

    include led h include delay h include key h include sys h include usart h include timer h include lcd h extern u8 sign e
  • 2.JVM自动内存管理

    2 自动内存管理 2 1 概述 Java与C 之间有一堵由内存动态分配和垃圾收集技术所围成的高墙 墙外面的人想进去 墙里面的人却想出来 C 需要对构建的每个对象的生命周期进行管理和维护 Java把对象的生命周期 内存管理 交给了JVM 简化
  • 重磅来袭!怎么用java编写app软件

    前言 本人是底层 211 本科 刚毕业 科研经历 但是有些项 经历 在国内监控行业某头部企业做过一段时间的实习 想着投下字节 可以积累 下 试经验和为金九银十面招做准备 投了简历之后 过了一段时 间 HR 就打电话跟我约时间 说明一下 我投
  • nodejs解决mysql和连接池(pool)自动断开问题

    最近在做一个个人项目 数据库尝试使用了mongodb sqlite和mysql 分享一下关于mysql的连接池用法 项目部署于appfog 项目中我使用连接池链接数据库 本地测试一切正常 上线以后 经过几次请求两个数据接口总是报503 一直
  • 详解Linux手动释放缓存的方法

    详解Linux手动释放缓存的方法 Linux释放内存的命令 sync echo 1 gt proc sys vm drop caches 0 不释放 系统默认值 1 释放页缓存 2 释放dentries和inodes 3 释放所有缓存 释放