Linux Swap机制关键点分析

深入了解Linux内核--页面回收和页交换 这种做法背后的原因是这样:如果内核仅限于不活动页,较大型的分配通常无法满足,对繁忙的内核来说,较大的连续物理内存区间中包含活动页的可能性是非常高的。每次调用 shrink_zone 时,将扫描的活动和不活动页的数目,即 nr_scan_active 和 nr_scan_inactive ,需要分别加上内存域中当前活动和不活动页的数目右移 priority 位(再加1),所加的数值约等于内存域中当前活动/不活动页数整除以2 priority 的商。接下来将删除页向量的内容,以便为缓存中的新页腾出空间。 阅读详情
1. page被swap出去之后,再次缺页是怎么找到找个换出的页面?
正常内存的页面是通过pte映射找到page的,swap出去的page有其特殊的方式:swap的页面page->private字段保存的是:swap_entry_t通过swap_entry_t就能找到该页面的扇区号sector_t,拿到扇区号就可以从块设备中读回page的内容,那么具体怎么从swap_entry_t找到扇区号呢:

由上图可以计算出来offset和type值,offset值得含义是对应swap_map的slot编号,type可以代表是哪个swap分区,那么根据这两个值就可以计算出扇区号:

具体查找扇区号的源码:swapfile.c:swap_page_sector:

sector_t swap_page_sector(struct page *page)                                                                                                   
{
    struct swap_info_struct *sis = page_swap_info(page);
    struct swap_extent *se;
    sector_t sector;
    pgoff_t offset;

    offset = __page_file_index(page);
    se = offset_to_swap_extent(sis, offset);
    //se->start_page是swap_map数组的索引号或者slot编号,单位是block
    sector = se->start_block + (offset - se->start_page);

    //从block转换成扇区号要x8,因为block size = 4K sector size = 512字节
    return sector << (PAGE_SHIFT - 9);
}

问题:page->private字段存储swap_entry_t,这个private的设置是什么时候,最常见的一种情况:add_to_swap_cache:

add_to_swap_cache:
/*
 * add_to_swap_cache resembles add_to_page_cache_locked on swapper_space,
 * but sets SwapCache flag and private instead of mapping and index.
 */
int add_to_swap_cache(struct page *page, swp_entry_t entry,
            gfp_t gfp, void **shadowp)
{
    struct address_space *address_space = swap_address_space(entry);
    pgoff_t idx = swp_offset(entry);
    XA_STATE_ORDER(xas, &address_space->i_pages, idx, compound_order(page));
    unsigned long i, nr = thp_nr_pages(page);
    void *old;

    VM_BUG_ON_PAGE(!PageLocked(page), page);
    VM_BUG_ON_PAGE(PageSwapCache(page), page);
    VM_BUG_ON_PAGE(!PageSwapBacked(page), page);

    page_ref_add(page, nr);
    SetPageS
Rocky Linux 9 为何默认禁用 Swap?ZRAM 与 Swap 文件配置全解析 Swap 是 Linux 内存管理的核心机制之一,用于扩展可用内存、防止 OOM 崩溃。随着大内存硬件普及和内核演进,现代发行版如 Rocky Linux 9(基于 RHEL 9)默认禁用 Swap,转而依赖更高效的 ZRAM 内存压缩技术。其底层原理涉及 LRU 页面回收优化、SSD 寿命保护及 systemd 交换单元管理机制。技术价值体现在降低磁盘写入损耗、提升响应实时性,并支持动态弹性扩容。典型应用场景包括云服务器、CI/CD 节点、数据库服务及边缘设备——需按内存约束与负载特征差异化启用。本文深入 阅读详情

相关推荐

Arch Linux云服务器Swap文件配置实战:从创建到调优

Swap(交换空间)是Linux内存管理的核心机制,用于在物理内存不足时提供缓冲和OOM防护。其原理基于内核页回收策略,通过swappiness等参数控制换页倾向,技术价值在于提升系统稳定性与服务连续性。典型应用场景包括小内存VPS、ARM架构云主机(如arch linux arm)、AUR构建及systemd服务密集环境。本文聚焦swap file方案——相比swap分区更适配云环境的动态存储特性,结合fallocate快速创建、chmod 600权限加固、swapon启用及sysctl持久化调优(如sw

weixin_30521161的博客 334

Zabbix监控中Swap分区告警的深度解析与实战优化

本文深度解析Zabbix监控中触发High swap space usage告警的常见原因与实战排查方法。针对Swap分区使用率过高问题,提供了从理解Linux内存管理机制、使用free等命令精准定位消耗进程,到安全清理Swap、调整内核参数及优化应用配置的完整解决方案,帮助运维人员有效预防和解决系统性能瓶颈。

weixin_29290379的博客 284

Ubuntu添加Swap文件的完整指南:原理、实操与避坑

Swap是Linux内存管理的核心机制之一,用于在物理内存不足时提供溢出缓冲和休眠支持。其工作原理基于内核的页回收策略(如vm.swappiness控制换出倾向),结合zram压缩内存与磁盘Swap文件形成分层缓存体系。技术价值在于提升系统韧性、避免OOM Killer误杀进程,并支撑虚拟机、容器化开发等高负载场景。典型应用场景包括Ubuntu桌面版内存紧张、Docker构建失败、WSL2/VMware虚拟机资源受限等。本文聚焦Swap文件方案——相比传统Swap分区,它更灵活、可动态调整、兼容ext4/X

weixin_33862993的博客 343

Linux内存不够用?Zram压缩swap原理与服务器实战调优

服务器物理内存不足是运维与嵌入式开发中的常见痛点,加购硬件成本高、周期长,而高效的内存压缩技术则提供了一条低成本的软件优化路径。swap交换空间是Linux内存管理的重要机制,传统磁盘swap在高负载下易引发严重I/O瓶颈。Zram是Linux内核中的压缩块设备模块,它将内存页压缩后存放在物理内存中,以CPU换内存,显著提高有效内存利用率,尤其适合小内存服务器、高并发Java应用与嵌入式设备。合理选择lz4、zstd等压缩算法,并配置开机自启、设定mem_limit上限,能让系统在内存紧张时保持稳定响应。本

weixin_28739079的博客 302

Jenkins 节点监控与 Swap 空间告警:从诊断到修复的完整指南

本文详细介绍了Jenkins节点监控中Swap空间告警的诊断与修复方法。从Linux内存管理机制入手,解释了Jenkins监控Swap空间的重要性,并提供了物理机、Docker和Kubernetes环境下的Swap配置方案。同时包含Jenkins侧的优化配置建议和高级故障排查技巧,帮助开发者有效预防构建任务因内存不足而失败的问题。

angzhan5306的博客 372

Mac虚拟内存与SSD寿命:Swap文件真的需要关闭吗?

虚拟内存是现代操作系统的核心内存管理技术,它通过将物理内存与磁盘空间结合,为应用程序提供远大于实际RAM的地址空间。其工作原理是在物理内存不足时,将不活跃的数据页交换(Swap)到磁盘上的特定文件或分区中,以实现多任务并行和防止应用崩溃。这项技术的核心价值在于平衡性能与成本,让有限的内存资源支撑更复杂的工作负载。在macOS系统中,Swap机制会创建swapfile文件,这引发了用户对固态硬盘(SSD)写入寿命(TBW)的普遍担忧。实际上,对于绝大多数用户,由Swap产生的写入量在SSD总寿命中占比极小,盲

weixin_34161032的博客 419

Ubuntu 18.04 swap配置指南:fallocate与mkswap实战详解

Swap是Linux内存管理的核心安全阀,用于在物理内存不足时提供可预测的内存回收兜底机制。其原理基于内核对匿名页的换入换出调度,依赖swappiness参数调控策略,并通过swap分区或swapfile实现持久化存储。技术价值在于提升系统稳定性与OOM容错能力,尤其适用于2GB内存设备、内存密集型应用(如Docker、PyTorch训练)及嵌入式长期运行场景。本文聚焦Ubuntu 18.04默认无swap的现实挑战,深入解析fallocate快速分配与mkswap元数据写入的底层差异,涵盖权限加固、fst

hideto 434

Linux性能优化实战:从基础监控到长效预防机制

Linux性能优化是系统运维的核心技能,其本质在于通过全栈监控实现从被动救火到主动防御的转变。理解CPU负载、内存管理、磁盘IO等基础指标是优化的起点,工具链如top/vmstat/perf等能快速定位瓶颈。在工程实践中,Swap配置、TCP协议栈调优等关键技术直接影响服务稳定性,而Prometheus+Granfa等方案则能建立自动化监控体系。对于数据库、高并发服务等场景,需特别关注内存泄漏、连接跟踪等专项优化。掌握这些方法不仅能解决当下性能问题,更能通过建立性能基线预防潜在风险。

weixin_30509393的博客 297

灰度发布、蓝绿部署、双活架构与数据同步/备份/迁移

本文系统介绍了现代互联网系统的核心部署策略与数据管理技术体系。主要内容包括:1)三种服务发布策略(灰度发布、蓝绿发布、滚动发布)的原理、实现方式和适用场景对比;2)高可用架构设计(同城双活、异地双活、异地多活)的技术方案;3)数据同步机制、备份策略与迁移方案的设计要点。文章通过架构图、流程图和配置示例详细展示了各类技术的实施方法,并分析了不同方案的优劣及风险控制措施,为构建高可用、高可靠的分布式系统提供了完整的技术指南。

zane的博客 515

AUTOSAR Dem模块实战配置:从理论到代码生成的完整指南

本文提供了一份AUTOSAR Dem模块从理论到代码生成的完整实战配置指南。文章详细拆解了配置流程,涵盖Dem模块的核心角色、通用骨架搭建、事件与DTC映射、消抖机制配置,以及与BswM、EcuM、DCM等模块的联调方法,旨在帮助汽车电子工程师快速掌握诊断事件管理的关键配置步骤,生成可运行的代码。

3c4x5z6v7b的博客 455

第十九届全国大学生智能车竞赛越野信标 硬件篇

全国大学生智能汽车竞赛,越野信标组

2301_77568650的博客 4115

手把手教你用LangChain4j打造一个“会追问”的AI客服:以航空货运下单为例

本文详细介绍了如何使用LangChain4j构建一个能够主动追问的航空货运AI客服系统。通过对话状态管理、信息缺口识别和渐进式引导等核心技术,实现高效的多轮对话交互。文章包含从交互设计到代码实现的完整指南,特别强调了提示词(Prompt)在优化AI行为中的关键作用,帮助开发者打造更智能的客服解决方案。

weixin_28731223的博客 154

从零到一:DAMASK与ABAQUS联合仿真的环境配置艺术

本文详细介绍了在Ubuntu 16.04系统中配置DAMASK与ABAQUS2017联合仿真环境的完整流程,涵盖系统基础环境搭建、Python科学计算环境构建、DAMASK核心安装与配置,以及ABAQUS集成与联合调试。通过实战案例和高级调试技巧,帮助用户快速掌握有限元分析中的晶体塑性模拟技术。

weixin_29253711的博客 857

ERGM指数随机图模型全解析:从基础原理到R语言实操

从社交网络中的互惠、传递性和同质性等基本现象切入,介绍网络数据与传统回归分析的本质差异——边与边之间的依赖关系。指数随机图模型(ERGM)正是为刻画这种依赖结构而设计的统计框架,它通过指数族分布将网络结构效应显式建模,结合MCMC方法完成参数估计。ERGM在组织协作、传播扩散、生物生态等领域的应用日益广泛,其扩展模型TERGM、GERGM和多层ERGM进一步支持时序、权重与多重关系网络。本文系统梳理ERGM的理论基础、核心统计量、扩展模型选型及R语言实操要点,帮助研究者理解网络生成机制并完成收敛性诊断与结果

weixin_29050271的博客 358

(第100天)Oracle GoldenGate 常见故障处理指南

OGG 运维的核心在于细致的配置管理和主动的问题排查。熟悉常见错误、掌握关键操作流程、并善用日志和调试工具,是保障数据同步任务稳定运行的关键。希望这份指南能帮助您更高效地解决 OGG 同步中遇到的问题。祝您运维顺利!

LuciferLiu_DBA 301

六、大模型(LLMs)参数高效微调(PEFT) 面

链接: https://pan.baidu.com/s/1TYqdCK53tDFEYGtAvpnTbA 提取码: 6a9s。考核中的核心考点,并针对这些考点提供了详尽的解答。通过网盘分享的文件:06大模型(LLMs)参数高效微调(PEFT) 面。)有哪些方法,能不能稍微介绍一下它们间?这种微调方法和全参数比起来有什么劣势吗?能不能总结一下各种参数高效微调方法?高效参数微调,如何进行存储?多种不同的高效微调方法对比。模型显存占用的部分有哪些?微调方法为啥能加速训练?微调计算可训练参数的比例。

weixin_51988935的博客 534

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: zram压缩机制看swapon系统调用
下一篇: linux 公平调度关键点记录
OS技术解密
博客等级 码龄16年 3760粉丝 189原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值