linux内存总结

来源:互联网 发布:淘宝好还是自建商城好 编辑:程序博客网 时间:2024/06/05 18:59

重庆oracle服务器局方部署了一个内存监控脚本:

mt=`grep 'MemTotal:'/proc/meminfo |awk '{print $2}'`;ma=`grep 'Active:' /proc/meminfo|awk '{print$2}'`;mf=`expr $mt - $ma`;echo 'Memory:' `expr $mt / 1024`'M' all `expr $mf /1024`'M' avail

         该脚本检索/proc/meminfo文件的active值占总的物理内存的比例情况来判断服务器内存是否忙。

1、linux内存概述

         linux的内存管理机制与windows的有所不同,   linux的内存管理机制的思想包括(不敢说就是)内存利用率最大化。内核会把剩余的内存申请为cached,而cached不属于free范畴。当系统运行时间较久,会发现cached很大,对于有频繁文件读写操作的系统,这种现象会更加明显。

    由于Linux缓存机制的设计,系统对缓存的使用是非常狠的,所以经常会看到某些环境内存只剩几十兆了,而应用只用了不到一半。所以在计算可用内存的时候,一定要算上缓存的部分。

通常方法,就是通过free命令首行free+cached+buffers计算,或者直接使用第二行的free字段。但这个方法有时仍然会造成比较大的误差,导致性能监控等方面的问题。

比如系统中使用了大量的共享内存会造成多计算可用内存;再比如对大量的文件做了查询(find / ?!!!),会导致少计算可用内存。

1、可用内存定义

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

2、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

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

4、ipcs获取共享内存占用物理内存大小

#ipcs -m -u

------Shared Memory Status --------

segmentsallocated 4

pagesallocated 786433

pages resident 2 #使用这个字段,单位是页,X86下一个页是4kB

pagesswapped 0

Swapperformance: 0 attempts 0 successes

 

5、df获取tmpfs占用物理内存大小

#df

Filesystem1K-blocks Used Available Use% Mounted on

/dev/sda220972152 4427900 16544252 22% /

devtmpfs 24711780 160 24711620 1% /dev #Used字段表示实际占用物理内存

tmpfs 24711780 0 24711780 0% /dev/shm #Used字段表示实际占用物理内存

/dev/sda51052184 59188 992996 6% /boot

 

 

2、free

free是个常用命令,几乎每个接触、使用linux的用户都会用到它。但往往对它的统计输出会有一些困惑,这一方面和Linux内存管理机制有关,另一方面Linux在内存统计上也确实有些不足和问题。

关键在于两个字段,buffers和cached。

你经常会发现Linux系统用了一段时间后,内存所剩无几,free命令,一看,内存全跑到 buffers和cached里面了;这个现象是正常的。访问过的磁盘文件的元数据及内容,内核都会缓存起来。这些缓存就是磁盘缓存。

Linux磁盘缓存设计特点(设计理念):

除了系统运行必须的一小部分保留外,只要有剩余内存,只要需要,就会用给磁盘缓存。(没有一个参数可以让你限定缓存的上限。2.6内核之前有一个限定参数,后来给取消了)

所以会经常看到内存所剩无几的现象,这是缓存机制导致的,对应用是透明,在有内存需要时,这些内存会释放。这个过程对应用是透明的,应用可以认为系统的可用内存包括buffers和cached。

这种设计,在大多数服务器应用场景下都有比较好的性能表现。可以说是比较可取的。

设计本身没有问题,但free命令显示的buffers和cached并不能和磁盘缓存完全对应,这是实现细节上的不足和问题。

1. buffers和cached包含了不属于磁盘缓存的内容。

由于buffers和cached实际上就是内核为所有文件映射分配的物理页的总和(page cache)。

但内核中的“文件概念”是广泛的,不仅包含了真正位于磁盘上的文件,还包含了为特殊需要创建的虚拟文件,比如:

进程间的共享内存(通过shmget API创建的内存),内核建立一个虚拟的文件和共享内存关联起来。(通过pmap命令你可以看到进程拥有的共享内存地址空间的映射字段是/SYSVXXXX字样,不是匿名的)。

非常的不幸,这些虚拟文件映射关联的page,也被算入了free命令显示的cached字段。但这部分内存没有缓存属性,在内存不足时不能按缓存的方式来回收。(使用echo 3 >/proc/sys/vm/drop_caches,无法释放掉这部分内存)

这个问题,会带来一些麻烦。比如,按照常规理解,某产品设计内存占用过高告警的条件是,空闲内存+buffers+cached小于内存总和的20% 。一般情况下没有问题,但如果产品使用了大量的共享内存,告警将失去作用。

2. buffers和cached遗漏了部分属于磁盘缓存的内容。

还是由于buffers和cached只是内核为所有文件映射分配的物理页的总和。在文件系统方面,还有一部分缓存是不和文件映射相关联的,比如内核分配的 inode对象,在文件关闭时,并不会立即释放,具备缓存的属性。这部分不在基于文件映射的页面里,而是通过slab(内核内存池)分配的。

3、/proc/meminfo

         当一个进程请求map一定数量的内存pages时,如果没有足够的空余pages,Linux内核就会release pages (那种使用过的,但是不会再用到的,且状态仍然是active的内存)。 这个过程叫做页回收 (page reclaiming) 。 内核线程 kswapd和内核函数 try_to_free_page() 来负责页回收。

         kswapd经常处于taskinterruptible 状态的睡眠中,当空余pages小于一个阀值(threshold)的时候,buddy system就会调用kswapd。kswapd使用LRU算法从active pages里面选择需要回收的pages,active list和inactive list被用来维护这些pages。kswapd扫描部分active list,选择一些pages放到inactive list中。  vmstat -a 命令或者 /proc/meminfo可以显示active和inactive的memory。

# cat/proc/meminfo

MemTotal:       24585508 kB  --所有可用RAM大小

MemFree:         1069728 kB  --LowFreeHighFree的总和,被系统留着未使用的内存

Buffers:          106188 kB    --用来给文件做缓冲大小

Cached:           580084 kB   --被高速缓冲存储器(cache memory)用的内存的大小(等于 diskcache minus SwapCache

SwapCached:       123640 kB   --被高速缓冲存储器(cache memory)用的交换空间的大小已经被交换出来的内存,但仍然被存放在swapfile中。用来在需要的时候很快的被替换而不需要再次打开I/O端口

Active:           305324 kB    --在活跃使用中的缓冲或高速缓冲存储器页面文件的大小,除非非常必要否则不会被移作他用

Inactive:         687208 kB     --在不经常使用中的缓冲或高速缓冲存储器页面文件的大小,可能被用于其他途径

Active(anon):      62064 kB     --

Inactive(anon):   274944 kB

Active(file):     243260 kB

Inactive(file):   412264 kB

Unevictable:      183180 kB

Mlocked:          183180 kB

SwapTotal:       4192956 kB

SwapFree:        3695968 kB

Dirty:              1968 kB

Writeback:             0 kB

AnonPages:        388276 kB

Mapped:            77020 kB   --设备和文件等映射的大小

Shmem:              1036 kB

Slab:             510104 kB    --内核数据结构缓存的大小,可以减少申请和释放内存带来的消耗。

SReclaimable:      37996 kB    --可收回Slab的大小

SUnreclaim:       472108 kB  --不可收回Slab的大小(SUnreclaim+SReclaimableSlab

KernelStack:        8528 kB

PageTables:        27216 kB   --管理内存分页页面的索引表的大小。

NFS_Unstable:          0 kB  --不稳定页表的大小

Bounce:                0 kB

WritebackTmp:          0 kB

CommitLimit:     5652812 kB

Committed_AS:    2436088 kB

VmallocTotal:   34359738367 kB

VmallocUsed:      343076 kB

VmallocChunk:   34340674592 kB

HardwareCorrupted:     0 kB

HugePages_Total:   10579

HugePages_Free:     9923

HugePages_Rsvd:      176

HugePages_Surp:        0

Hugepagesize:       2048 kB

DirectMap4k:        8192 kB

DirectMap2M:     2080768 kB

DirectMap1G:    23068672 kB

 

原创粉丝点击