最近,有个同事问我,怎么准确地描述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而获取的内存量。

/dev/shm 引起的内存统计问题的更多相关文章

  1. linux下修改/dev/shm tmpfs文件系统大小

    默认系统就会加载/dev/shm ,它就是所谓的tmpfs,有人说跟ramdisk(虚拟磁盘),但不一样.象虚拟磁盘一样,tmpfs 可以使用您的 RAM,但它也可以使用您的交换分区来存储.而且传统的 ...

  2. 直播流怎么存储在Ceph对象存储上? Linux内存文件系统tmpfs(/dev/shm) 的应用

    一./dev/shm理论 默认的Linux发行版中的内核配置都会开启tmpfs,映射到了/dev/下的shm目录.可以通过df 命令查看结果./dev/shm/是linux下一个非常有用的目录,因为这 ...

  3. 记一次共享内存/dev/shm 小于memory_target 引发的客户DB 宕机问题

    1> 记一次共享内存/dev/shm 小于memory_target 引发的客户DB 宕机问题(处理心得)

  4. dev/shm time in linux

    统计文件夹大小: du -hx --max=1 : du -sk :du -hsc 重新组织行分隔符进行显示: echo "abc,dd,bach,dong,jing,shang,china ...

  5. oracle对/dev/shm的使用

    查看共享内存打开的文件数 [root@db2 ~]# lsof -n | grep /dev/shm | wc -l 34693 共享内存中总共文件数 [root@db2 ~]# ls -l /dev ...

  6. 浅析/dev/shm

    一,/dev/shm 概念 /dev/shm 是一个tmpfs文件系统,临时文件系统,是基于内存的文件系统,也就是说/dev/shm中的文件是直接写入内存的,而不占用硬盘空间. 在Centos和Red ...

  7. Linux下的tmpfs文件系统(/dev/shm)

    转自:http://www.2cto.com/os/201411/354888.html 介绍 /dev/shm/是一个使用就是tmpfs文件系统的设备,其实就是一个特殊的文件系统.redhat中默认 ...

  8. linux下的/dev/shm目录

    linux下的/dev/shm目录 linux中/dev目录下一般都是一些设备文件,例如磁盘.内存.摄像头等. /dev/shm这个目录是linux下一个利用内存虚拟出来的一个目录,这个目录中的文件都 ...

  9. 巧用linux服务器的/dev/shm/,如果合理使用,可以避开磁盘IO不给力,提高网站访问速度。

    巧用linux服务器的/dev/shm/ 巧用linux服务器的/dev/shm/,如果合理使用,可以避开磁盘IO不给力,提高网站访问速度. 首先让我们认识一下,什么是tmpfs和/dev/shm/? ...

随机推荐

  1. [Java] 在 jar 文件中读取 resources 目录下的文件

    注意两点: 1. 将资源目录添加到 build path,确保该目录下的文件被拷贝到 jar 文件中. 2. jar 内部的东西,可以当作 stream 来读取,但不应该当作 file 来读取. 例子 ...

  2. File API文件操作之FileReader二

    上一篇说了FileAPI中FileReader的readAsText,这里继续上文,说说另外一个API readAsDataURL. 这个接口是将File或者Blob读成base64格式的字符串,然后 ...

  3. 使用Q进行同步的Promises操作

    如何通过使用Q来并发执行多个promises呢? Q(Q(1), Q(2), Q(3)) .then(function (one, two, three) { console.log(one); co ...

  4. 浅谈JavaScript的面向对象程序设计(四)

    本文继续讲解JavaScript的面向对象程序设计.继承是面向对象语言中的一个基本概念,面向对象语言支持两种继承实现方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.但是在 ...

  5. replace into 浅析之一

    一 介绍  在笔者支持业务过程中,经常遇到开发咨询replace into 的使用场景以及注意事项,这里做个总结.从功能原理,性能和注意事项上做个说明.二 原理2.1 当表中存在主键但是不存在唯一建的 ...

  6. MySQL innodb_flush_method

    innodb_flush_method这个参数控制着innodb数据文件及redo log的打开.刷写模式,对于这个参数,文档上是这样描述的: 有三个值:fdatasync(默认),O_DSYNC,O ...

  7. 使用Linq确定序列是否包含任何元素

    假设我们有一个集合,想要判断这个集合中是否包含任何元素可以使用Linq中的Any() List<string> list = new List<string> { " ...

  8. Vue2.0 相对于Vue1.0的变化:生命周期

    1.生命周期 根据提供的生命周期钩子说明Vue.js实例各个阶段的情况,Vue.js 2.0对不少钩子进行了修改,以下说明:(灰色字体代表是 2.0已经废弃或者被更名的钩子,黑色字体代表1.0 和2. ...

  9. 开源API测试工具 Hitchhiker v0.8 - 自动化测试结果统计

    Hitchhiker 是一款开源的支持多人协作的 Restful Api 测试工具,支持自动化测试, 数据对比,压力测试,支持脚本定制请求,可以轻松部署到本地,和你的team成员一起协作测试Api. ...

  10. 共60课:Python基础教程

    简介: 你会看到一堆下载链接.我们就选"Python 2.7.5 Windows Installer",如果是64位系统的同学选下面那个"Python 2.7.5 Win ...