内存使用太多,程序出错有什么su内存不足的解决办法法吗

中国领先的IT技术网站
51CTO旗下网站
Cache占用过多内存导致Linux系统内存不足问题排查
Linux服务器内存使用量超过阈值,触发报警。经排查发现,是由于Cache占用过多内存导致Linux系统内存不足。本文将这个问题排查的方法分享给各位,希望对您有所帮助。
作者:大圆那些事来源:博客园| 13:30
Linux服务器内存使用量超过阈值,触发报警。
首先,通过free命令观察系统的内存使用情况,显示如下:
total&&&&&&&used&&&&&&&free&&&&&shared&&&&buffers&&&&&cached&Mem:&&&&&&&&&&&&&&&88652&&&&&&&&&&0&&&&&357012&&&&1612488&-/+&buffers/cache:&&&&&&&2058152&Swap:&&&&&&2096472&&&&&108224&&&&1988248&
其中,可以看出内存总量为KB,已使用KB,只剩余2058152KB。
然后,接着通过top命令,shift + M按内存排序后,观察系统中使用内存最大的进程情况,发现只占用了18GB内存,其他进程均很小,可忽略。
因此,还有将近4GB内存(KB-18GB,约4GB)用到什么地方了呢?
进一步,通过cat /proc/meminfo发现,其中有将近4GB(3688732 KB)的Slab内存:
......&Mapped:&&&&&&&&&&25212&kB&Slab:&&&&&&&&&&3688732&kB&PageTables:&&&&&&43524&kB&......&
Slab是用于存放内核数据结构缓存,再通过slabtop命令查看这部分内存的使用情况:
OBJS&ACTIVE&&USE&OBJ&SIZE&&SLABS&OBJ/SLAB&CACHE&SIZE&NAME&%&&&&0.21K&773686&&&&&&&18&&&3494744K&dentry_cache&056&&78%&&&&0.09K&&&8351&&&&&&&40&&&&&33404K&buffer_head&537&&99%&&&&0.74K&&30208&&&&&&&&5&&&&120832K&ext3_inode_cache&
发现其中大部分(大约3.5GB)都是用于了dentry_cache。
1. 修改/proc/sys/vm/drop_caches,释放Slab占用的cache内存空间(参考drop_caches的官方文档):
Writing&to&this&will&cause&the&kernel&to&drop&clean&caches,&dentries&and&inodes&from&memory,&causing&that&memory&to&become&free.&To&free&pagecache:&*&echo&1&&/proc/sys/vm/drop_caches&To&free&dentries&and&inodes:&*&echo&2&&/proc/sys/vm/drop_caches&To&free&pagecache,&dentries&and&inodes:&*&echo&3&&/proc/sys/vm/drop_caches&As&this&is&a&non-destructive&operation,&and&dirty&objects&are&notfreeable,&the&user&should&run&&sync&&first&in&order&to&make&sure&allcached&objects&are&freed.&This&tunable&was&added&in&2.6.16.&
2. 方法1需要用户具有root权限,如果不是root,但有sudo权限,可以通过sysctl命令进行设置:
$sync&$sudo&sysctl&-w&vm.drop_caches=3&$sudo&sysctl&-w&vm.drop_caches=0&#recovery&drop_caches&
操作后可以通过sudo sysctl -a | grep drop_caches查看是否生效。
3. 修改/proc/sys/vm/vfs_cache_pressure,调整清理inode/dentry caches的优先级(默认为100),LinuxInsight中有相关的解释:
At&the&default&value&of&vfs_cache_pressure&=&100&the&kernel&will&attempt&to&reclaim&dentries&and&inodes&at&a&&fair&&rate&with&respect&to&pagecache&and&swapcache&reclaim.&Decreasing&vfs_cache_pressure&causes&the&kernel&to&prefer&to&retain&dentry&and&inode&caches.&Increasing&vfs_cache_pressure&beyond&100&causes&the&kernel&to&prefer&to&reclaim&dentries&and&inodes.&&
具体的设置方法,可以参考方法1或者方法2均可。
https://www.kernel.org/doc/Documentation/sysctl/vm.txt
http://major.io//reducing-inode-and-dentry-caches-to-keep-oom-killer-at-bay/
http://linux-mm.org/Drop_Caches
以下记录的是进一步排查的进展情况。
更深层次的原因
上文排查到Linux系统中有大量的dentry_cache占用内存,为什么会有如此多的dentry_cache呢?
1. 首先,弄清楚dentry_cache的概念及作用:目录项高速缓存,是Linux为了提高目录项对象的处理效率而设计的;它记录了目录项到inode的映射关系。因此,当应用程序发起stat系统调用时,就会创建对应的dentry_cache项(更进一步,如果每次stat的文件都是不存在的文件,那么总是会有大量新的dentry_cache项被创建)。
2. 当前服务器是storm集群的节点,首先想到了storm相关的工作进程,strace一下storm的worker进程发现其中有非常频繁的stat系统调用发生,而且stat的文件总是新的文件名:
sudo strace -fp &pid& -e trace=stat
3. 进一步观察到storm的worker进程会在本地目录下频繁的创建、打开、关闭、删除心跳文件,每秒钟一个新的文件名:
sudo strace -fp &pid& -e trace=open,stat,close,unlink
以上就是系统中为何有如此多的dentry_cache的原因所在。
一个奇怪的现象
通过观察/proc/meminfo发现,slab内存分为两部分:
SReclaimable // 可回收的slab
SUnreclaim // 不可回收的slab
当时服务器的现状是:slab部分占用的内存,大部分显示的都是SReclaimable,也就是说可以被回收的。
但是通过slabtop观察到slab内存中最主要的部分(dentry_cache)的OBJS几乎都是ACTIVE的,显示100%处于被使用状态。
OBJS ACTIVE
USE OBJ SIZE
SLABS OBJ/SLAB CACHE SIZE NAME
0.21K 773686
3494744K dentry_cache
33404K buffer_head
120832K ext3_inode_cache
为什么显示可回收的,但是又处于ACTIVE状态呢?求Linux内核达人看到后热心解释下:(
会不会由于是ACTIVE状态,导致dcache没有被自动回收释放掉呢?
让系统自动回收dcache
上一小节,我们已经提到,服务器上大部分的slab内存是SReclaimable可回收状态的,那么,我们能不能交给操作系统让他在某个时机自动触发回收操作呢?答案是肯定的。
查了一些关于Linux dcache的相关资料,发现操作系统会在到了内存临界阈值后,触发kswapd内核进程工作才进行释放,这个阈值的计算方法如下:
1. 首先,grep low /proc/zoneinfo,得到如下结果:
2. 将以上3列加起来,乘以4KB,就是这个阈值,通过这个方法计算后发现当前服务器的回收阈值只有48MB,因此很难看到这一现象,实际中可能等不到回收,操作系统就会hang住没响应了。
3. 可以通过以下方法调大这个阈值:将vm.extra_free_kbytes设置为vm.min_free_kbytes和一样大,则/proc/zoneinfo中对应的low阈值就会增大一倍,同时high阈值也会随之增长,以此类推。
$ sudo sysctl -a | grep free_kbytes
vm.min_free_kbytes = 39847
vm.extra_free_kbytes = 0$ sudo sysctl -w vm.extra_free_kbytes=836787
4. 举个例子,当low阈值被设置为1GB的时候,当系统free的内存小于1GB时,观察到kswapd进程开始工作(进程状态从Sleeping变为Running),同时dcache开始被系统回收,直到系统free的内存介于low阈值和high阈值之间,停止回收。
原文链接:
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
头条头条外电头条外电
24H热文一周话题本月最赞
讲师:0人学习过
讲师:0人学习过
讲师:5人学习过
精选博文论坛热帖下载排行
本书是一本以示例形式直接面向应用的网络管理图书。书中以大量示例和大量实用网络管理与故障排除经验介绍了当前网络管理工作的各主要方面。...
订阅51CTO邮刊内存异常故障有哪些 怎么解决_内存故障
内存异常故障有哪些 怎么解决
学习啦【内存故障】 编辑:若木
  当启动电脑、运行操纵系统或应用软件的时候、经常会由于内存出现异常而导致操纵失败。在这里总结了一些内存出现异常的原因,并给出以下几种处理方法,希望可以给大家一些帮助。
  故障一:内存条与主板插槽接触不良、内存控制器出现故障表现为:打开主机电源后屏幕显示&Error :Unable to ControlA20 Line &出错信息后死机。
  解决方法:仔细检查内存条是否与插槽保持良好接触或更换内存条。
  故障二:自检通过。在DOS 状态下运行应用程序因占用的内存地址冲突,而导致内存分配错误,屏幕出现&Memory A11ocationError&的提示。
  解决方法:因 Confis.sys文件中没有用Himem.sys 、Emm386.exe等内存治理文件设置Xms.ems 内存或者设置不当,使得系统仅能使用640KB 基本内存,运行的程序稍大便出现&Out of Memory &(内存不足)的提示,无法操纵。这些现象均属软故障,编写好系统配置文件Config.sys后重新启动系统即可。
  故障三:Windows 系统中运行的应用程序非法访问内存、内存中驻留了太多应用程序、活动窗口打开太多、应用程序相关配置文件不公道等原因均能导致屏幕出现很多有关内存出错的信息。
  解决方法:此类故障必须采用清除内存驻留程序、减少活动窗口、调整配置文件(INI ),重装系统和应用程序等办法来处理。
  故障四:Windows 系统中运行DOS 状态下的应用软件(如DOS 下运行的游戏软件等)时,因软件之间分配、占用内存冲突出现黑屏、花屏、死机现象。
  解决办法:退出Windows 系统,进进DOS 状态,再运行应用程序。
  故障五:程序有病毒,病毒程序驻留内存、CMOS参数中内存值的大小被病毒修改,将导致内存值与内存条实际内存大小不符、内存工作异常等现象。
  解决办法:采用杀毒软件消除病毒;CMOS中参数被病毒修改,先将CMOS短接放电,重新启动机器,进进CMOS后仔细检查各项硬件参数,正确设置有关内存的参数值。
  故障六:电脑升级进行内存扩充,选择了与主板不兼容的内存条。
  解决方法:首先升级主板的BIOS,看看是否能解决题目,假如仍无济于事,就只好更换内存条了。
本文已影响 人
[内存异常故障有哪些 怎么解决]相关的文章
看过本文的人还看了
【内存故障】图文推荐
Copyright & 2006 -
All Rights Reserved
学习啦 版权所有您的位置: >
教你解决WIN7内存占用高的问题 图文教程
很多小伙伴说WIN7系统卡,其实是因为WIN7系统占用内存比较多。Win7系统在正常使用的时候会占用很多资源,比如网络诊断,缓存还有其他各种平时大部分时候我们都用不上的资源,如果我们电脑本身内存比较小只有2G内存或者以下,打开程序稍微多加个就会造成Win7内存占用高,整个系统运行缓慢,这是我们可以尝试将一些我们明确知道的不会使用的系统服务关系以释放被系统占用的内存。电脑内存不足怎么办 win7内存不足怎么办,下面给大家说几个方法。大家去试试看,对你的电脑有多大的提升。Win7内存占用高解决方法一1:单击 按钮,在搜索框输入“服务”,然后在“程序”列表中选择“服务”选项。2:打开服务窗口后,双击要停用的服务。3:打开“属性”对话框后,在“常规”选项卡中的“描述”区域查看该服务的作用,然后打开“依存关系”选项卡,查看该服务与其他服务的依存关系,如图所示:4在确定该服务不需使用而且停用后不会影响系统正常运行的情况下,在“常规”选项卡下禁用该服务。如图所示:这里附上几个常用的Win7系统服务的中文含义,关于其他的你可以百度下,一般都有答案。Print Spooler:这项服务主要为打印功能提供支持,如果电脑没有安装打印机并且不需要使用虚拟打印功能,可关闭该服务Bluetooth Support Service:蓝牙功能支持,如果电脑不连接蓝牙设备,可以停用该服务。Certificate Propagation:智能卡证书支持,对于未配置智能卡的电脑而言,该服务没有任何作用。Adaptive brightness:监视氛围光传感器,以检测氛围光的变化并调节显示器的亮度。停止或禁用此服务后,显示器亮度将不根据照明条件进行调节。Win7内存占用高解决方法二1.启动&windows任务管理器&,快捷键&alt+ctrl+delete&点击&性能&选项卡,查看系统内存和物理内存的使用情况.2.点击&开始&菜单(快捷键是Win键+R),然后再输入msconfig命令3.会弹出&系统配置&的对话框,然后选择&服务&这个选项卡.你可以看到很多运行的服务.将前面的复选框的勾选上.然后点击&全部禁用&按钮.确定即可.(禁止服务时候.先确定 不是系统必须的服务(即禁用也不会影响系统的运行).以上就是小编整理的关于电脑内存占用高的解决办法,我们主要是通过释放一些Win7系统保持运行的而我们日常使用时不会用上的系统服务。注意,一定要确认这些系统服务不是关键性系统服务,否则会导致操作系统不能正常运行。

我要回帖

更多关于 内存溢出解决办法 的文章

 

随机推荐