当前位置: 首页 > news >正文

linux内存慢性扼杀

Linux释放内存的命令:

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

drop_caches的值可以是0-3之间的数字,代表不同的含义:
0:不释放(系统默认值)
1:释放页缓存
2:释放dentries和inodes
3:释放所有缓存
这里会经过一段时间持续慢慢恢复内存,时间一般在1到2天左右
释放完内存后改回去让系统重新自动分配内存。
echo 0 >/proc/sys/vm/drop_caches

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

如果我们需要释放所有缓存,就输入下面的命令:
echo 3 > /proc/sys/vm/drop_caches

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

[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都不用经常手动释放内存。

 
分类:  linux服务器

转载于:https://www.cnblogs.com/yecao8888/p/7890204.html

相关文章:

  • 命令行下显示mnist中图片的问题
  • webpack 图片的打包
  • git过滤提交文件
  • Unity Shader 之 渲染流水线
  • 1mysql二进制 安装
  • Docker安装和使用
  • 详解Bootstrap fileinput文件上传组件的实例
  • 【JAVA】基础知识_常见问题1
  • CAS单点登录(一):服务端搭建
  • C++ new失败的处理
  • LTE-Advanced(4G)主要技术学习:CA、CoMp、HetNet
  • core文件生成和路径设置
  • MySQL安装和简单操作
  • ubuntu中安装和卸载apache2
  • 胶囊式菜单
  • ----------
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • Laravel Mix运行时关于es2015报错解决方案
  • Laravel 实践之路: 数据库迁移与数据填充
  • leetcode讲解--894. All Possible Full Binary Trees
  • Mysql数据库的条件查询语句
  • RxJS: 简单入门
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • zookeeper系列(七)实战分布式命名服务
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 翻译--Thinking in React
  • 给第三方使用接口的 URL 签名实现
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 微服务核心架构梳理
  • Hibernate主键生成策略及选择
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • Spring Batch JSON 支持
  • 阿里云ACE认证学习知识点梳理
  • #define、const、typedef的差别
  • $.ajax中的eval及dataType
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (一)为什么要选择C++
  • (转)jQuery 基础
  • (转)程序员疫苗:代码注入
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET Core引入性能分析引导优化
  • .net 后台导出excel ,word
  • .net 简单实现MD5
  • .NET 依赖注入和配置系统
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .pyc文件是什么?
  • @Bean有哪些属性
  • @Bean注解详解
  • [ C++ ] template 模板进阶 (特化,分离编译)