Linux 清除 cache 的命令
Linux
中的 cache
是指页面缓存,它用于加速对非易失性存储设备上文件的访问。当 Linux
首次从硬盘等数据媒体读取或写入数据时,它会将数据存储在未使用的内存区域中,这充当了一个缓存。如果以后再次读取这些数据,它可以从内存中的缓存快速读取。页面缓存通常不会被计算为“已使用”内存,因为当应用程序需要内存时,它会被释放。因此,如果大量内存被页面缓存使用,你无需担心。
可以使用以下命令来清除 Linux
缓存,需要注意的是,执行这些命令需要 root
权限才能运行。建议在清除缓存之前,先确认清除缓存不会影响系统运行。手动释放缓存操作(定时任务),可以通过设置 /proc/sys/vm/drop_caches
来释放内存。
释放 cache
前先使用 sync
命令做同步,将所有未写的系统缓冲区写到磁盘中,以确保文件系统的完整性,否则在释放缓存的过程中,可能会丢失未保存的文件。 在生产环境中不建议频繁使用此命令,因为它可能会导致缓存的物理数据丢失和 CPU
资源浪费的情况发生。只有在特定应用程序出现问题(如 OOM
)或对缓存未知状态进行调试时,才建议使用此命令。
- [1] 清除页缓存
- 该命令会释放页面缓存(
pagecache
),它包含了通过文件系统读取的页面,但并不会释放正在使用的inodes
和dentries
缓存。此操作将极大可能的导致系统读取磁盘中的数据而不是从缓存中进行读取,因为所有的缓存都被释放,适用于只需要释放旧的、不需要的缓存占用资源的情况。
- 该命令会释放页面缓存(
# 清空内核缓存中的数据并释放系统内存
$ sudo sync && echo 1 > /proc/sys/vm/drop_caches
- [2] 清除目录项和
inode
- 该命令会释放
inodes
和dentries
的缓存,但是保留已被使用的页面缓存。使用这个选项可以减少对元数据必要的内存,但是对于系统性能影响不大。适用于释放页缓存和部分目录/文件的对象占用资源的情况。
- 该命令会释放
# 清空内核缓存中的数据并释放系统内存
$ sudo sync && echo 2 > /proc/sys/vm/drop_caches
- [3] 清除页缓存、目录项和
inode
(最常用)- 这个选项会释放全部的
pagecache
、dentries
和inodes
缓存,适用于对元数据及缓存释放对性能影响最小化的情况。如果希望使Linux
操作系统在服务大量客户端请求之后刷新所有缓存,则应尝试使用这些命令,以准备更多的可用内存,并防止过多的缓存占用内存。
- 这个选项会释放全部的
# 清空内核缓存中的数据并释放系统内存
$ sudo sync && echo 3 > /proc/sys/vm/drop_caches
在 Linux
系统中有先进的缓存机制,会针对 dentry
(用于 VFS
加速文件路径名到 inode
的转换)、Buffer Cache
(针对磁盘块的读写)和 Page Cache
(针对文件 inode
的读写)进行缓存操作,有效缩短 I/O
系统调用(比如read
/write
)的时间。但当进行了大量文件操作之后,缓存会把内存资源基本用光,导致系统缓慢,使用 swap
空间,影响了性能,这时就需要清理缓存了。
字段解释
shared
:个进程共享的内存数buffers
:用于目录和inode
值的缓存cached
:用于用于已打开的文件的缓存available
:应用程序认为可用内存数量
算数运算
- 项目运算
ALL = Mem(total) + Swap(total)
Swap: total = used + free
Mem: total = used + free + buff/cache
Mem: available = free + buff/cache - 系统保留内存
- 额外运算
- 真实使用的内存 =
Mem: used - buff/cache
- 可用内存 =
Mem(free) + 真实使用的内存
- 真实使用的内存 =
- 项目运算
$ free -g
total used free shared buff/cache available
Mem: 7 0 0 0 6 6
Swap: 7 0 7