1.buffer与cached
执行free命令出来的结果,包括buff和cache,实际可用的内存需要看第二行。
[root@localhost chenming]
# free -m
total used free shared buffers cached
Mem: 1006 985 20 0 53 804
-/+ buffers/cache: 127 878
Swap: 1235 3 1232
http://www.quora.com/Linux-Kernel/What-is-the-major-difference-between-the-buffer-cache-and-the-page-cache
free命令产生的buffers和cached的区别参考以下文章:
http://www.quora.com/What-is-the-difference-between-Buffers-and-Cached-columns-in-proc-meminfo-output
2.控制cache
Linux对cache的使用没有规定上限,因为,物理内存不是拿来看的,而是拿来用的。只要当需要的时候,这部分内存还可以还回去就行!
[root@localhost chenming]
#
ls /proc/sys/vm
block_dump
drop_caches
lowmem_reserve_ratio oom_kill_allocating_task
compact_memory extfrag_threshold max_map_count overcommit_memory
dirty_background_bytes
extra_free_kbytes
min_free_kbytes
overcommit_ratio
dirty_background_ratio
highmem_is_dirtyable mmap_min_addr page-cluster
dirty_bytes
hugepages_treat_as_movable nr_hugepages panic_on_oom
dirty_expire_centisecs
hugetlb_shm_group nr_overcommit_hugepages percpu_pagelist_fraction
dirty_ratio
laptop_mode nr_pdflush_threads scan_unevictable_pages
dirty_writeback_centisecs
legacy_va_layout oom_dump_tasks stat_interval
swappiness
unmap_area_factor
vdso_enabled
vfs_cache_pressure
would_have_oomed
1. dirty_expire_centisecs与dirty_writeback_centisecs
写文件时,先写入内核的cache中,后台进程pdflush或flush-n:m负责异步将写操作writeback到磁盘。这个进程每个dirty_writeback_centisecs(默认值500,即5s)厘秒唤醒然后执行一次。他会检查这些脏页面的时间是不是超时了,超时的会被写磁盘。超时时间就是dirty_expire_centisecs(默认值3000,即20s)厘秒。当然,就算一个都没超时,但脏页面很多的话,也是会写磁盘的。这个下面会讲。
2.dirty_background_bytes与dirty_background_ratio
参数意义:当脏页所占的百分比(相对于所有可用内存,即空闲内存页+可回收内存页)达到dirty_background_ratio时内核的pdflush线程开始回写脏页。增大会使用更多内存用于缓冲,可以提高系统的读写性能。当需要持续、恒定的写入场合时,应该降低该数值。
脏页所占的内存数量超过dirty_background_bytes时,内核的pdflush线程也会开始回写脏页。
注意:dirty_background_bytes参数和dirty_background_ratio参数是相对的,只能指定其中一个。当其中一个参数文件被写入时,会立即开始计算脏页限制,并且会将另一个参数的值清零。
3.dirty_bytes与dirty_ratio
如果dirty_background_bytes与dirty_background_ratio还不能有效发挥作用,导致脏页面比例持续升高,并且超过了dirty_ratio,那么那么执行write的那个用户态进程自己会block住,等待pdflush干完活再唤起。默认值40。
4.drop_caches
向/proc/sys/vm/drop_caches文件中写入数值可以使内核释放page cache,dentries和inodes缓存所占的内存。生产环境不要用。
只释放pagecache:
echo 1 > /proc/sys/vm/drop_caches
只释放dentries和inodes缓存:
echo 2 > /proc/sys/vm/drop_caches
释放pagecache、dentries和inodes缓存:
echo 3 > /proc/sys/vm/drop_caches
这个操作不是破坏性操作,脏的对象(比如脏页)不会被释放,因此要首先运行sync命令。
5.min_free_kbytes
这个参数用来指定强制Linux VM保留的内存区域的最小值,单位是kb。VM会使用这个参数的值来计算系统中每个低端内存域的watermark[WMARK_MIN]值。每个低端内存域都会根据这个参数保留一定数量的空闲内存页。
一部分少量的内存用来满足PF_MEMALLOC类型的内存分配请求。如果进程设置了PF_MEMALLOC标志,表示不能让这个进程分配内存失败,可以分配保留的内存。并不是所有进程都有的。kswapd、direct reclaim的process等在回收的时候会设置这个标志,因为回收的时候它们还要为自己分配一些内存。有了PF_MEMALLOC标志,它们就可以获得保留的低端内存。
如果设置的值小于1024KB,系统很容易崩溃,在负载较高时很容易死锁。如果设置的值太大,系统会经常OOM。
PS:自己试验过一次,内存降到这个值的2倍时就不再下降了。32位系统,1G内存,3个内存zone。
This controls the amount of memory that is kept free for use by special reserves including “atomic” allocations (those which cannot wait for reclaim). This should not normally be lowered unless the system is being very carefully tuned for memory usage (normally useful for embedded rather than server applications). If “page allocation failure” messages and stack traces are frequently seen in logs, min_free_kbytes could be increased until the errors disappear. There is no need for concern, if these messages are very infrequent. The default value depends on the amount of RAM.
6.vfs_cache_pressure
控制内核回收dentry和inode cache内存的倾向。
默认值是100,内核会根据pagecache和swapcache的回收情况,让dentry和inode cache的内存占用量保持在一个相对公平的百分比上。
减小vfs_cache_pressure会让内核更倾向于保留dentry和inode cache。当vfs_cache_pressure等于0,在内存紧张时,内核也不会回收dentry和inode cache,这容易导致OOM。如果vfs_cache_pressure的值超过100,内核会更倾向于回收dentry和inode cache。