博客
关于我
避免物理内存碎片化
阅读量: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如何实现ACID ?
    查看>>
    mysql如何记录数据库响应时间
    查看>>
    MySQL子查询
    查看>>
    Mysql字段、索引操作
    查看>>
    mysql字段的细节(查询自定义的字段[意义-行列转置];UNION ALL;case-when)
    查看>>
    mysql字段类型不一致导致的索引失效
    查看>>
    mysql字段类型介绍
    查看>>
    mysql字段解析逗号分割_MySQL逗号分割字段的行列转换技巧
    查看>>
    MySQL字符集与排序规则
    查看>>
    MySQL字符集乱码
    查看>>
    mysql字符集设置
    查看>>
    mysql存储IP地址的数据类型
    查看>>
    mysql存储中文 但是读取乱码_mysql存储中文乱码
    查看>>
    MySQL存储引擎
    查看>>
    MySQL存储引擎
    查看>>
    MySQL存储引擎--MYSIAM和INNODB引擎区别
    查看>>
    Mysql存储引擎(1):存储引擎体系结构和介绍
    查看>>
    Mysql存储引擎(2):存储引擎特点
    查看>>