linux的page cache策略

    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
      以上,实际可用的内存是878M。由于执行过大的cp,cache居然达到了804M。那么什么是cached?什么是buffers?简言之,cached缓存了对文件的读写,buffers缓存了inode,dentry等文件系统metadata。显然,metadata大小远远小于文件内存,所以buffers一般也远小于cached。cached的部分叫page cache,buffers的部分叫buffer cache。page cache与buffer cache的区别可参考以下文章:

    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
    以上红色的参数均可影响cache。一个个解释。

    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。


你可能感兴趣的:(linux的page cache策略)