1 内存信息查看
proc文件系统中涉及内存使用情况的文件主要有:
/proc/meminfo表征了系统内存使用概要信息:
[root@localhost ~]# cat /proc/meminfo
MemTotal: 505964 kB //系统可用物理内存总量
MemFree: 16060 kB //系统空闲内物理内存总量= HighFree+ LowFree
Buffers: 41132 kB //系统分配但未被使用的buffer数量(注1)
Cached: 359268 kB //系统分配但未被使用的cache数量(注1)
SwapCached: 0 kB //指交换出去的内存,再次交换回来,但在swap文件中仍存在,主要为了节约这块内存再次交换出去的IO操作
Active: 137156 kB //最近使用的内存,除非必要,一般不会立即回收
Inactive: 282600 kB //最近未使用的内存,回收时优先回收
HighTotal: 0 kB //高端内存总量(High Zone),860M以上的物理内存
HighFree: 0 kB //高端内存空闲总量
LowTotal: 505964 kB //常规内存总量(Normal Zone),可被kernel和应用任意使用
LowFree: 16060 kB //常规内存空闲总量
SwapTotal: 1269124 kB //总的交换内存大小
SwapFree: 1268948 kB //空闲的交换内存大小
Dirty: 76 kB //需要写回磁盘的数据大小
Writeback: 0 kB //正在写回磁盘的数据大小
Mapped: 33808 kB //mmap使用的内存大小
Slab: 63204 kB //slab pool大小
CommitLimit: 1522104 kB //系统实际可分配内存总量(注2)
Committed_AS: 98172 kB //系统当前已分配的内存总量,包括unused(注2)
PageTables: 1660 kB //管理内存页表所使用的内存
VmallocTotal: 507896 kB //vmalloc可使用的总内存大小
VmallocUsed: 3676 kB // vmalloc已用的总内存大小
VmallocChunk: 503960 kB //vmalloc可分配的最大的逻辑连续的内存大小
....
(1)、cache与buffer的区别
Cache和buffer都是系统做为缓冲的内存,cache指的是page cache,表示文件系统的cache;而buffer指的是buffer cache,用来为块设备的做读写缓冲,与具体的块设备关联,跟踪块的变化。Linux系统之所以使用cache和buffer,主要是为了提高文件读写访问的性能。
简单来说,buffers是用来存储,目录里面有什么内容,权限等等。而cached直接用来记忆我们打开的文件。如果 cache 的值很大,说明cache住的文件数很多。
Cache和buffer的内存对kernel来说是已经被使用的,free的内存是指不需要任何处理即可分配的内存。对应用程序而言,当free内存不足时,可以从buffer和cache中回收内存再次分配。所以对kernel而言,可用内存即为free,对应用程序,可用内存为free+cache+buffer。
(2)、CommitLimit和Committed_AS
CommitLimit:基于过量分配比率(vm.overcommit_ratio),系统可分配的内存总量大小。这个值只有当采用严格过量内存管理(vm.overcommit_memory=2)时才有效。其总大小的计划公式如下:
CommitLimit = (vm.overcommit_ratio * Physical RAM) + Swap
Committed_AS:系统当前已分配的内存总量,包括已分配但尚未使用的内存大小。如,一个进程分配了1G的内存,有300M在使用,但对VM已分配了1G,而且这1G在任何时候都可以被使用。当(vm.overcommit_memory=2)时,Committed_AS不能大于CommitLimit。
/proc//status表征了进程状态信息:
[zhangyan@localhost opt]$ cat /proc/28151/status
Name: memtest
State: R (running)
SleepAVG: 0%
......
Groups: 500
VmSize: 7528 kB //该进程使用虚拟内存大小,是VmLib, VmExe, VmData和VmStk的总和
VmLck: 0 kB //进程当前使用的并且加锁的虚拟内存总数
VmRSS: 5400 kB //占用的在物理内存大小,它没有交换到硬盘,包括代码,数据和栈
VmData: 5136 kB //堆使用的虚拟内存
VmStk: 1104 kB //栈使用的虚拟内存
VmExe: 1 kB //可执行的和静态链接库所使用的虚拟内存
VmLib: 1259 kB //动态链接库所使用的虚拟内存
......
/proc/slabinfo主要表征了slab pool内数据的信息:
[root@localhost ~]# cat /proc/slabinfo
slabinfo - version: 2.0
# name : tunables : slabdata
nfs_direct_cache 0 0 68 58 1 : tunables 120 60 8 : slabdata 0 0 0
......
主要关注 三个项,一种类型的数据所占内存的大小为:active_objs* objsize,该类内存池中空闲内存数:(num_objs- active_objs)* objsize。但并不是所有的空闲的内存单元是可回收的,这与创建时该类型内存池时的属性相关。
2 内存管理策略
与内存相关的配置都在/proc/sys/vm目录下:
/proc/sys/vm/dirty_ratio
文件系统写缓冲区的大小,单位是百分比,表示系统内存的百分比,表示当写缓冲使用到系统内存多少的时候,开始向磁盘写出数据。增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能。但是,当需要持续、恒定的写入时,应该降低其数值。
/proc/sys/vm/dirty_background_ratio
控制pdflush进程在何时刷新磁盘。单位是百分比,表示系统内存的百分比,意思是当写缓冲使用到系统内存多少的时候,pdflush开始向磁盘写出数据。增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能。但是,当需要持续、恒定的写入场合时,应该降低其数值。
/proc/sys/vm/dirty_writeback_centisecs
控制pdflush的运行间隔。单位是 1/100 秒。缺省数值是500,也就是 5 秒。如果你的系统是持续地写入动作,那么实际上还是降低这个数值比较好,这样可以把尖峰的写操作削平成多次写操作。
/proc/sys/vm/dirty_expire_centisecs
表示如果脏数据在内存中驻留时间超过该值,pdflush进程在下一次将把这些数据写回磁盘。单位是 1/100秒。缺省是30000,也就是 30秒的数据就算旧了,将会刷新磁盘。
/proc/sys/vm/overcommit_memory
指定内核针对内存分配的策略,其值可以是0、1、2。
0: 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1: 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2: 表示内核允许分配所有的物理内存的一定百分比与交换空间总和之内的内存(参见overcommit_ratio)。
/proc/sys/vm/overcommit_ratio
如果overcommit_memory=2,可以过载内存的百分比。系统可分配内存=交换空间+物理内存*overcommit_ratio/100。
You can change the behaviour of the Linux Kernel in regardings to its Overcommit Behaviour for memory. You can change the behaviour at /etc/sysctl.conf/ or /etc/sysctl.d/myconfig.conf
You will write something like
vm.overcommit_memory = (a integer from 0 to 2)
where
0 - means that the kernel will use predefined heuristics when deciding whether to allow such an overcommit. This is the default.
1 -always overcommits (Very dangerous)
2 - Prevents overcommits from exceeding a certain value. Within this mode, the total commit can not exceed the swap space(s) size + overcommit_ratio percent * RAM size. By default, the overcommit ratio is 50.
My assumption is that you have 10GB of swap and 20GB of memory and you wish the kernel to stop handling processes at 18GB RAM, then the calculation should be (swap size + 0.4 * RAM size).
So at /etc/sysctlf.conf, the configuration will be
vm.overcommit_memory = 2
vm.overcommit_ratio = 40
Note: The ratio is (40/100).
Once the memory hits 18GB, the so-called OOM killer of the Linux kernel will kick in.
Another calculation example is that your RAM size and SWAP size are the same and you wish exactly the physical memory to be used only. then
vm.overcommit_memory = 2
vm.overcommit_ratio = 0
For more information, do read
-
When Linux runs out of memory
-
vm.overcommit_memory = 2, vm.overcommit_ratio = 0
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26477398/viewspace-2127192/
,如需转载,请注明出处,否则将追究法律责任。