Linux手动释放缓存的方法

2023-10-31

一、Linux释放内存的相关知识介绍:

在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 和读写映射文件。否则在释放缓存的过程中,可能会丢失未保存的文件。

Linux和Windows不一样,Linux的内存机制存在buffer和cache这两个功能:

cache(缓存):是指把读取出来的数据保存在内存当中,当再次读取时,不用读取硬盘而直接从内存当中读取,加速了数据的读取过程

buffer(缓冲):是指在写入数据时,先把分散的写入操作保存到内存当中,当达到一定程度再集中写入硬盘,减少了磁盘碎片和硬盘的反复寻道,加速了数据的写入过程

这两个功能同样会占用内存空间,但是这个空间是可以随时调用的,下面我们就来说下,如何清空Linux缓冲与缓存。

buffer缓冲清空命令sync,这个命令会迅速将buffer中数据写入硬盘,然后清空buffer中数据。

需要注意的是,在生产环境中的服务器我们不要频繁的去释放内存,只在必要时候清理内存即可,更重要的是我们应该从应用程序层面去优化内存的利用和释放,经常清理内存可能只是暂时屏蔽的应用程序中的一些bug,所以更重要的是程序的调优,其他的交给操作系统来管理。

二、方法:

1、说明

切记缓存不要随意清空,清空cache命令最好在低负载时使用,不然可能会导致系统运行出问题!

Linux释放内存的命令:

释放内存的时候,首先执行命令sync将所有正在内存中的缓冲区写到磁盘中,其中包括已经修改的文件inode、已延迟的块I/O以及读写映射文件,从而确保文件系统的完整性;,

sync # sync命令可以多执行几遍;

echo 1 > /proc/sys/vm/drop_caches

drop_caches的值可以是0-3之间的数字,代表不同的含义:

0:不释放(系统默认值);默认情况下表示不释放内存,由操作系统自动管理;

1:释放页缓存;To free pagecache.

2:释放dentries和inodes;To free dentries and inodes.

3:释放所有缓存;To free pagecache, dentries and inodes.

其中cache缓存清空命令有三个:

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

echo 0 >/proc/sys/vm/drop_caches

注:在2.6.x系列的内核中可以设置为0,3系列的内核中设置为0就会报错,write error: Invalid argument。只能重启服务器恢复。

free -m #看内存是否已经释放掉了。

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

sync # sync命令可以多执行几遍;

echo 3 > /proc/sys/vm/drop_caches

2、释放缓存区内存的方法

(1)、清理pagecache(页面缓存)

sync # sync命令可以多执行几遍;

echo 1 > /proc/sys/vm/drop_caches 或者 sysctl -w vm.drop_caches=1

(2)、清理dentries(目录缓存)和inodes

sync # sync命令可以多执行几遍;

echo 2 > /proc/sys/vm/drop_caches 或者 sysctl -w vm.drop_caches=2

(3)、清理pagecache、dentries和inodes

sync # sync命令可以多执行几遍;

echo 3 > /proc/sys/vm/drop_caches 或者 sysctl -w vm.drop_caches=3

(4)、上面三种方式都是临时释放缓存的方法,要想永久释放缓存,需要在/etc/sysctl.conf文件中配置:vm.drop_caches=1/2/3,然后sysctl -p生效即可!

(5)、另外,可以使用sync命令来清理文件系统缓存,还会清理僵尸(zombie)对象和它们占用的内存

sync

三、free命令介绍

1、free命令介绍

[root@node1 ~]# free -g

total used free shared buffers cached

Mem: 15 6 8 0 0 1

-/+ buffers/cache: 5 10

Swap: 31 0 31

[root@node1 ~]#

第一行用全局角度描述系统使用的内存状况:

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加上缓存值

可用内存=free memory + buffers + cached。

空闲内存=free(6)+buffers(0)+cached(1)

已用内存=total(15)-空闲内存

第三行表示swap的使用:

used 已使用

free 未使用

Swap意思是交换分区,通常我们说的虚拟内存,是从硬盘中划分出的一个分区。当物理内存不够用的时候,内核就会释放缓存区(buffers/cache)里一些长时间不用的程序,然后将这些程序临时放到Swap中,也就是说如果物理内存和缓存区内存不够用的时候,才会用到Swap。

swap清理:

swapoff -a && swapon -a

注意:这样清理有个前提条件,空闲的内存必须比已经使用的swap空间大

2、free实际可用内存

为什么free这么小,是否关闭应用后内存没有释放?

但实际上,我们都知道这是因为Linux对内存的管理与Windows不同,free小并不是说内存不够用了,应该看的是free的第二行最后一个值:-/ buffers/cache: 3948 4031 ,这才是系统可用的内存大小。

实际项目中的经验告诉我们,如果因为是应用有像内存泄露、溢出的问题,从swap的使用情况是可以比较快速可以判断的,但free上面反而比较难查看。我觉得既然核心是可以快速清空buffer或cache,但核心并没有这样做(默认值是0),我们不应该随便去改变它。

一般情况下,应用在系统上稳定运行了,free值也会保持在一个稳定值的,虽然看上去可能比较小。当发生内存不足、应用获取不到可用内存、OOM错误等问题时,还是更应该去分析应用方面的原因,如用户量太大导致内存不足、发生应用内存溢出等情况,否则,清空buffer,强制腾出free的大小,可能只是把问题给暂时屏蔽了,所以说一般情况下Linux都不用经常手动释放内存。

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

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

随机推荐

  • saltstack匹配minion以及自定义用户组nodegroup

    转载 http blog itpub net 30129545 viewspace 1456748 前提 操作在master在进行 minion id minion的唯一标示 默认情况minion id是minion的主机名 FQDN 你可
  • 你不知道的JavaScript-------值

    目录 数组 字符串 数字 不是值的值 特殊的数字 零值 值和引用 数组 1 delete运算符可以将单元从数组中删除 但length属性不会发生变化 2 数组通过数字进行索引 但数组也是对象 所以也可以包含字符串键值和属性 不过不计算在数组
  • esp8266b站粉丝显示器

    本文教程是转载 本文教程是转载 本文教程是转载 仅仅当做笔记使用 如有侵权会立即删除 原来视频网址 https www bilibili com video av55551802 t 194 以及他的github 使用ESP 01S模块和1
  • 实现YOLOv5封装成函数以供其他程序进行调用

    import detect detect UAPI source data images 通过在YOLOv5中的detect py的代码中 对检测函数进行封装 之后其他代码通过已经封装好的函数进行调用 从而实现简单便捷的YOLOv5代码调用
  • Oracle用户权限赋予

    1 赋予用户登录权限 grant create session to 用户 只能登录 2 赋予用户2查询用户1的一张表的权限 grant select on 用户1 s user to 用户2 grant insert on 用户1 s u
  • 免费的激光雷达数据的下载方法

    转载来自于爱学习的测绘师 https mp weixin qq com s 3npA7yG0Ifep0pvHpTmD3A 学了很多激光雷达软件 看了很多教学视频 但是苦于没有数据 无从下手 我这里就介绍4个免费的激光雷达数据下载网站 涵盖机
  • 工具:“类脑式”知识管理工具Lattics试用体验

    大概是因为我在知乎的 Obsidian 话题下表现得比较活跃 意外地收到了一个官方邀请 试用 类脑式 知识管理工具Lattics 虽然我自诩为Obsidian重度用户 但并不介意保持开放心态 尝试其他工具 本文并非掐饭贴 在此仅分享一下个人
  • 通过bigMap工具获取地图上各地方的经纬度范围

    首先去官网下载bigMap工具 地址 http www bigemap com reader download 下载成功点击软件 我们会出现这个页面 然后接下来就是选择区域了 相对应上面的操作之后 我们点击箭头 把我们的这个区域下载下来 格
  • 物联网设备的标识技术:RFID与NFC究竟有什么关系?

    物联网主要由三个方面关键技术 连接 标识以及数据的操作 之前 我们已经谈了很多关于物联网中物体如何连接网络的技术 而实际上物体的标识才是物联网实现的第一步 就是我们要唯一地标识和区分每一个物体 以RFID为代表的物体标识技术曾经几乎就是物联
  • YAML 基础知识

    目录 1 基本语法 2 数据类型 3 YAML 对象 4 YAML 数组 5 YAML 复合结构 6 YAML 纯量 7 引用 1 基本语法 1 大小写敏感 2 缩进表示层级关系 3 缩进只允许空格 不能使用tab 4 缩进空格数没有要求
  • torch报错

    报错1 RuntimeError ProcessGroupNCCL is only supported with GPUs no GPUs found 1 测试GPU是否可用 import torch 测试GPU是否可用 flag torc
  • 【mcuclub】PM2.5粉尘浓度检测模块GP2Y10

    一 实物图 二 原理图 编号 名称 功能 1 L VCC LED灯正极 2 L GND LED灯负极 3 LED LED灯引脚 4 S GND 模块负极 5 OUT 模拟量输出引脚 6 VCC 模块正极 L VCC引脚接电阻是用来限流 接电
  • Docker的概述与部署

    文章目录 一 Docker概述 1 1 什么是容器 1 2 Docker是什么 1 3 Docker的设计宗旨 1 4 Docker与虚拟机的区别 1 5 Docker的特点 1 6 Docker三要素 核心概念 1 7 Docker运行过
  • print输出

    作者 小刘在C站 每天分享课堂笔记 一起努力 共赴美好人生 夕阳下 是最美的 绽放 目录 一 print输出函数 二 print函数输出 一 print输出函数 def print self args sep end n file None
  • 查看系统是否安装了ftp服务器,在openEuler系统中搭建FTP服务器:使用和配置vsftpd的方法...

    本文教您在openEuler操作系统中搭建FTP服务器 介绍使用vsftpd 安装vsftpd 管理vsftpd服务 配置vsftpd vsftpd配置文件介绍 默认配置说明 配置本地时间 配置欢迎信息 配置系统帐号登录权限 验证FTP服务
  • node.js+vue的爱心助农电商管理系统

    技术架构 nodejs vue 功能模块 登录登出模块 农产品信息是每个用户独立存在的 因此用户需要进行登录查看以及操作后台系统 应考虑到用户管理问题 暂没有开放用户注册模块 新用户注册可以联系数据库管理员进行录入 用户在此界面模块需要进行
  • 从键盘输入某班学生某门课的成绩(每班人数最多不超过40人),当输入为负值时,表示输入结束,试编程将分数按从高到低顺序进行排序输出。

    排序功能需要自定义函数实现 输入格式要求 d 输入提示信息 Input score Total students are d n Sorted scores 输出格式要求 4d 程序的运行示例如下 Input score 84 Input
  • 【Express.js】健康检查

    健康检查 许多时候 我们需要对应用进行监控 来获取他的详细状态 这节介绍几个在 express 中进行健康检查的方案 亲自手写 亲自创建一些路由 根据情况返回应用的相关信息 不过自己写比较麻烦 除非有特别的需求 一般我们就用第三方的解决方案
  • Ubuntu18.04系统备份与恢复软件推荐——Systemback

    Ubuntu18 04备份与恢复软件推荐 systemback 推荐理由 systemback简介 systemback的安装 systemback的使用 1 打开与关闭 2 系统备份 还原 参考相关 操作系统 Ubuntu18 04 5
  • Linux手动释放缓存的方法

    一 Linux释放内存的相关知识介绍 在Linux系统下 我们一般不需要去释放内存 因为系统已经将内存管理的很好 但是凡事也有例外 有的时候内存会被缓存占用掉 导致系统使用SWAP空间影响性能 例如当你在Linux下频繁存取文件后 物理内存