作用
强制将内存中的文件缓冲写入磁盘,更新块信息。
# 三无命令: 无参、无返回、无版本
$ sync
场景
在 linux/unix 系统中,在文件或数据处理过程中一般先放到内存缓冲区中,等到适当的时候再写入磁盘,以提高系统的运行效率。
sync 命令则可用来强制将内存缓冲区中的数据立即写入磁盘。用户通常无需执行 sync 命令,系统会自动执行 update 或 bdflush 操作,将缓冲区的数据写入磁盘。
那么什么是缓冲(buffer)、缓存(cache),二者又有什么关系及区别呢?
缓冲 && 缓存
- | - | - |
---|---|---|
buffer | 缓冲 | 解决写磁盘的效率 |
cache | 缓存 | 解决读磁盘的效率 |
- buffer(缓冲)是为提高内存和硬盘(或其他I/O设备)之间的数据交换速度而设计。
- cache(缓存)是为提高cpu和内存之间的数据交换速度而设计。
简单的理解为: buffer 是即将要被写入磁盘的,而 cache 是被从磁盘中读出来的。
缓冲
缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。linux 有一个守护进程定期清空缓冲内容(即写入磁盘),也可以通过 sync 命令手动清空缓冲。
没有找到具体的命令查看有那些文件处于缓冲状态,也就无法看到运行 sync 命令后的效果。网上甚至看到为保险起起见执行 2 次还是 4 次 sync 命令的讨论。
缓存
缓存(cache)其实全称叫高速缓存,是位于 CPU 与主内存间的一种容量较小但速度很高的存储器。
由于 CPU 的速度远高于主内存,CPU 直接从内存中存取数据要等待一定时间周期,cache 中保存着 CPU 刚用过或循环使用的数据,当 CPU 再次使用该部分数据时可从 cache 中直接调用,这样就减少了 CPU 的等待时间,提高了系统的效率。
cache 经常被用在磁盘的 I/O 请求上,如果有多个进程都要访问某个文件,于是该文件便被写入 cache 以方便下次被访问,以此提高系统性能。
内存与缓存都是宝贵且配置有限的,如何根据需要来手工清除释放缓存呢?
缓存清理
有三种选项清除缓存而无需中断任何进程或服务:
-
仅清除页面缓存(page cache)
# 较为安全 $ echo 1 > /proc/sys/vm/drop_caches
-
仅清除目录项和 inode
$ echo 2 > /proc/sys/vm/drop_caches
-
大清理: 清除页面缓存、目录项和inode
# 如果你明确知道自己在做什么,可执行该命令 # 整理本篇笔记的最大收获,所幸项目服务未受到影响 $ echo 3 > /proc/sys/vm/drop_caches
可以配合 free 命令查看清理缓存的效果,相当的立竿见影。
# 阿里云测试环境 2G 内存
$ free -m
total used free shared buffers cached
Mem: 1875 1660 215 0 201 492
$ echo 1 > /proc/sys/vm/drop_caches
$ free -m
total used free shared buffers cached
Mem: 1875 966 908 0 1 19
$ echo 3 > /proc/sys/vm/drop_caches
$ free -m
total used free shared buffers cached
Mem: 1875 827 1048 0 3 19
总结
sync 命令虽然重要,但针对缓冲的作用以及具体操作都比较单一,倒被缓存这个概念喧宾夺主了,这篇笔记显然有些跑题。