同 其他操作系统一样,GNG/Linux 已经有高效完善的内存管理机制了,并且某些方面可能比其他操作系统做的更好。如果一个进程占用了大量内存,我们需要释放它。Linux 系统提供了可以在不重启系统的情况清空缓存、缓冲区及交换分区的方法。
1] 缓存、缓冲及交换分区释意
缓存(cache)
内存缓存是 Linux 系统内核在内存中存储经常访问数据的一种机制。当我们从磁盘中读取一个文件到内存时,内核会保存一份文件内容的复本在内存中,这样如果我们需要再次使用该文件时,就可以快速从内存中取得文件内容而不需要再次打开文件。由于内存的速度明显快来磁盘设备,所以缓存的好处是可以加快系统效率。但是这也会出现极端情况,过量缓存也会让宝贵的内存空间保留大量过时的数据。
缓冲(buffer)
缓冲与缓存类似,但是用途却不相同。缓冲通常会持有主机不同部件需要交换的数据,例如 CPU 和磁盘间。可以所缓冲理解为一个等候区,数据被暂存在这里,等待被写入磁盘或从磁盘中读取待进行处理。虽然缓冲机制可以提升系统性能,但是过多的缓冲数据也有可能降低系统效率。
交换分区(swap)
交换分区被设计成在主机物理内存耗尽时利用一部分磁盘空间来作为虚拟内存使用,当物理内存被占满时,Linux 内核会将一部分较少使用的数据从内存移动至交换分区,以保证活动进程有足够的内存空间。
虽然交换分区机制可以避免内存耗尽造成的系统崩溃,但是由于内存和磁盘速度的差异,过重的交换分区存储同样会降低系统速度。
2] 清空缓存的适用场景
需要注意的是,在清空缓存之前,我们要确切知晓这样做是否有必要。Linux 内核被设计成具有高效管理内存的,高缓存在某些方便来说是一件好事情而非故障。
清空缓存的适用场景:
- 基准测试:我们需要清空数据以创建一个起始点来衡量系统性能
- 内存泄露处理:如果特定的应用会产生内存泄露问题,我们就需要临时进行处理
- 开发环境:例如我们测试应用系统的缓存行为
不建议清空缓存的场景:
- 高缓存应用时:当使用 free 命令查看到有较高缓存时,则不建议立即清空缓存
- 生产环境:在生产环境服务器,不要随意清空缓存
- 故障诊断前:在不确定内存问题前不清空缓存
- 低”free”内存值时:free 命令显示的 free 值低并不一定需要清空缓存,要看 available 显示的值,这个才是关键值
3] 查看内存状态
使用”free”命令就可以查看内存的使用情况,关注”available”列,这个值才是系统可以分配给新的应用程序的可用内存,而不是”free”列显示的值:
# free -h

图.1 使用 free 命令查看内存状态
如果想了解更为与详细的信息,可以使用如下命令:
# vmstat -s

图.2 查看内存使用详情
在清除缓存之前,可以使用”ps”命令确定哪些进程正在占用内存。示例命令会显示占用内存最多的前 10 个进程,如果发现有一个进程运行异常,需要处理,那就不需要清除缓存。
# ps aux --sort=-%mem | head -n 10
4] Linux 系统清空缓存
现在我们来看看如何使用内核提供的”/proc/sys/vm/drop_caches”文件三个选项来清除 Linux 中不同类型的缓存。
重要提示:对于重要系统,先运行同步命令,将所有待处理的数据写入磁盘,以确保清除缓存时不会丢失任何数据。
如果只清空缓存页,则执行如下命令:
# sync; echo 1 > /proc/sys/vm/drop_caches
如果命令执行时提示权限错误,则可以使用如下命令:
# echo 1 | tee /proc/sys/vm/drop_caches
这是生产和企业环境中最安全的方法,因为它只会清除文件缓存,而不会影响其他内核数据结构。
如果要清空目录项和文件索引节点:
# sync; echo 2 > /proc/sys/vm/drop_caches
这样可以释放目录和文件元数据占用的内存,但保持实际文件缓存完整无损。如果想清除以下两项缓存数据,则执行:
# sync; echo 3 > /proc/sys/vm/drop_caches
警告:这是最激进的选项,除非非常清楚自己在做什么以及为什么这样做,否则请勿在生产环境中使用。
5] Linux 系统清空交换分区
对于交换分区,可以使用如下命令解除对其的挂载,相当于释放了交换分区:
# swapoff -a
如果想要再将交换分区启用,则使用如下命令:
# swapon -a
在以下情况下,清理交换空间是合理的:
- 已解决内存不足问题,并希望将交换到磁盘的数据移回内存
- 正在调整或重新配置交换分区
- 已添加更多物理内存,并希望所有程序都在内存中运行
重要警告:如果系统内存不足,切勿清理交换空间;在执行此操作之前,请务必确保有足够的可用内存来处理正在运行的进程。
高效的内存管理对于流畅运行的 Linux 系统至关重要。定期清理内存缓存、缓冲区和交换空间可以显著提升系统性能。通过了解这些机制并使用本文提供的命令,您可以让 Linux 系统始终保持最佳运行状态。