如何在Linux上清理内存缓存、缓冲与交换空间

. 什么是 PageCaC++he、dentry 和 inode 缓存?

在本指南中,我们将学习如何清除三种类型的缓存。在开始之前,请先熟悉以下术语:

  • PageCache:用于缓存文件的内容。最近访问的文件存储在此处,因此无需再次从硬盘读取它们,除非文件发生更改或缓存被清除以为其他数据腾出空间。这减少了对硬盘的读写操作,提高了系统性能,因为可以从内存(RAM)中更快地读取文件。

  • Dentry 和 inode 缓存:用于缓存目录和文件的属性。这些信息与 PageCache 密切相关,但不包含文件的实际内容。此缓存同样减少了磁盘的输入和输出操作。

2. 如何在 Linux 中清除缓存?

Linux 系统提供了三种选项来清除缓存,而无需中断任何进程或服务。

2.1 清除缓存的命令

  • 仅清除页面缓存(PageCache)

    # sync; echo 1 > /proc/sys/vm/drop_caches
  • 清除目录项和 inode 缓存

    # sync; echo 2 > /proc/sys/vm/drop_caches


  • 清除页面缓存、目录项和 inode 缓存

    # sync; echo 3 > /proc/sys/vm/drop_caches


2.2 命令说明

  • sync:刷新文件系统缓冲区,确保所有数据都写入磁盘。

  • echo:向 /proc/sys/vm/drop_caches 文件写入值,从而清空缓存。

  • 写入 1 清除页面缓存,写入 2 清除目录项和 inode 缓存,写入 3 清除所有缓存。

注意

  • 在生产环境中,建议仅使用 echo 1 清除页面缓存,因为这是最安全的方式。

  • 不建议使用 echo 3,除非你明确知道自己在做什么,因为它会清除所有缓存,可能导致系统性能下降。

3. 何时需要清除缓存?

在大多数情况下,Linux 系统会自动管理缓存,无需手动干预。但在以下场景中,清除缓存可能是必要的:

  • 进行 I/O 性能测试:当你需要测试磁盘的实际性能时,清除缓存可以避免缓存对测试结果的影响。

  • 调试系统问题:清除缓存可以帮助确定问题是否与缓存相关。

警告

  • 清除缓存会暂时降低系统性能,因为系统需要重新从磁盘加载数据。

  • 不建议在生产环境中定期清除缓存,除非有明确的需求。

4. 自动清除缓存

如果你确实需要定期清除缓存,可以通过创建一个 shell 脚本并使用 cron 任务来实现。

4.1 创建脚本

  1. 创建一个名为 clearcache.sh 的脚本文件:

    #!/bin/bash
    # 清除所有缓存(不推荐在生产环境中使用)
    sync
    echo /proc/sys/vm/drop_caches


  2. 赋予脚本执行权限:


    # chmod 755 clearcache.sh


4.2 设置定时任务

  1. 编辑 crontab 文件:

    # crontab -e
  2. 添加以下行,使脚本在每天凌晨 2 点运行:

    0 2 * * * /path/to/clearcache.sh


重要提示

  • 在生产环境中,不建议自动清除缓存,因为这可能导致系统性能下降,甚至引发问题。

  • 如果必须清除缓存,请仅在低峰时段进行,并确保了解其影响。

5. 清除交换空间

如果你需要清除交换空间,可以执行以下命令:

# swapoff -a && swapon -a

注意

  • 与清除缓存类似,清除交换空间也可能对系统性能产生影响。

  • 在执行此操作之前,请确保了解其后果。

5.1 组合脚本

如果你需要同时清除缓存和交换空间,可以将以下命令组合到一个脚本中:

#!/bin/bash
# 清除缓存和交换空间
sync
echo /proc/sys/vm/drop_caches
swapoff -&& swapon -a
printf '\n%s\n' 'Ram-cache and Swap Cleared'


5.2 测试效果

在执行脚本前后,可以通过以下命令检查缓存和交换空间的使用情况:

总结

  • 了解缓存的作用:缓存可以提高系统性能,但清除缓存可能会导致性能下降。

  • 谨慎操作:在生产环境中,仅在必要时清除缓存,并确保了解其影响。

  • 避免自动清除:除非有明确需求,否则不建议设置定时任务自动清除缓存。