news 2026/4/16 9:02:17

【Linux 基础知识系列:第二百零五篇】理解 Linux 虚拟内存机制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Linux 基础知识系列:第二百零五篇】理解 Linux 虚拟内存机制

一、简介:为什么要懂虚拟内存?

  • 应用视角:malloc/new 成功 ≠ 物理内存一定够用,延迟分配(Lazy Allocation)可能让程序在真正访问时触发 OOM(Out of Memory)。

  • 运维视角:服务器突然卡顿,top 看到“还有内存”,但 swap 已飙高 →不懂虚拟内存就无从下手

  • 开发视角:写实时/低延迟程序,需要锁页(mlock)、禁止 swap,否则一次缺页中断就是毫秒级抖动。

掌握虚拟内存 = 能回答:
“我的进程到底用了多少内存?”、“free 与 top 数据为什么不一致?”、“swap 到底关不关?”


二、核心概念:5 张图看懂“虚-实-换”

概念一句话本文速记
虚拟地址空间每个进程 4 GB(64 位 128 TB)连续假象cat /proc/PID/maps
物理页(Page)4 KB 最小单元,全局唯一page_to_pfn()
页表(Page Table)虚拟页 → 物理页映射,MMU 硬件走路MMU
交换分区(Swap)冷页换出到磁盘,腾出物理内存/proc/swaps
缺页中断(Page Fault)访问尚未映射物理页的虚拟页 → 内核处理vmstatpf

一句话总结:
虚拟内存 = 虚拟地址空间 + 页表 + 物理页帧 + 交换机制 + 缺页中断处理


三、环境准备:10 分钟搭好实验沙箱

  1. 系统
    Ubuntu 20.04+ / CentOS 8+(内核 ≥5.4 即可)

  2. 工具

    • util-linux(含 vmstat)

    • stress-ng(内存压测)

    • smem(PSS 统计)

  3. 一键安装

    # Ubuntu/Debian sudo apt update && sudo apt install -y util-linux stress-ng smem # CentOS/RHEL sudo dnf install -y util-linux stress-ng smem
  4. 实验目录

    mkdir -p ~/mem-lab && cd ~/mem-lab

四、实际案例与步骤:从 0 到 1 会看、会压、会调

每个脚本均可直接复制,保存后chmod +x xxx.sh && ./xxx.sh跑通。


4.1 快速上手:vmstat 1 秒级监控

#!/usr/bin/env bash # file: 01-vmstat-basic.sh echo "每 1 秒采样,输出 10 次" vmstat 1 10

输出列说明(先记核心 6 列)

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st
  • swpd:已用 swap(KB)

  • free:空闲物理内存

  • si/so:每秒换入/换出页(>0 代表 swap 活跃

  • us/sy/id/wa:CPU 使用分布,wa 高常伴随 swap 风暴


4.2 压力测试:制造内存瓶颈观察指标

#!/usr/bin/env bash # file: 02-stress.sh # 消耗 2 GB 物理内存,持续 30 秒 stress-ng --vm 2 --vm-bytes 1G --timeout 30s --vm-keep

并行终端监控

vmstat 1 | tee vmstat-stress.log

现象

  • free骤降,cache被回收

  • si/so开始 >0,若内存不足swap 飙高

  • wa列升高 → 等待换页完成,系统卡顿


4.3 进程视角:PSS、RSS、USS 区别

#!/usr/bin/env bash # file: 03-smem.sh # 以 nginx 为例 sudo smem -p | grep -E 'nginx|PID'

输出

PID PSS RSS USS Command 1234 1.2M 2.0M 0.8M nginx: master
  • PSS(Proportional Share)= 共享页按比例分摊,最贴近“真实占用”

  • RSS含共享库,重复计算

  • USS不含共享,单进程独占


4.4 调优实战:三步缩小 swap 风暴

场景:桌面 Ubuntu 卡顿,vmstat 看到so>500 KB/s

临时降低 swap 倾向

# 0=尽量不用 swap,100=积极用 echo 10 | sudo tee /proc/sys/vm/swappiness

永久写入

echo "vm.swappiness=10" >> /etc/sysctl.conf sudo sysctl -p

锁页(可选)
数据库/实时进程可在代码里调用

mlockall(MCL_CURRENT | MCL_FUTURE);

或 systemd 单元加

LimitMEMLOCK=infinity

验证:再次压测,si/so保持 0,卡顿消失。


4.5 缺页中断统计:sar 互补验证

# 安装 sysstat sudo apt install -y sysstat # 每 2 秒统计缺页次数 sar -B 2 10

关键指标:

  • pgscank/skswapd 回收页

  • pgfault/s总缺页(Major + Minor)

  • majflt/sMajor Fault→ 需磁盘 IO,性能杀手


五、常见问题与解答(FAQ)

问题现象排查 & 解决
free -m可用内存很少,但si/so=0被 cache 占用available列,不必手动释放
stress-ngout of memoryfree还有vm.max_map_count限制sysctl vm.max_map_count=262144
关闭 swap 后系统卡死无 swap 且内存耗尽 → OOM-killer 大量杀进程不要直接 swapoff,降低 swappiness 更稳
同一进程 RSS 远大于 PSS共享库重复计算PSS为准做容量规划
容器内存超过 limit 被 OOM/sys/fs/cgroup/memory/memory.stat对比cachevsrss决定是否缩小cache

六、实践建议与最佳实践

  1. 监控“铁三角”
    vmstat 1+sar -B 2+smem -p同时看,避免单指标误判。

  2. Swappiness 不是越低越好
    数据库/实时:10
    通用云主机:30(默认)
    桌面系统:60 更流畅

  3. 提前触发 OOM-killer 演练

    echo 1 > /proc/sys/kernel/sysrq echo f > /proc/sysrq-trigger

    观察dmesg杀进程顺序,验证重要服务是否被oom_score_adj保护。

  4. HugePage 减少 Major Fault
    大内存应用(Redis、Oracle)开启vm.nr_hugepages=2048,页表项更少,缺页次数下降 30%+。

  5. systemd 资源限制
    单元文件加:

    MemoryMax=4G MemorySwapMax=0

    硬封顶物理+swap,防止“一进程打满整机”。


七、总结:一张脑图带走全部要点

Linux 虚拟内存 ├─ 虚拟地址 → 页表 → 物理页 ├─ 监控:vmstat 1 看 si/so wa ├─ 压测:stress-ng --vm ├─ 评估:smem 看 PSS ├─ 调优:swappiness / HugePage / mlock └─ 排错:Major Fault → sar -B

理解虚拟内存,你就拥有了:

  • 容量规划时不再被“RSS”忽悠,用 PSS 算真实占用

  • 性能调优时一眼识别 swap 风暴,用vmstat秒级定位

  • 实时系统中合理配置mlock+HugePage,把毫秒级抖动压到微秒级

立刻打开终端,跑一遍本文脚本,把输出截图存档——下次面试或生产排错,你也能5 分钟内给出量化结论,让“内存不足”不再靠拍脑袋!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/12 17:15:31

LobeChat蓝绿部署实施方案

LobeChat 蓝绿部署实施方案 在当今 AI 应用快速迭代的背景下,如何在不中断服务的前提下完成系统升级,已经成为企业级智能聊天平台的核心挑战之一。尤其是像 LobeChat 这类承载着用户长期会话、文件交互和多模型调用的 AI 助手门户,任何一次发…

作者头像 李华
网站建设 2026/4/9 3:14:32

2025年主流代码托管平台横向评测:本土化与全球化之争

2025年主流代码托管平台横向评测:本土化与全球化之争 在数字化转型加速的2025年,代码托管平台已成为开发者日常工作中不可或缺的基础设施。随着全球开发协作模式日益普及,如何选择适合团队需求的代码托管平台成为技术决策者的重要课题。本文将…

作者头像 李华
网站建设 2026/4/13 2:17:09

Nginx精品教材001【20251217】002篇

文章目录 ✅ 总体定位:《韩艳威 Nginx 高可用架构演进五部曲》 📘 第一本书:《实战 Nginx:企业级 Web 服务部署与运维》** 目标读者: 内容大纲: 📗 第二本书:《深入 Nginx:性能优化与安全加固》 目标读者: 内容大纲: 📙 第三本书:《Nginx 架构设计:高可用与负…

作者头像 李华
网站建设 2026/4/12 22:33:23

双机热备:从原理到实践的全方位剖析【20251217】003篇

文章目录 双机热备:从原理到实践的全方位剖析(出版级精品指南) 核心总述 一、3W1H全景解析(专业+大白话双视角) 1. Why:双机热备的背景与核心价值 专业解读 大白话翻译 补充:关键指标定义(必懂基础) 2. What:双机热备的本质与核心概念 专业解读 大白话翻译 常见误区澄…

作者头像 李华
网站建设 2026/3/31 22:02:41

Nginx精品教材001【20251217】003篇

文章目录 Nginx技术丛书系列规划(8本) 丛书定位 第一册:《Nginx运维工程师入门到精通》 图书定位 核心读者 内容大纲 第一部分:Web服务基础篇(夯实基础) 第二部分:Nginx核心配置篇(掌握核心) 第三部分:应用场景实战篇(解决问题) 第四部分:运维管理实战篇(提升效率…

作者头像 李华
网站建设 2026/4/15 11:59:48

Nginx + Keepalived 实现高可用主从架构:配置、交付、验证与运维全流程指南

文章目录 Nginx + Keepalived 实现高可用主从架构:配置、交付、验证与运维全流程指南 一、方案目标 二、架构设计 网络拓扑图(简化版) 三、环境准备 四、安装与基础配置 1. 安装 Nginx 和 Keepalived(以 CentOS 为例) 2. 配置不同测试页面(用于可视化识别主从) Master 页…

作者头像 李华