news 2026/4/25 19:36:22

【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/21 7:09:00

通达信彩带表示的macd

{}W:1; M:1; MM:9*M; SHORT:MM*4/3; LONG:MM*26/9; DIFF:(EMA(CLOSE,SHORT)-EMA(CLOSE,LONG)); DEA:EMA(DIFF,MM),COLOR58FF58; MACD:2*(DIFF-DEA),COLORFFFF00,LINETHICK0; 红柱:DRAWBAND(MACD,RGB(180,50,50),0,RGB(0,128,0)); 绿柱:DRAWBAND(0,RGB(0,128,0),MACD,RGB(180,50…

作者头像 李华
网站建设 2026/4/23 23:55:52

双机热备全景剖析:从技术原理到角色视角的深度解构【20251217】001篇

文章目录 双机热备全景剖析:从技术原理到角色视角的深度解构 开篇:为何“永不宕机”成为数字时代的生死线? 第一章 本源探究:3W1H框架解构双机热备核心 1.1 WHAT(是什么)—— 技术本质的多层透视 1.2 WHY(为什么)—— 业务连续性的数字经济学 1.3 WHERE(用在哪里)——…

作者头像 李华
网站建设 2026/4/22 0:37:05

双机热备:从背景到实践的深度剖析【20251217】002篇

文章目录 **双机热备:从背景到实践的深度剖析** **前言:为什么需要“双机热备”?** 第一章:What —— 什么是双机热备? 1.1 定义(专业角度) 1.2 大白话解释(生活类比) 第二章:Why —— 为什么要用双机热备? 2.1 技术动因:单点故障是万恶之源 (1)硬件层面不可靠性…

作者头像 李华
网站建设 2026/4/23 16:54:42

《Python 数据序列化与反序列化全景解析:从基础到最佳实践》

《Python 数据序列化与反序列化全景解析:从基础到最佳实践》 一、开篇引入:为什么要关注序列化? 在现代软件开发中,数据的跨平台传输与持久化是不可或缺的环节。无论是 Web API 的 JSON 响应、机器学习模型的保存与加载&#xff…

作者头像 李华
网站建设 2026/4/24 16:08:02

零基础:100个小案例玩转Python软件开发!第五节:用户登录

欢迎回到我们的 《零基础:100个小案例玩转Python软件开发!》 系列!在本节课,我将教大家如何开发一个可以登录的界面。 我们先在PyMe中创建一个对话框窗口程序。 虽然这只是一个PyMe中的模版程序,但它具备一个简单的登录…

作者头像 李华