`

Linux可用内存统计方法

 
阅读更多

背景
由于Linux缓存机制的设计,系统对缓存的使用是非常狠的,所以经常会看到某些环境内存只剩几十兆了,而应用只用了不到一半。所以在计算可用内存的时候,一定要算上缓存的部分。
通常方法,就是通过free命令首行free+cached+buffers计算,或者直接使用第二行的free字段。但这个方法有时仍然会造成比较大的误差,导致性能监控等方面的问题。
比如系统中使用了大量的共享内存会造成多计算可用内存;再比如对大量的文件做了查询(find / ?!!!
),会导致少计算可用内存。对于这点我在《说说free命令》中有详细的说明。这里就不再赘述了。

SUSE11 SP1基于2.6.32内核,内核暴露了更多的统计接口给用户空间,把slab分为可回收和不可回收两类指标来统计。free命令也对应做了修改。解决了free命令少计算可用内存的问题。但多计算的问题还是存在。
因此,在这里对统计可用内存的方法做了个总结。供需要的同学参考。(后面有空可能会开发一个统计工具)
其中SUSE10由于内核版本过低(2.6.16)暴露信息不足,下面的方法仍然不能很精确,但相比通过free命令简单统计而言,一般不会造成比较大的误差。

可用内存定义
包括未被使用的空闲内存,以及已经被使用但用作缓存可以自动回收的部分。

SUSE 10可用内存统计方法
总内存:free命令首行total字段。
空闲内存:free命令首行free字段。
缓存:free命令首行buffers字段+cached字段。
修正值1:cached字段包含了共享内存和tmpfs内存文件系统占用的内存。需要减去这两部分。这两部分内存可通过ipcs -m -u和df命令获取。
修正值2:cached字段漏掉了内核slab中可以自动回收的内存,比如xxx_inode_cache和dentry_cache。这两部分的内存的计算方法是解析/proc/slabinfo。
最终的可用内存计算方法:
空闲内存+缓存-修正值1+修正值2

SUSE 11
可用内存统计方法
总内存:free命令首行total字段。
空闲内存:free命令首行free字段。
缓存:free命令首行buffers字段+cached字段。
修正值1:cached字段包含了共享内存和tmpfs内存文件系统占用的内存。需要减去这两部分。这两部分内存之和可通过/proc/meminfo的Shmem字段直接获取。
最终的可用内存计算方法:
空闲内存+缓存-修正值1

附1:ipcs获取共享内存占用物理内存大小
# ipcs -m -u
------ Shared Memory Status --------
segments allocated 4
pages allocated 786433
pages resident 2#使用这个字段,单位是页,X86下一个页是4kB
pages swapped 0
Swap performance: 0 attempts 0 successes

附2:df获取tmpfs占用物理内存大小
# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 20972152 4427900 16544252 22% /
devtmpfs 2471178016024711620 1% /dev#Used字段表示实际占用物理内存
tmpfs 24711780024711780 0% /dev/shm#Used字段表示实际占用物理内存
/dev/sda5 1052184 59188 992996 6% /boot
/dev/sda9 83888824 16852500 67036324 21% /iso
/dev/sda7 10490040 1142876 9347164 11% /opt
/dev/sda10 83888824 9421200 74467624 12% /src
/dev/sda8 20972152 3475104 17497048 17% /usr
/dev/sda6 5245016 328392 4916624 7% /var


///////////////////增加统计工具////////2011.6.29///////////////////////////////////////////////////
统计工具(在SUSE10、SUSE11验证通过)
1.修正可用内存多计算的情况(SUSE10 SUSE11)
如下环境,在进行了大量共享内存创建使用后,free命令统计可用内存,出现了很大的误差。
#echo 3 >/proc/sys/vm/drop_caches #清理可回收的内存
# free
total usedfreeshared buffers cached
Mem: 49423560 13609680 35813880 0 26764
11686608 #仍有11G不可以回收,因为是共享内存,不具备回收属性。
-/+ buffers/cache: 1896308
47527252 # free计算可用内存,算入了共享内存,得到47G
Swap: 2104472 0 2104472
# ipcs -m -u
------ Shared Memory Status --------
segments allocated 20
pages allocated 4980737
pages resident 2883591 #共享内存有2883591 * 4 = 11534364 kB ~= 11G
pages swapped 0
Swap performance: 0 attempts 0 successes
# afree
Total: 49423560 kB #
物理内存总计
Free: 35816908 kB #未被使用的内存
Reclaimable: 179348 kB #被使用了但是可以自动回收的内存
Available: 35996256 kB #afree统计出来的可用内存去除了11G的共享内存。

2.
修正可用内存少计算的情况(SUSE10)
如下环境,在进行了大量文件访问操作后,系统中缓存了大概600M的inode和dentry。
# free
total usedfree shared buffers cached
Mem: 3987316 1080908 2906408 0 163056 163848
-/+ buffers/cache: 754004
3233312 #没有统计slab中的可以回收的inode和dentry。
Swap: 2104472 0 2104472
# afree
Total: 3987316 kB
Free: 2906384 kB
Reclaimable:958888 kB
Available:
3865272 kB #afree统计了slab中的可以回收的inode和dentry。
# echo 3 >/proc/sys/vm/drop_caches #释放600M的inode和dentry缓存。
# free
total used free shared buffers cached
Mem: 3987316 93628 3893688 0 17780 8948
-/+ buffers/cache: 66900
3920416 #执行drop_caches后,增加了600M,说明cached少统计了可回收的slab缓存。这600M即使不执行drop_caches也都是可用的,系统在需要的时候会自动回收。

注:afree通过解析slabinfo文件统计可回收的slab,其实suse10的内核有一个全局变量slab_reclaim_pages维护了准确的可回收数量,但没有暴露给给用户空间,因此更准确的方法其实就是写一个模块,把这个变量导出到来。

afree代码如下:

#!/bin/sh
#
#Get accurate available memory.
#

functionget_meminfo()
{
grep -w$1/proc/meminfo|awk -F'''{print $2}'
}
functionshow_meminfo()
{
printf"%s\t%10d kB\n""$1""$2"
}

PAGE_SIZE=4#kB, for x86
functionget_shmem_from_ipcs()
{
local_shm=0
_shm=$(ipcs -m -u|grep'pages resident'|awk -F'''{print $3}')
echo$((_shm * PAGE_SIZE))
}
functionget_tmpfs_from_df()
{
local_size=""
_size=$(df -k|awk -F'''BEGIN{total=0} {if ($1 == "tmpfs" || $1 == "devtmpfs" || $1 == "shm")total+=$3}END{print total}')
echo$_size
}

#inode, dentry and buffer_head is reclaimable
functionget_slab_reclaimable_from_slabinfo()
{
local_size=""
_size=$(awk -F'''BEGIN{total=0} {if ($1~/inode/ || $1~"dentry" || $1 == "buffer_head")total+=($3 * $4)}END{printf "%d\n", total / 1024}'/proc/slabinfo)
[-z"$_size"]&&_size=0
echo$_size
}

free=$(get_meminfo MemFree)
total=$(get_meminfo MemTotal)
cached=$(get_meminfo Cached)
buffer=$(get_meminfo Buffers)
swapcached=$(get_meminfo SwapCached)
shmem=$(get_meminfo Shmem)
slab_reclaimable=$(get_meminfo SReclaimable)
nfs_unstable=$(get_meminfo NFS_Unstable)

#the kernel does not support, no 'Shmem' field in /proc/meminfo, we use ipc and df.
if[-z"$shmem"];then
shmem=$(($(get_shmem_from_ipcs)+$(get_tmpfs_from_df)))
fi

#the kernel does not support, no 'SReclaimable' field in /proc/meminfo, we use /proc/slabinfo.
if[-z"$slab_reclaimable"];then
slab_reclaimable=$(get_slab_reclaimable_from_slabinfo)
fi

#the kernel does not support, no 'NFS_Unstable' field in /proc/meminfo, we use null. :)
if[-z"$nfs_unstable"];then
nfs_unstable=0
fi


reclaimable=$((cached + buffer + slab_reclaimable + swapcached + nfs_unstable - shmem))
available=$((free + reclaimable))
show_meminfo"Total:""$total"
show_meminfo"Free:""$free"
show_meminfo"Reclaimable:""$reclaimable"
show_meminfo"Available:""$available"
分享到:
评论

相关推荐

    linux c程序获取cpu使用率及内存使用情况

    linux c程序获取cpu使用率及内存使用情况

    C/C++实现linux和Windows查看系统、进程、服务的内存和CPU使用

    C/C++实现linux和Windows查看系统、进程、服务的内存和CPU使用情况的源代码,生成的是静态链接库,Windows和Linux下经测试都可用,查看系统、指定名称的服务、指定名称的进程占用CPU和内存,查看方式不是通过程序中...

    linux 共享内存浅析

    要使用共享内存,应该有如下步骤: 1.开辟一块共享内存 shmget() 2.允许本进程使用共某块共享内存 shmat() 3.写入/读出 4.禁止本进程使用这块共享内存 shmdt() 5.删除这块共享内存 shmctl()或者命令行下ipcrm ftok...

    Linux下内存统计和内存泄露类问题的定位方法

     Linux在内存使用上的原则是:如果内存充足,不用白不用,尽量使用内存来缓存一些文件,从而加快进程的运行速度,而当内存不足时,会通过相应的内存回收策略收回cache内存,供进程使用。  一、系统总内存的分析...

    memoryLinux():Linux 的简要内存统计信息-matlab开发

    显示 Linux 上的内存统计信息。 显示 MATLAB 使用的 SYSTEM 内存统计信息和内存。

    Linux 下内存映射与分块读取速度测试程序

    使用每行的字符个数统计和 MD5 两个算法比较内存映射和分块直接读取文件的速度。

    cpu_usage.rar_Linux共享内存

    cpu使用情况统计工具,使用共享内存方式。

    cpuinfo_内存占有率计算_linuxcpu占用率统计_

    3、取两个时间点,这两个时间点的进程耗时差,除以系统耗时差,得到的就是该进程的CPU占用率/*************************************************************************************************/// 内存占用率...

    使用内存文件系统后系统内存统计方法

     在Linux系统中,内存可以分出一部分空间作为磁盘来使用,称为Ramdisk。这部分内存空间具有高速读写特性,可以存储那些对磁盘IO要求较高的数据,显著的提升系统的服务性能。  Ramdisk分为两种,一种是固定空间...

    Linux监控系统Linux-dash.zip

    Linux-dash 的界面提供了一个详细的概述您的服务器的所有重要方面,包括内存和磁盘使用情况,网络,安装软件,用户,运行的流程。所有信息被组织成widget 部件,你可以跳转到一个特定的部分使用的主要工具栏中的按钮。...

    Linux系统下利用C程序输出某进程的内存占用信息

    主要给大家介绍了关于在Linux系统下利用C程序输出某进程的内存占用信息的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友下面来一起看看吧。

    亲测可用基于Linux消息队列的简易聊天室(C语言).zip

    亲测可用的基于Linux消息队列的简易聊天室(C语言)(附源代码)采用客户-服务器结构,其中服务器实现各个用户的登录并存储相关信息,客户端通过服务器端获取当前登录用户信息,然后各客户进程通过消息队列实现双向通信...

    nmon工具使用说明-linux系统资源监控

    nmon工具是一个收集AIX或Linux主机的性能数据并分析的免费工具,使用简单易用。主要监控CPU 使用率、内存使用情况、 内核统计信息和运行队列信息、磁盘 I/O 速度、传输和读/写比率等

    CPU-MEM-monitor:一个简单的脚本,用于记录一段时间内Linux CPU和内存使用情况(使用top或pidstat命令),并输出Excel或OpenOfficeCalc友好的报告

    CPU-MEM-monitor:一个简单的脚本,用于记录一段时间内Linux CPU和内存使用情况(使用top或pidstat命令),并输出Excel或OpenOfficeCalc友好的报告

    Linux黑客命令行.docx

    cat /proc/meminfo 校验内存使用 cat /proc/swaps 显示哪些swap被使用 cat /proc/version 显示内核的版本 cat /proc/net/dev 显示网络适配器及统计 cat /proc/mounts 显示已加载的文件系统 lspci -tv...

    Linux DeviceDrivers 3rd Edition

    scull的内存使用 64 read和write 67 试试新设备 74 快速参考 74 第四章 调试技术 76 内核中的调试支持 76 通过打印调试 78 通过查询调试 85 通过监视调试 94 调试系统故障 96 调试器和相关工具 102 第五...

    linux虚拟主机管理wdcp v1.1 build 20110423

    apache支持独立用户运行,目录访问限制,完美解决利用脚本跨站访问的问题,提高安全性.2 在线查看系统资源,运行时间,系统负载,内存使用率,top信息3 在线连接数管理,连接数统计,单IP连接数,连接状态统计,web连接数,...

    《精通Linux 设备驱动程序开发》.(Sreekrishnan).pdf

    14.4 块驱动程序数据结构和方法296 14.5 设备实例:简单存储控制器298 14.5.1 初始化299 14.5.2 块设备操作301 14.5.3 磁盘访问302 14.6 高级主题304 14.7 调试306 14.8 查看源代码306 第15章 网络...

    linux_inspection_v2.32

    适用于CentOS与RedHat,自动计算内存占用率、CPU占用率、磁盘使用率,并将cpu和内存使用率输出成csv文件,方便后期统计分析。新版本在CSV文件中增加日期与时间。 使用方法:在linux下chmod 777 付权后使用./执行即可...

    LINUX 24学时教程

    本书详细讲解了用Linux的图形配置工具配置Caldera OpenLinux,通过一个ppp与网络连接、使用K桌面环境、用StarOffice提高在家办公的效率、网络浏览、发传真、接收email及使用GIMP等图形工具。 24学时每次1小时的课程...

Global site tag (gtag.js) - Google Analytics