博客
关于我
避免物理内存碎片化
阅读量:79 次
发布时间:2019-02-26

本文共 1084 字,大约阅读时间需要 3 分钟。

Linux内核的物理内存管理系统在运行过程中一直面临着物理内存碎片化问题。尽管系统总可用物理内存量可能较大,但在长时间运行后,空闲的连续物理内存块可能变得非常小,导致申请大块连续物理内存时失败,尤其是在带有ATOMIC标记的分配操作中。

避免碎片

物理内存碎片化问题一直是Linux操作系统的主要缺陷之一。尽管已有多种解决方案,但没有哪种方法能彻底解决这一问题。memory buddy分配方案提供了一种解决思路。用户空间的物理内存页属于movable类型,可以通过更新页表项和数据复制实现分配,而不可移动的页面则固定在内存中,无法迁移。

页面分类

内核引入了页面迁移类型分类机制,将页面分为三类:

  • unmovable:位置固定,无法迁移,主要用于核心内核分配。
  • reclaimable:不能直接移动,但可以通过kswapd回收。
  • movable:可以随意迁移,用户空间应用程序的页属于此类。
  • 将页面分类后,内核将它们组织到不同的链表中,以减少不同类型页面之间的干扰。movable zone的概念被引入,其中movable zone是虚拟的,内核在运行时动态建立。这种分类方式能有效减少碎片化,优先分配unmovable页面,降低buddy分配失败的几率。

    数据结构与分类

    内核通过宏定义表示迁移类型:

    • MIGRATE_UNMOVABLE
    • MIGRATE_RECLAIMABLE
    • MIGRATE_MOVABLE

    fallbacks数组规定了不同类型页面链表的优先级顺序。当无法在指定类型中找到可用页面时,内核会依次尝试其他链表。这种方法能有效避免unmovable页面的碎片化问题。

    ZONE_MOVABLE

    ZONE_MOVABLE是一种虚拟内存区,主要用于可移动分配。其核心思想是将物理内存划分为两部分:

    • 一部分用于可移动分配。
    • 一部分用于不可移动分配。

    ZONE_MOVABLE内存可以从高端内存或普通内存中提取。其优点在于可移动分配不会影响不可移动区的碎片化。对于用户空间的页面映射和内核vmalloc分配等高需求场景,ZONE_MOVABLE提供了高效的内存分配策略。

    结论

    尽管ZONE_MOVABLE和页面分类方法显著缓解了物理内存碎片化问题,但仍存在不足之处。频繁的reclaimable分配会导致unmovable区的碎片化问题。因此,针对特定场景,可以采取以下优化措施:

  • 减少分配的连续页面数目。
  • 使用预分配策略,确保关键操作不会因分配失败而影响系统稳定性。
  • 这种方法虽然不完全解决物理内存碎片化问题,但能显著减少分配失败的可能性,提升系统性能。

    转载地址:http://tmjz.baihongyu.com/

    你可能感兴趣的文章
    Mysql-存储引擎
    查看>>
    mysql-开启慢查询&所有操作记录日志
    查看>>
    MySQL-数据目录
    查看>>
    MySQL-数据页的结构
    查看>>
    MySQL-架构篇
    查看>>
    MySQL-索引的分类(聚簇索引、二级索引、联合索引)
    查看>>
    Mysql-触发器及创建触发器失败原因
    查看>>
    MySQL-连接
    查看>>
    mysql-递归查询(二)
    查看>>
    MySQL5.1安装
    查看>>
    mysql5.5和5.6版本间的坑
    查看>>
    mysql5.5最简安装教程
    查看>>
    mysql5.6 TIME,DATETIME,TIMESTAMP
    查看>>
    mysql5.6.21重置数据库的root密码
    查看>>
    Mysql5.6主从复制-基于binlog
    查看>>
    MySQL5.6忘记root密码(win平台)
    查看>>
    MySQL5.6的Linux安装shell脚本之二进制安装(一)
    查看>>
    MySQL5.6的zip包安装教程
    查看>>
    mysql5.7 for windows_MySQL 5.7 for Windows 解压缩版配置安装
    查看>>
    Webpack 基本环境搭建
    查看>>