Linux 内存管理与缓存机制

发布于:2025-07-06 ⋅ 阅读:(25) ⋅ 点赞:(0)

内存介绍

当使用 free 命令:查看内存使用时,会出现:

参数 含义
total 内存总数
used 已用内存
free 空闲内存
shared 共享内存
buff/cache 缓存(buffer+cache)
available 可用内存

buff/cache 与匿名页

Linux 内存页分为两类:

类型 体现位置 来源 回收方式
文件页 buff/cache 文件内容/元数据 丢弃/写回文件,不进Swap
匿名页 used-buff/cache 程序堆/栈 写入Swap
  • buff/cache:即文件页(Page Cache + Buffer Cache)总和,用于加速文件和块设备访问。
  • 匿名页:程序运行时动态分配的内存(如堆、栈),不包含在buff/cache中,是Swap的主要来源。

自 Linux 2.4 起,Page Cache 和 Buffer Cache 已合并为统一的文件缓存系统。[

Swap(交换空间):内存的临时仓库

  • 本质:一块特殊的磁盘空间(分区或文件),作为物理内存耗尽时的紧急备用。
  • 作用:当物理内存不足时,内核会把内存中不活跃的"匿名页"(见下文)暂时写入 Swap,从而释放物理内存给更需要的进程。
  • 代价:硬盘读写速度远慢于内存。频繁使用 Swap 会导致系统性能急剧下降(卡顿),这个现象称为"颠簸"(Thrashing)。

内存回收与Swap机制

内存页的两种类型

程序占用的内存可分为两类,内核对它们有不同的回收策略:

  1. 文件页 (File-backed Pages)

    • 内容:程序代码、读取的文件等,即 Page Cache 的主要组成部分。
    • 特点:在硬盘上有对应的源文件(“老家”)。
    • 回收方式:内存不足时,干净页直接丢弃(下次从源文件读回),脏页(修改过)先写回源文件再丢弃。这类内存不会进入 Swap
  2. 匿名页 (Anonymous Pages)

    • 内容:程序的堆、栈等动态分配的内存(如 mallocnew 申请的)。
    • 特点:在硬盘上没有源文件(凭空创造)。
    • 回收方式:内存不足时,如果这部分内存不活跃,内核会将其写入 Swap 分区,这是它们唯一的"临时避难所"。

内核回收决策流程

当内存紧张时,内核会遵循以下优先级进行回收:

  1. 首先,回收文件页 (Page Cache):这是成本最低的操作,优先回收。
  2. 最后,交换匿名页 (Swap Out):只有在回收文件页后内存仍然不足的情况下,才会把不活跃的匿名页写入 Swap。

如何解读内存状态

  • buff/cache 占用高:通常是好事。表明 Linux 正在充分利用空闲内存加速文件读写,系统会在需要时自动回收。
  • swap 被使用:是一个警示信号。表明物理内存不足以容纳所有活跃程序的匿名内存,需要关注应用是否存在内存泄漏或配置不当。
  • buff/cache + swap 被使用:典型应用内存占用过度的表现。

drop_caches 参数说明

  • 手动释放缓存可用于临时解决问题或测试,但生产环境慎用,它可能掩盖真正的内存问题。
  • /proc/sys/vm/drop_caches 文件用于手动释放缓存:
    • 0:默认,自动管理
    • 1:释放页缓存(page cache)
    • 2:释放目录项和 inode
    • 3:释放所有缓存

提示: 释放缓存前建议先执行 sync,确保数据写入磁盘。

实践操作

查看内存状态

# 以 MB 单位显示内存使用情况
free -m

查看Swap状态

# 查看当前启用的swap空间(分区或文件)
swapon -s

释放 buff/cache 缓存

# 查看当前内存状态
free -m

# 同步缓存到磁盘
sync

# 只释放页缓存
echo 1 > /proc/sys/vm/drop_caches
# 释放目录项和 inode
echo 2 > /proc/sys/vm/drop_caches
# 释放所有缓存(常用)
echo 3 > /proc/sys/vm/drop_caches
# 恢复为自动管理
echo 0 > /proc/sys/vm/drop_caches

风险提示: 生产环境不建议频繁手动释放缓存,频繁清理可能掩盖应用层内存问题,建议优先优化应用程序内存管理。