一、Linux 内存管理的核心哲学

“空闲的内存就是浪费的内存”

Linux 内核会最大限度地利用物理内存来提升系统性能。它将内存用于:

  1. 应用程序:直接运行程序。

  2. 缓存:存储频繁访问的磁盘数据,避免慢速的磁盘 I/O。

  3. 缓冲区:暂存待写入磁盘的数据,实现更有效率的写入。

当应用程序需要更多内存时,内核会立即释放缓存和缓冲区的部分,分配给应用程序。因此,被缓存占用的内存应被视为备用可用内存


二、详解 free -h 命令的输出

让我们以您之前的输出为蓝本,进行终极分解:

bash

              total        used        free      shared  buff/cache   available
Mem:           10Gi       4.0Gi       1.2Gi       3.6Gi       5.4Gi       1.6Gi
Swap:          0B          0B          0B
第一行:统计视角
  • total:物理内存总量。

  • used:已分配的内存。注意:这个值 = total - free - buff/cache。它包含了应用程序、内核、shared 和部分无法回收的缓存。不要被这个大的数字吓到

  • free:完全未被使用的内存。单独看此值意义不大,因为它不反映缓存的可回收性。

  • shared:主要被 tmpfs(内存文件系统,如 /dev/shm/run/tmp)和进程间共享内存占用的空间。

  • buff/cache性能加速器

    • buffers:原始磁盘块的临时存储,用于磁盘写操作。

    • cache:从磁盘读取的文件内容缓存(Page Cache)。

  • available最重要的指标! 估算的、在不引发 Swap 的情况下,可用于启动新应用程序的内存大小。它 ≈ free + 可回收的 buff/cache

第二行:Swap 空间
  • 当物理内存不足时,不活跃的内存页会被移到磁盘上的这个特殊分区或文件,以释放物理内存。

  • 高强度的 Swap 使用(si/so 值高)是系统内存严重不足的信号,会导致性能急剧下降。


三、深入 /proc/meminfo:数据的源泉

freetop 等命令的数据都来自 /proc/meminfo。这里提供了最详尽的内存快照。

关键字段解析:

bash

cat /proc/meminfo
  • MemTotal:总内存。

  • MemFree:完全空闲内存。

  • MemAvailable:可用内存估算值。

  • Buffers:缓冲内存大小。

  • Cached:缓存内存大小(包含 SReclaimable)。

  • SwapCached:曾被换出,但又换入,且在 Swap 中仍有备份的内存。这表示 Swap 被使用过,但相关数据又被读回来了。

  • Active / Inactive:活跃 / 不活跃内存。内核倾向于回收 Inactive 列表中的内存页。

  • Active(anon) / Inactive(anon):匿名页(如程序堆栈,不与文件关联)的活跃/不活跃部分。

  • Active(file) / Inactive(file):文件缓存页的活跃/不活跃部分。Inactive(file) 是回收的主要目标。

  • Dirty:已被修改但尚未写入磁盘的脏数据大小。

  • Writeback:正在被写入磁盘的数据大小。

  • Shmem:共享内存大小,包括 tmpfs

  • Slab / SReclaimable / SUnreclaim

    • Slab:内核对象缓存(如 inodedentry 缓存)。

    • SReclaimable:可回收的 Slab(如 dentryinode 缓存)。

    • SUnreclaim:不可回收的 Slab(内核数据结构)。


四、进程级内存视角:top 和 ps

了解系统整体情况后,需要定位具体是哪个进程占用了内存。

使用 top 或 htop

运行 top 后,按 Shift + M 按内存排序。

  • VIRT虚拟内存。进程"声称"需要的总地址空间。包括物理内存和 Swap。这个值可能很大,不代表实际物理占用。

  • RES常驻内存。进程当前实际使用的、未被换出的物理内存大小。这是判断进程内存占用的核心指标

  • SHR共享内存。RES 中可能被其他进程共享的部分(如共享库)。

  • %MEM:RES 占总物理内存的百分比。

关系公式: VIRT ≥ RES ≥ SHR

使用 ps 命令

bash

# 查看内存消耗最高的10个进程
ps aux --sort=-%mem | head -11

五、内存管理机制深度解析

  1. 页面缓存

    • 内核将磁盘上的文件内容缓存在内存中,后续读取将直接从内存提供,速度极快。

  2. 脏页回写

    • 被修改过的缓存页(脏页)不会立即写回磁盘,由内核线程 pdflush 在以下时机触发:

      • 空闲内存低于特定阈值。

      • 脏页存在时间超过特定阈值。

      • 用户调用 sync() 命令。

  3. 内存回收

    • 当 free 内存低于 low 水位线时,内核开始后台回收 Inactive 列表中的内存页。

    • 当 free 内存低于 min 水位线时,内核会进行直接回收,这可能阻塞当前进程,导致卡顿。

  4. Swap

    • 回收匿名页(没有文件背景的内存)的唯一方式就是将其换出到 Swap。

    • Swappiness (/proc/sys/vm/swappiness,值 0-100):控制内核使用 Swap 的倾向。

      • 0:尽可能避免 Swap。

      • 100:积极使用 Swap。

      • 默认值通常为 60


六、何时需要警惕内存问题?

出现以下情况时,需要立即关注:

  1. available 内存持续低于总内存的 5-10%

  2. Swap 使用率持续增长,或者通过 vmstat 1 看到 si(swap in)和 so(swap out)列持续有高值。

  3. 系统响应极慢,硬盘灯常亮,同时 free 内存极低(可能是频繁 Swap 和内存回收导致)。

  4. Dirty 页数量异常高且持续不降,可能意味着存储 I/O 存在瓶颈。

  5. 出现 OOM Killer 日志(在 /var/log/messages 或 dmesg 中),表示内核为释放内存而杀死了进程。


七、高级调试与工具

  1. vmstat 1:查看系统虚拟内存统计。

    • si/so:Swap 进出。

    • bo/bi:块设备读写。

    • cs:上下文切换。

    • us/sy/id:用户/系统/空闲 CPU 时间。

  2. slabtop:查看内核 Slab 缓存使用详情。

  3. cat /proc/pagetypeinfo:查看页面类型信息,用于诊断内存碎片。

  4. valgrind / massif:用于开发阶段分析应用程序的内存泄漏。


八、手动清理缓存(仅用于测试)

警告:生产环境慎用!这会清除性能加速器,导致后续 I/O 变慢。

bash

# 写入 1, 2, 3 到 /proc/sys/vm/drop_caches 来清除不同级别的缓存
sync  # 首先同步数据到磁盘,防止数据丢失
echo 1 | sudo tee /proc/sys/vm/drop_caches  # 清除 page cache
echo 2 | sudo tee /proc/sys/vm/drop_caches  # 清除 dentries and inodes
echo 3 | sudo tee /proc/sys/vm/drop_caches  # 清除 1 和 2 的所有内容

总结

概念 含义 关注度
available 真实可用内存 ★★★★★ (核心指标)
buff/cache 可回收的性能缓存 ★★★☆☆ (理解其作用)
free 完全空闲内存 ★☆☆☆☆ (参考价值低)
RES 进程实际物理内存 ★★★★★ (进程分析核心)
VIRT 进程虚拟内存 ★★☆☆☆ (辅助分析)
Swap used 交换空间使用量 ★★★★☆ (警惕持续增长)

最终建议:不要追求大的 free 内存,而应追求高的 available 内存和稳定、高效的缓存使用。理解这些指标背后的原理,才能精准判断系统真实健康状况。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐