linux shm文件加载超过,过多的内存文件/dev/shm导致死机_奉义天涯的博客-程序员秘密

技术标签: linux shm文件加载超过  

过多的内存文件/dev/shm导致死机

我们的IPS是基于Linux系统的一款设备,最近总是频繁死机,死机之后即不能从终端登陆,也不能连接屏幕查看打印信息。万般无赖之下,我只能在没有死机的情况下使用top命令,然后一直盯着终端,看看在死机之前有没有什么异常现象。通过半天的观察,我终于发现了一些异常之处,当系统变得越来越缓慢的时候,系统内存处于比较低的状态,而另一个叫cached的参数却很高,后来我了解到,cached所指的空间一般是为文件操作所分配的空间,也就是文件缓存,例如当文件打开之后,向文件中写入数据,这些数据都会先保存在内存中,直到这些数据被写入磁盘,才会释放这一部分内存空间,而cached所指的值即为这部分空间的大小,也就是说这部分空间是被占用的,不能被使用的。下图中标记了free和cached的空间大小:

0818b9ca8b590ca3270a3433284dd417.png

在网上搜了一下,发现这一部分空间也不是完全不能使用,可以通过一个方法将缓冲区中的数据写到磁盘文件中,从而释放缓冲区所占用的空间,具体介绍如下:

复制代码 代码如下:

echo 3 > /proc/sys/vm/drop_caches

说明:

1>. /proc是一个虚拟文件系统,我们可以通过对它的读写操作作为与kernel实体间进行通信的一种手段。也就是说可以通过修改/proc中的文件,来对当前kernel的行为做出调整。也就是说我们可以通过调整/proc/sys/vm/drop_caches来释放内存。

2>. 关于drop_caches的官方说明如下:

复制代码 代码如下:

Writing to this file causes the kernel to drop clean caches,dentries and inodes from memory, causing that memory to becomefree.

To free pagecache, use echo 1 > /proc/sys/vm/drop_caches;

to free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;

to free pagecache, dentries and inodes, use echo 3 >/proc/sys/vm/drop_caches.

Because this is a non-destructive operation and dirty objects are not freeable, the user should run sync first

但是我执行了sync和echo 3 >/proc/sys/vm/drop_caches 之后,cached的数值有所减少,但变化不大,因此死机的问题肯定不在这。

后来我想可能是某些进程打开的文件太多,导致这部分空间一直不能释放,于是我使用lsof命令查看了打开的文件描述符,里面确实有一些进程打开的文件特别多,多的高达好几百个。因此我猜测可能是这个原因导致内存消耗太多。因此我把那些打开太多文件的进程杀掉,这时候出现的状况是,free的值有所提高,但是cached的值变化仍然不大。因为进程被杀掉,进程所分配的内存空间被释放,所以free的值会增加,但是cached的值不变,所以占用cached的值过高并不是进程打开较多的文件导致的。

我又陷入了迷茫。。。

后来我在重启我杀掉的进程时竟然奇迹般地发现cached的值降了一半。通过查看了那个进程程序的源代码之后我终于发现,原来进程在刚启动的时候会删除/dev/shm目录下的文件,这才终于找到了问题的症结。因为/dev/shm/目录是Linux下默认的内存文件,这些文件虽然看似保存在磁盘中,其实是常驻在内存中的。使用df命令可以查看:

0818b9ca8b590ca3270a3433284dd417.png

一般大小为物理内存的一半。因此将需要频繁读写的文件放在这可以有效提升执行效率。这里面的文件在系统重启后会丢失。虽然会提升效率但是有一个弊端就是,如果文件过多的话,就会大量地占用内存,导致系统内存耗尽,当系统内存不足时内核会根据进程的运行时间,占用内存情况以及权重等信息杀掉进程,如果杀掉的进程是核心进程,就会导致死机。具体可以查看Linux的OOM机制。

了解到大致的方向后,我在/dev/shm下使用ls –lh 命令,发现文件占用的空间也就几百K,与cached值的减小量并不一致,cached减小了接近500M,但是当我用du –h命令查看后才知道原来确实是占用了500M的空间,只不过ls只显示文件的大小,而du 则显示的是磁盘使用情况,因为磁盘是按照block分配的,即使文件只占用了一个字节,占用的磁盘空间仍然是1个block的大小。因此,如果目录中有大量地小文件就会导致这种情况。

使用命令tune2fs  -l  /dev/sda3 可以查看block的大小。

至此,系统死机的问题终于找到了,就是/dev/shm/下小文件过多而没有进行及时处理。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30652395/article/details/116765124

智能推荐

成功解决The following specifications were found to be incompatible with the existing python installation_一个处女座的程序猿的博客-程序员秘密

成功解决UnsatisfiableError: The following specifications were found to be incompatible with the existing python installation in your environment:解决问题Unsatisfiable Error: The following specifications were foundto be incompatible with the existing pytho

tfidf python 中文 实例_TechOnly1988的博客-程序员秘密_python 中文tfidf

from sklearn.feature_extraction.text import TfidfTransformerfrom sklearn.feature_extraction.text import CountVectorizerif __name__ == "__main__": corpus = ["我 来到 北京 清华大学", # 第一个文本切词后的结果,词之间以空格...

neo4j 数组属性(属性值有多个)______miss的博客-程序员秘密_neo4j 数组

1、多个属性值的设置语句match (m:公司{名称:["test3","test2"]}) return m2、多个属性的查询以及merge的使用OPTIONAL MATCH (n:公司) where "test3" in n.名称 WITH nwhere n is null merge (m:公司{名称:["test3","test2"]})return m(1)判断属性是否存在:直接用 "属性值 in 节点.属性名"的形式(2)merge和where不可以同时使用,.

LaTex 加粗(加黑)的方式_weixin_30876945的博客-程序员秘密

1. 基本LaTeX技巧458:关于LaTeX数学字体加粗$\mathbf $,会变为粗体,但也导致数学字母斜体形式的丢失;使用 amsmath package 的 \boldmath 命令;\boldmath$f(x,y) = 3(x+y)y / (2xy-7)$\unboldmath使用包,使用 bm package 的 \bm 命令...

锐炬显卡可以linux吗,大势所趋!Intel锐炬显卡让你抛弃独显_weixin_39913105的博客-程序员秘密

显卡领域最受关注的战争始终来自于独显与集显之间,而曾经性能羸弱的集成显卡,则在很长一段时间里并未被人们所重视。“独显”这个概念,也自然而然的在很多朋友心中形成了“电脑不可或缺的配置”这样一种认知。其实从以往的集显与独显性能来看,独显在很多时候确实显得不可或缺,但是随着集成显卡性能的不断增强,用户对于高、中、低端显卡的辨识度越来越明确,如今的用户在独显选择上,也呈现出了更加理性的状态,以往以“独...

随便推点

在Blender中使用代码控制人物模型的头部姿态 - 环境搭建_TheOldManAndTheSea的博客-程序员秘密

在Blender下使用Anaconda的Python环境flyfish前言:Anaconda下的Python环境可以使用PyTorch等深度学习框架,让Blender也能用深度学习框架。期望在Blender启动的时候加载的是Anaconda下的Python环境1. 查看自己Blender中Python的版本这里以Blender2.82举例可以在Editor Type->Python Conimposole查看或者shift+F4PYTHON INTERACTIVE CONSOLE 3.7

为什么说h5非常适合(促进)移动端的开发?_yingzizizizizizzz的博客-程序员秘密

转自这里:http://zhan.renren.com/wxcjyy?gid=3602888498062188491&checked=trueH5应用适合移动开发的几大特性  1.离线缓存为HTML5开发移动应用提供了基础   HTML5 Web Storage API可以看做是加强版的cookie,不受数据大小限制,有更好的弹性以及架构,可以将数据写入到本

oracle12兼容ojdbc6,oracle ojdbc6 使用 报错_盐选健康必修课的博客-程序员秘密

java -Djava.ext.dirs=./lib -classpath classes test.Test使用java.sql.SQLException: ORA-01005: null password given; logon deniedat oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:7...

利用 Create React Native App 快速创建 React Native 应用_xiangzhihong8的博客-程序员秘密

React Native App简介打开React Native官方文档你会发现,在Getting Started章节下新添加一个Quick Start Tab页。Quick Start是在v0.4.5版本添加的一种快速创建React Native App的方案,旨在为React Native开发者提供一种快捷的,无需配置任何工具,同时也无需安装XCode与AndroidStudio就可以开发...

bpmn2 vue 设计器_在vue中使用bpmn-js(一)_诺曼叔叔的博客-程序员秘密

由于之前的公司的项目中的工作流管理要用到流程图,而bpmn-js官方的文档是全英的而且使用的js框架是jQuery,可能是比较新的技术,官方也还在不断的更新,相关的文档或者资料很少很难找,只好自己不断爬坑填坑了。什么是bpmn-js?1.先从简单开始,能获取服务器上的流程图并显示出来:安装相关的依赖都是必须的,可以在官方文档上查看,在这里就不详细讲了。html: (界面很简单,这些都是必需的。)j...

pythonqueue函数_Python 源码分析:queue 队列模块 !_weixin_39550940的博客-程序员秘密

起步queue 模块提供适用于多线程编程的先进先出(FIFO)数据结构。因为它是线程安全的,所以多个线程很轻松地使用同一个实例。源码分析先从初始化的函数来看:class Queue:def __init__(self, maxsize=0):# 设置队列的最大容量self.maxsize = maxsizeself._init(maxsize)# 线程锁,互斥变量self.mutex = thre...

推荐文章

热门文章

相关标签