linux系统内存缓存严重_linux监控系统缓存 cpu利用率 剩余内存资源 - CSDN
  • linux服务器运行一段时间,free内存就快没有了,原来是Linux内核机制,不是内存泄露

    最近遇到一个疑问,不管是top,还是cat /proc/meminfo,  发现free内存基本快没了,难道我们的程序出问题了?排查半天没有事,

    后来百度到相关帖子,记录一下,这是Linux内核机制,


    Linux与Windows不同,会存在缓存内存,通常叫做Cache Memory。有些时候你会发现没有什么程序在运行,但是使用top或free命令看到可用内存会很少。
     
    什么是Cache Memory(缓存内存):
     
    当你读写文件的时候,Linux内核为了提高读写效率与速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后,Cache Memory也不会自动释放。这就会导致你在Linux系统中程序频繁读写文件后,你会发现可用物理内存会很少。
     
    其实这缓存内存(Cache Memory)在你需要使用内存的时候会自动释放,所以你不必担心没有内存可用。如果你希望手动去释放Cache Memory(缓存内存)的话也是有办法的。
     
    释放Cache Memory(缓存内存):
     
    用下面的命令可以释放Cache Memory:
     
    [rootmin@localhost~]#echo 3 > /proc/sys/vm/drop_caches
     
    Linux中如何释放cache内存
     
    因为LINUX的内核机制,一般情况下不需要特意去释放已经使用的cache。这些cache起来的内容可以增加文件以及的读写速度。
     
    先说下free命令怎么看内存
     
    [rootmin@localhost~]# free
     
    total used free shared buffers cached
     
    Mem: 515588 295452 220136 0 2060 64040
     
    -/+ buffers/cache: 229352 286236
     
    Swap: 682720 112 682608
     
    其中第一行用全局角度描述系统使用的内存状况:
     
    total——总物理内存 
     
    used——已使用内存,一般情况这个值会比较大,因为这个值包括了cache+应用程序使用的内存
     
    free——完全未被使用的内存
     
    shared——应用程序共享内存
     
    buffers——缓存,主要用于目录方面,inode值等(ls大目录可看到这个值增加)
     
    cached——缓存,用于已打开的文件
     
    注意:
     
    total=used+free
     
    used=buffers+cached (maybe add shared also)
     
    第二行描述应用程序的内存使用:
     
    前个值表示-buffers/cache——应用程序使用的内存大小,used减去缓存值
     
    后个值表示+buffers/cache——所有可供应用程序使用的内存大小,free加上缓存值
     
    注意
     
    -buffers/cache=used-buffers-cached
     
    +buffers/cache=free+buffers+cached
     
    第三行表示swap的使用: 
     
    used——已使用
     
    free——未使用
     
    cache释放:
     
    1.   To free pagecache:
     
    [rootmin@localhost~]#echo 1 > /proc/sys/vm/drop_caches
     
    2.   To free dentries and inodes:
     
    [rootmin@localhost~]#echo 2 > /proc/sys/vm/drop_caches
     
    3.   To free pagecache, dentries and inodes:
     
    [rootmin@localhost~]#echo 3 > /proc/sys/vm/drop_caches
     
    说明,释放前最好sync一下,防止丢数据

    展开全文
  • Linux服务器内存使用量超过阈值,触发报警。 问题排查 首先,通过free命令观察系统内存使用情况,显示如下: total used free shared buffers cached Mem: 24675796 24587144 88652 0 357012 

    问题描述

    Linux服务器内存使用量超过阈值,触发报警。

    问题排查

    首先,通过free命令观察系统的内存使用情况,显示如下:

    1. total       used       free     shared    buffers     cached 
    2. Mem:      24675796   24587144      88652          0     357012    1612488 
    3. -/+ buffers/cache:   22617644    2058152 
    4. Swap:      2096472     108224    1988248 

    其中,可以看出内存总量为24675796KB,已使用22617644KB,只剩余2058152KB。

    然后,接着通过top命令,shift + M按内存排序后,观察系统中使用内存最大的进程情况,发现只占用了18GB内存,其他进程均很小,可忽略。

    因此,还有将近4GB内存(22617644KB-18GB,约4GB)用到什么地方了呢?

    进一步,通过cat /proc/meminfo发现,其中有将近4GB(3688732 KB)的Slab内存:

    1. ...... 
    2. Mapped:          25212 kB 
    3. Slab:          3688732 kB 
    4. PageTables:      43524 kB 
    5. ...... 

    Slab是用于存放内核数据结构缓存,再通过slabtop命令查看这部分内存的使用情况:

    1. OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME 
    2. 13926348 13926348 100%    0.21K 773686       18   3494744K dentry_cache 
    3. 334040 262056  78%    0.09K   8351       40     33404K buffer_head 
    4. 151040 150537  99%    0.74K  30208        5    120832K ext3_inode_cache 

    发现其中大部分(大约3.5GB)都是用于了dentry_cache。

    问题解决

    1. 修改/proc/sys/vm/drop_caches,释放Slab占用的cache内存空间(参考drop_caches的官方文档):

    1. Writing to this will cause the kernel to drop clean caches, dentries and inodes from memory, causing that memory to become free. 
    2. To free pagecache: 
    3. * echo 1 > /proc/sys/vm/drop_caches 
    4. To free dentries and inodes: 
    5. * echo 2 > /proc/sys/vm/drop_caches 
    6. To free pagecache, dentries and inodes: 
    7. * echo 3 > /proc/sys/vm/drop_caches 
    8. 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. 
    9. This tunable was added in 2.6.16. 

    2. 方法1需要用户具有root权限,如果不是root,但有sudo权限,可以通过sysctl命令进行设置:

    1. $sync 
    2. $sudo sysctl -w vm.drop_caches=3 
    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中有相关的解释:

    1. 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/2008/12/03/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                   
    13926348 13926348 100%    0.21K 773686       18   3494744K dentry_cache
    334040 262056  78%    0.09K   8351       40     33404K buffer_head
    151040 150537  99%    0.74K  30208        5    120832K ext3_inode_cache

    为什么显示可回收的,但是又处于ACTIVE状态呢?求Linux内核达人看到后热心解释下:(

    会不会由于是ACTIVE状态,导致dcache没有被自动回收释放掉呢?

    让系统自动回收dcache

    上一小节,我们已经提到,服务器上大部分的slab内存是SReclaimable可回收状态的,那么,我们能不能交给操作系统让他在某个时机自动触发回收操作呢?答案是肯定的。

    查了一些关于Linux dcache的相关资料,发现操作系统会在到了内存临界阈值后,触发kswapd内核进程工作才进行释放,这个阈值的计算方法如下:

    1. 首先,grep low /proc/zoneinfo,得到如下结果:

            low      1
            low      380
            low      12067
    

    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  ######1GB
    

    4. 举个例子,当low阈值被设置为1GB的时候,当系统free的内存小于1GB时,观察到kswapd进程开始工作(进程状态从Sleeping变为Running),同时dcache开始被系统回收,直到系统free的内存介于low阈值和high阈值之间,停止回收。

    原文链接:http://www.cnblogs.com/panfeng412/p/drop-caches-under-linux-system.html

    http://www.cnblogs.com/panfeng412/p/drop-caches-under-linux-system-2.html

    展开全文
  • Linux系统内存:cached过大

    千次阅读 2018-01-15 14:53:19
    oracle和十几个tomcat在一台机器上,为了保证...free -m发现used内存为零,所有内存都变成了cached内存。cat /proc/meminfo继续检查 echo 1 > /proc/sys/vm/drop_caches 清理缓存 清理完成之后 echo 0 > /proc/

    oracle和十几个tomcat在一台机器上,为了保证oracle可用,把tomcat迁移走,但是发现oracle依旧慢,

    重启oracle无效,

    free -m发现used内存为零,所有内存都变成了cached内存。cat /proc/meminfo继续检查

    echo 1 > /proc/sys/vm/drop_caches  清理缓存

    清理完成之后  echo 0 > /proc/sys/vm/drop_caches  还原解决

    展开全文
  • 有时系统缓存cache太大,严重影响了内存使用,本文提供了如何释放缓存的方法。 查看硬盘大小及剩余空间命令 df -h . 如下图所示,当前文件系统共有130G,使用了107G,还有17G剩余。 ...

    对于使用Linux系统的初级用户,本文提供了查看Linux硬盘,内存的命令。有时系统缓存cache太大,严重影响了内存使用,本文提供了如何释放缓存的方法。

    查看硬盘大小及剩余空间命令 df -h .

    如下图所示,当前文件系统共有130G,使用了107G,还有17G剩余。

    Linux文件系统查看硬盘,内存,释放缓存命令



    查看当前文件夹大小

    首先要切换到要查看大小的文件夹下,如cd dir

    再执行命令 du -ch|grep total

    Linux文件系统查看硬盘,内存,释放缓存命令


    如上图所示,dir文件夹的大小为4.0K。

    查看内存大小及缓存多少命令:free -m

    Linux文件系统查看硬盘,内存,释放缓存命令


    如上图所示,当前系统内存3963M,约合4G。已使用1568M,还剩余2394M,缓存(cache)有390M。

    释放缓存,使用一组共三条命令:

    echo 1 > /proc/sys/vm/drop_caches

    echo 2 > /proc/sys/vm/drop_caches

    echo 3 > /proc/sys/vm/drop_caches

    Linux文件系统查看硬盘,内存,释放缓存命令


    我们再查看内存,会发现cache的变少了,但是cache不会变成0。

    Linux文件系统查看硬盘,内存,释放缓存命令


    展开全文
  • linux内核缓存

    2019-05-10 11:00:32
    Linux缓存 I/O 机制中,操作系统会将 I/O 的数据缓存在文件系统的页缓存( page cache )中,也就是说,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。...
  • linux中的页缓存和文件IO

    千次阅读 多人点赞 2018-04-29 09:46:26
    虽然仔细看过《linux内核设计与实现》,也参考了很多的博客,并且做了linux进程空间、address_space和文件的关系图(设为图1,参考博客),但是对于页缓存和文件IO之间关系的细节一直不是特别明朗。趁着元旦假期看的...
  • linux 内存性能调优

    千次阅读 2018-09-12 17:07:42
    关于linux内存系统我们至少应该了解什么?  linux 系统中内存地址分为虚拟地址和物理地址,虚拟地址必须通过mmu映射成物理地址。为了完成虚拟地址到物理地址的映射,linux内核中必须为每一个用户态进程维护一个页...
  • 根据查阅网上一些文档LINUX系统具有OOMKiller的保护机制,用于避免 Linux内存不足的时候不至于出太严重的问题,把一些无关紧要的进程杀掉,以保证系统的正常运行。   内存是通过指针寻址的,因而CPU的字长决定...
  • Linux服务器系统内存监控方法详解

    千次阅读 2013-09-30 17:31:07
    Linux服务器系统内存监控方法详解  内存Linux内核所管理的最重要的资源之一。内存管理系统是操作系统中最为重要的部分,因为系统的物理内存总是少于系统所需要的内存数量。虚拟内存就是为了克服这个矛盾而...
  • Linux里swap有两个意思: 1. 动词:交换。内存和磁盘的颠簸行为。 2. 名词:硬盘的swap分区。 没有文件背景的页面,即匿名页(anonymous page),如堆,栈,数据段等,不是以文件形式存在,因此无法和磁盘文件...
  • Linux SWAP内存交换机制基本概念

    千次阅读 2017-04-16 11:50:52
    Linux SWAP内存交换机制基本概念tags: Linux源码Linux SWAP内存交换机制基本概念 摘要 前序知识 内存交换要做什么 硬件上给予的支持 下面假定场景更好的叙述 Linux中的实现 数据什么时候跑到磁盘上面去的 什么时候换...
  • 文章目录目录内存分配算法物理内存分配内存碎片伙伴(Buddy)分配算法申请和回收反碎片机制Slab 算法slab 分配器的结构slab 高速缓存分区页框分配器非连续内存内存的分配虚拟内存的分配内核空间内存分配...
  • linux共享内存实现

    千次阅读 2019-04-19 20:57:58
    答:共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之...
  • Linux内存管理机制

    千次阅读 2017-02-16 04:08:47
    这是Linux内存管理的一个优秀特性,主要特点是,无论物理内存有多大,Linux 都将其充份利用,将一些程序调用过的硬盘数据读入内存(buffer/cache),利用内存读写的高速特性来提高Linux系统的数据访问性能。...
  • 内存管理系统是操作系统中最为重要的部分,因为系统的物理内存总是少于系统所需要的内存数量。虚拟内存就是为了克服这个矛盾而采用的策略。系统的虚拟内存通过在各个进程之间共享内存而使系统看起来有多于实际内存的...
  • Linux内存文件系统

    千次阅读 2016-04-27 13:08:18
    Linux内存文件系统:RamDisk,ramfs,tmpfs
  • 日期 内核版本 ... Linux内存管理 1 前景提要1.1 碎片化问题分页与分段页是信息的物理单位, 分页是为了实现非连续分配, 以便解决内存碎片问题, 或者说分页是由于系统管理的需要. 段是信息的逻辑单位
  • Linux 内存 占用较高问题排查

    万次阅读 2019-04-24 14:54:22
    一 查看内存情况 #按 k 查看 free #按兆M查看 free -m total:总计物理内存的大小。 used:已使用多大。 free:可用有多少。 Shared:多个进程共享的内存总额。 Buffers/cached:磁盘缓存的大小。 #所以...
  • documentlinux内存机制CPU内存虚拟内存硬盘物理内存内存和虚拟内存跟 Windows 完全不同的 Linux 内存机制Swap配置对性能的影响 linux内存机制 Linux支持虚拟内存(Virtual Mmemory),虚拟内存是指使用磁盘当作RAM的...
  • 内存管理(Linux内核源码分析)

    千次阅读 2017-07-12 10:03:52
    背景本篇博客试图通过linux内核源码分析linux内存管理机制,并且对比内核提供的几个分配内存的接口函数。然后聊下slab层的用法以及接口函数。内核分配内存与用户态分配内存内核分配内存与用户态分配内存显然是不同...
1 2 3 4 5 ... 20
收藏数 31,330
精华内容 12,532
关键字:

linux系统内存缓存严重