zoukankan      html  css  js  c++  java
  • /dev/shm 引起的内存统计问题

    最近,有个同事问我,怎么准确地描述linux系统到底还有多少内存可供我使用。这里不扯内存碎片问题,就说剩余总量。

    如下:

    cat /proc/meminfo
    MemTotal: 263796812 kB
    MemFree: 195262832 kB
    Buffers: 151084 kB
    Cached: 11514484 kB

    一般常见的回答,可以认为使用的内存是,free +buff +cache

    那好,做如下的动作:

    dd if=/dev/zero of=/dev/shm/caq.txt bs=1024k count=3072

    然后再查看内存打印:

    MemTotal: 263796812 kB
    MemFree: 192100716 kB
    Buffers: 151108 kB
    Cached: 14660744 kB

    可以看到,free减少了3G,cache增加了3G,buff几乎不变,那么三者相加,就没变化,难道说系统的可用内存没有变化么?

    按照可分配的内存余量,应该减去这3G,那么这3G什么时候该减,什么时候不该减呢?

    因为这段内存在inative的匿名页中增长了,所以有人说那就直接减去inactive的匿名页呗。

    但事实上,inactive和active,是从时间维度统计lru中的inactive列表和active列表中的内存,也就是和统计free之类的不在一个维度,这个是时间维度。

    比如在/dev/shm中放一个文件,里面是可执行代码,那么当他执行的时候,inactive就该增长,active下降,但是该代码确算在cache里面的。

    如果在/dev/shm中放一个文件,里面是业务数据,当你不停使用这些业务数据的时候,它就在active中,不用的时候,又会算在inactive中。

    针对我们的应用,我们/dev/shm里面引用的都是数据文件,且这些文件是当做不可替换的缓存来使用的,那么,真正可用的内存,就应该减去这部分。

    # du -sh /dev/shm
    3.1G /dev/shm

    在低版本的内核中,如上的算法是没有问题的,当然在实际应用过程中,内存文件系统不光光放在路径是/dev/shm,这个跟挂载相关,但是减去内存文件系统占用的空间的思路,

    是没有问题的,比如ramfs和tmpfs所占用的内存。

    经同事文洋提醒,在高版本的内核中,我的是在3.10中,看到有一个新增的MemAvailable的,这个可以比较准备地确定系统可用的内存。

    # cat /proc/meminfo
    MemTotal: 263211692 kB
    MemFree: 166037452 kB
    MemAvailable: 182662748 kB   ---------------------有一个新增的量
    Buffers: 281376 kB
    Cached: 27166980 kB

    查看了一下MemAvailable的意义,在proc.txt中:

    MemAvailable: An estimate of how much memory is available for starting new applications, without swapping. Calculated from MemFree,
    SReclaimable, the size of the file LRU lists, and the low watermarks in each zone.
    The estimate takes into account that the system needs some page cache to function well, and that not all reclaimable
    slab will be reclaimable, due to items being in use. The impact of those factors will vary from system to system.

    也就是这个是不算swap,可以直接提供的内存量,到底怎么计算的呢?

    看了网上一些人的资料,看到一个例子是MemAvailable 小于free,这个我觉得比较奇怪,对照一下代码看下MemAvailable 是怎么计算的:

    在函数 si_mem_available 中找到如下实现:

    /*
    * Estimate the amount of memory available for userspace allocations,
    * without causing swapping.
    */
    available = global_page_state(NR_FREE_PAGES) - totalreserve_pages;----------这个导致了有可能available 小于free,如果lru基本为空的话

    /*
    * Not all the page cache can be freed, otherwise the system will
    * start swapping. Assume at least half of the page cache, or the
    * low watermark worth of cache, needs to stay.
    */
    pagecache = pages[LRU_ACTIVE_FILE] + pages[LRU_INACTIVE_FILE];
    pagecache -= min(pagecache / 2, wmark_low);
    available += pagecache;

    /*
    * Part of the reclaimable slab consists of items that are in use,
    * and cannot be freed. Cap this estimate at the low watermark.
    */
    available += global_page_state(NR_SLAB_RECLAIMABLE) -
    min(global_page_state(NR_SLAB_RECLAIMABLE) / 2, wmark_low);--------------这里加上可以回收的slab,再减去可回收slab的一半与low水线的一半。

    从算法实现可以看出,available 也是一个近似值,经验算法,能大体评估不经过swap而获取的内存量。

    水平有限,如果有错误,请帮忙提醒我。如果您觉得本文对您有帮助,可以点击下面的 推荐 支持一下我。版权所有,需要转发请带上本文源地址,博客一直在更新,欢迎 关注 。
  • 相关阅读:
    看板娘相关源码介绍
    Spring框架实体bean转json返回前端报错:Null key for a Map not allowed in JSON (use a converting NullKeySerializer?)
    Spring Data JPA介绍以及dao层(持久层)标准接口或自定义方法规则
    BeanNotOfRequiredTypeException:Bean named 'XXXX' is expected to be of type 'XXX' but was actually of type 'com.sun.proxy.$Proxy211'
    RedisDesktopManager的编译
    Spring-Boot中@Scheduled注解不生效
    @Async 注解不生效
    使用MongoTemplate,启动时候报错:org.springframework.beans.factory.BeanCreationException
    【个人经验之谈】计算机相关的就业、培训等问题解疑答惑
    简单java mail demo收发邮件例子,各种邮件类型
  • 原文地址:https://www.cnblogs.com/10087622blog/p/7544258.html
Copyright © 2011-2022 走看看