Linux中的内存知识梳理以及buffer/cache是否需要清理?

Linux中的内存知识梳理以及buffer/cache是否需要清理?

前言

服务器跑了很久,有时候用free  -m显示free内存很小而buffer/cache很大,很多人就觉得需要清理释放缓存,让free的值增大才可以舒心。其实这么做意义不大,我们一起来学习下。

查看内存状态

free 默认是以kb为单位显示

free -m 以M为单位显示

free -g 以G为单位显示。

buffer和cache区别及用途

  • buffer(缓冲区)

核心作用就是用来缓冲,是为了提高内存和硬盘(或其他I/0设备)之间的数据交换的速度而设计的,比如每秒写100次硬盘,对系统冲击很大,浪费了大量的时间在处理写和结束写。引用Buffer后,可以暂存起来变成每10s写一次硬盘,对系统冲击很小,保护了硬盘,一般也可理解为数据从高速设备(内存)到低速设备(硬盘)的一个缓冲区。

  • cache(缓存)

核心作用是加快取用速度,比如已经做了一个复杂的计算,下次还要用结果,cache就可以把计算的结果进行缓存,等下一次系统调用时,直接调用缓存,加速了数据取用的速度。

注意:不要误解,Buffer就是用来写的, cache就是用来读的。读也可以用buffer。

如何回收buffer/cache(所谓的清理内存)

  • 回收的两种模式

1.自动回收:Linux内核会在内存将要耗尽的时候,触发内存回收工作,以便释放内存给急需的内存进程使用。

2.手动回收:主动给内核发送数字信号,根据不同信号的意义,触发相应的回收策略

echo 1 > /proc/sys/vm/drop_caches

表示清除pagecache。

echo 2 > /proc/sys/vm/drop_caches

表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。

echo 3 > /proc/sys/vm/drop_caches (清理范围最大的一种方式)表示清除page cache和slab分配器中的缓存对像

  • 清理内存操作

1. sync  先执行sync命令,用于将所有未写的缓冲区写入同步到磁盘中

2. echo 3 > /proc/sys/vm/drop_caches    不同数字有着不同的清理范围,3的范围最大,清理最多

说明:/proc 是系统的虚拟文件系统,可以通过修改proc目录下的数值对系统内核进行调整。

  • 回收是有代价的

清理缓存的操作不是没有成本的,cache是缓存,清理缓存尽可能要保证cache中的缓存数据和对应文件中的数据一致,才能对cache释放。因为伴随着cache清除的行为,内核要对比cache中的数据对应硬盘文件上的数据是否一致,如果不一致需要写回,之后才能回收。这样的话系统IO会变的很高。

  • cache都能被回收么
  1. tmpfs中存储的文件会占用cache空间,除非文件删除否则这个cache不会被自动释放。
  2. 使用shmget方式申请的共享内存会占用cache空间,除非共享内存被ipcrm或者使用shmctl去IPC_RMID,否则相关的cache空间都不会被自动释放。
  3. 使用mmap方法申请的MAP_SHARED标志的内存会占用cache空间,除非进程将这段内存munmap,否则相关的cache空间都不会被自动释放。
  4. 实际上shmget、mmap的共享内存,在内核层都是通过tmpfs实现的,tmpfs实现的存储用的都是cache。

总结

Linux服务器为了提高效率,会提前申请内存,即使这些内存没有被具体应用使用,Linux也会提前申请这些内存,然后利用这些内存做缓存用,即将刚打开的文件系统存入cache中,这样对应的服务器free值会越来越少,buffers和cached会越来越大,因此给大家表象就是内存越来越少了,大家就紧张了;其实,大家完全不用紧张,Linux服务器在发现内存不足时,会自动清理cached区域,释放内存,然后继续增大cache,free继续减少

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Loading...