# Linux内存管理与分配

Linux内存管理与分配

20191106 Chenxin

1.buffer/cache区别

1.1解释一
Cache
Cache从内存读取数据(从磁盘读取),这个数据的内存空间在Linux系统里一般被称为缓存区(cache),从内存cache读取缓存区,读缓存.缓存(cache)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘.其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除.
Buffer
Buffer将数据写入内存(写入磁盘),这个数据的内存空间在Linux系统里一般被称为缓冲区(buffer),写入到内存buffer缓冲区,写缓冲.
缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。linux有一个守护进程定期清空缓冲内容(即写入磁盘),也可以通过sync命令手动清空缓冲。

1.2解释二
buffer:作为buffer cache的内存,是块设备的读写缓冲区.
cache:作为page cache的内存, 文件系统的cache.
如果 cache 的值很大,说明cache住的文件数很多.如果频繁访问到的文件都能被cache住,那么磁盘的读IO会非常小.

1.3示例
用一个ext2的U盘,往里面cp一个3M的文件,但U盘的灯没有跳动,过了一会儿(或者手动输入sync)U盘的灯就跳动起来了。卸载设备时会清空缓冲,所以有些时候卸载一个设备时要等几秒钟.

1.4Free指令结果对比
内核版本 4.19.48-14.al7.x86_64

[root@~]# free -m; cat /proc/meminfo |grep -E "Buffer|Cache|Swap|Mem"
              total        used        free      shared  buff/cache   available
Mem:            441          47          17           0         376         381
Swap:             0           0           0
MemTotal:         452420 kB->441.8M
MemFree:           18192 kB->17.7M
MemAvailable:     391032 kB->381M
Buffers:           63244 kB->61.7M #相加并不等于376,为什么呢?
Cached:           287116 kB->280M

[root@~]# free -m; cat /proc/meminfo |grep -E "Buffer|Cache|Swap|Mem"
              total        used        free      shared  buff/cache   available
Mem:            441          56           8           0         376         373
Swap:             0           0           0
MemTotal:         452420 kB
MemFree:            8972 kB
MemAvailable:     381876 kB
Buffers:           63296 kB
Cached:           287156 kB

较早前内核版本

[admin@ip-10-0-1-23 ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:          1995       1902         92          0          6         62
-/+ buffers/cache:     1833(已用)       161(实际可用)

total 内存总数
used 已经使用的内存
free 空闲的内存
shared 多个进程共享的内存总额
-buffers/cache 的内存数:used - buffers - cached
+buffers/cache 的内存数:free + buffers + cached ,也是可用的memory=free + buffers + cached

1.5手动清理

#!/bin/bash
#By Chenxin 20120717

if [ -f /etc/init.d/functions ];then
. /etc/init.d/functions;
fi

PATH=$PATH:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

sync
sync
echo 1 > /proc/sys/vm/drop_caches 
sleep 2;
sync
sleep 2;
echo 2 > /proc/sys/vm/drop_caches  
sleep 2;
sync
sleep 2;
echo 3 > /proc/sys/vm/drop_caches  
sleep 2;
sync
sleep 2;
sync
posted @ 2020-04-21 09:50  ChanixChen  阅读(310)  评论(0)    收藏  举报