美文网首页web开发Linux程序员
Linux内存分析与清理

Linux内存分析与清理

作者: SnailTyan | 来源:发表于2017-03-09 17:58 被阅读908次

    文章作者:Tyan
    博客:noahsnail.com  |  CSDN  |  简书

    1. free命令

    Linux中查看内存的命令为free,命令如下:

    $ free -h
                  total        used        free      shared  buff/cache   available
    Mem:            62G        4.9G        627M        520K         57G         57G
    Swap:          4.0G        335M        3.7G
    

    每一列的解释如下:

    • total:内存总数
    • used:已经使用的内存数
    • free:空闲的内存数
    • shared:当前已经废弃不用
    • buffers Buffer:缓存内存数
    • cached Page:缓存内存数

    可以看出buff/cache占用的内存份额很大,有时候程序运行结束后,大量内存仍位于buff/cache中,有时运行程序会导致内存不足,因此需要将这部分内存释放出来。

    2. Linux中的缓存分类

    要清理Linux中的cache,首先要明白buff和cache的区别(free中的buff/cache),以及pagecache,dentries和inodes的区别。

    • buff
      作为buffer cache的内存,是块设备的读写缓冲区

    • cache
      作为page cache的内存,文件系统的cache。Buffer cache是针对磁盘块的缓存,也就是在没有文件系统的情况下,直接对磁盘进行操作的数据会缓存到buffer cache中。

    • pagecache

    页面缓存(pagecache)可以包含磁盘块的任何内存映射。这可以是缓冲I/O,内存映射文件,可执行文件的分页区域——操作系统可以从文件保存在内存中的任何内容。Page cache实际上是针对文件系统的,是文件的缓存,在文件层面上的数据会缓存到page cache。

    • dentries
      表示目录的数据结构

    • inodes
      表示文件的数据结构

    总结:cached是cpu与内存间的,buffer是内存与磁盘间的,都是为了解决速度不对等的问题。buffer是即将要被写入磁盘的,而cache是被从磁盘中读出来的。

    缓存(cached)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。

    缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。linux有一个守护进程定期清空缓冲内容(即写入磁盘),也可以通过sync命令手动清空缓冲。

    3. 清理cache

    /proc/sys/vm/drop_caches (since Linux 2.6.16)
    Writing to this file causes the kernel to drop clean caches,dentries and inodes from memory, causing that memory to become free.
    To free pagecache, use echo 1 > /proc/sys/vm/drop_caches;
    to free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;
    to free pagecache, dentries and inodes, use echo 3 > /proc/sys/vm/drop_caches.
    Because this is a non-destructive operation and dirty objects are not freeable, the user should run sync first.
    

    /proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段。也就是说可以通过修改/proc中的文件,来对当前kernel的行为做出调整。那么我们可以通过调整/proc/sys/vm/drop_caches来释放内存。/proc/sys/vm/drop_caches中的默认值为0,值为1时表示可以释放pagecache缓存,值为2时可以释放pagecache和inode缓存,值为3时可以释放pagecache, dentries和inodes缓存。当然在释放内存之前需要执行sync命令。

    sync && echo 1 > /proc/sys/vm/drop_caches
    sync && echo 2 > /proc/sys/vm/drop_caches
    sync && echo 3 > /proc/sys/vm/drop_caches
    

    参考资料

    1.http://www.linuxde.net/2011/07/402.html

    相关文章

      网友评论

        本文标题:Linux内存分析与清理

        本文链接:https://www.haomeiwen.com/subject/nzhggttx.html