zoukankan      html  css  js  c++  java
  • Linux服务器Cache占用过多内存导致系统内存不足问题的排查解决

    作者: 大圆那些事 | 文章可以转载,请以超链接形式标明文章原始出处和作者信息

    网址: http://www.cnblogs.com/panfeng412/archive/2013/12/10/drop-caches-under-linux-system.html

    问题描述

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

    问题排查

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

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

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

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

    因此,还有将近4GB内存(22617644KB-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                   
    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

    发现其中大部分(大约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/2008/12/03/reducing-inode-and-dentry-caches-to-keep-oom-killer-at-bay/

    http://linux-mm.org/Drop_Caches

  • 相关阅读:
    Linux--shell的awk--10
    Spring Boot 整合 tk.mybatis
    pring Boot 整合 Druid
    Thymeleaf 模板布局
    Thymeleaf 内置对象
    Thymeleaf 表达式语法
    Thymeleaf 参考手册
    Thymeleaf常用语法
    Thymeleaf简介及第一个thymeleaf模板
    Docker 安装nginx
  • 原文地址:https://www.cnblogs.com/panfeng412/p/drop-caches-under-linux-system.html
Copyright © 2011-2022 走看看