【Linux系列】CMA (Contiguous Memory Allocator) 简单介绍

server/2024/10/15 2:03:02/

CMA (Contiguous Memory Allocator)

CMA是Linux内核中的一种内存分配机制,用于分配物理上连续的内存块。它主要解决了在系统运行一段时间后,物理内存碎片化导致难以分配大块连续物理内存的问题。

CMA的工作原理
  1. 在系统启动时,CMA会预留一块连续的物理内存区域。
  2. 这块内存在正常情况下可以被普通进程使用。
  3. 当需要分配大块连续物理内存时,CMA会将这些普通进程的内存迁移出去。
  4. 迁移完成后,就可以分配出所需的连续物理内存块。
CMA的配置

CMA可以通过内核启动参数或设备树进行配置:

  1. 内核启动参数方式:

    cma=128M@0-2G
    

    这表示在0-2G的物理内存范围内预留128M的CMA区域。

  2. 设备树方式:

    reserved-memory {#address-cells = <2>;#size-cells = <2>;ranges;cma_region: cma@10000000 {compatible = "shared-dma-pool";reusable;reg = <0x0 0x10000000 0x0 0x8000000>;};
    };
    

    这定义了一个从0x10000000开始,大小为128M的CMA区域。

查看CMA信息
  1. 使用 dmesg 命令查看启动日志中的CMA信息:

    $ dmesg | grep cma
    [    1.064932] OF: reserved mem: initialized node linux,cma, compatible id shared-dma-pool
    [    1.162326] Memory: 1999260K/2078720K available (17408K kernel code, 2124K rwdata, 5528K rodata, 3200K init, 805K bss, 71268K reserved, 8192K cma-reserved)
    

    这里可以看到CMA预留了8192K(8MB)的内存。

  2. 查看 /proc/meminfo 文件:

    $ cat /proc/meminfo | grep CMA
    CmaTotal:          8192 kB
    CmaFree:           8192 kB
    

    这显示了CMA总大小和当前可用大小。

  3. 使用 cat /proc/iomem 命令查看CMA内存区域:

    $ cat /proc/iomem | grep cma
    10000000-107fffff : cma-reserved
    

    这显示了CMA预留内存的物理地址范围。

  4. 对于支持CMA的设备,可以查看其sysfs条目:

    $ ls /sys/devices/.../cma/
    

    这里可能会显示设备特定的CMA使用情况。

  5. 在某些系统上,可以通过debugfs查看更详细的CMA信息:

   $ cat /sys/kernel/debug/cma/cma-*

这可能会显示CMA区域的使用统计和分配情况。

CMA的优势
  1. 解决了运行时大块连续物理内存分配的问题。
  2. 提高了内存利用率,预留的CMA区域在不使用时可以被其他进程使用。
  3. 对于需要DMA的设备驱动非常有用,如视频处理、图形加速等。
CMA的局限性
  1. 内存迁移过程可能会引入一定的延迟。
  2. 不适合实时性要求极高的场景。
  3. 需要合理规划CMA区域大小,过大会浪费内存,过小则可能无法满足需求。
注意事项
  • CMA内存分配应该谨慎使用,仅在确实需要大块连续物理内存时才使用。
  • 在使用CMA时,要注意可能的内存竞争问题,合理规划CMA区域大小。
  • 在多核系统中使用CMA时,需要考虑NUMA架构的影响。

通过合理使用和监控CMA,可以有效解决某些硬件设备对大块连续物理内存的需求,提高系统的灵活性和性能。定期检查CMA使用情况可以帮助优化系统配置和应用程序设计。


http://www.ppmy.cn/server/124864.html

相关文章

Python爬虫爬取王者荣耀英雄信息并保存到图数据库

爬取信息说明 英雄名称英雄类型英雄包含的所有皮肤名称 创建英雄类型节点 王者荣耀官方给出的英雄类型是以下几种&#xff1a; 直接准备好英雄类型词典 hero_type_dict [战士, 法师, 坦克, 刺客, 射手, 辅助 ]添加到图数据库中 def create_hero_type_node():for hero_ty…

Many2one(多对一)关联场景中,如何从模型(多)关联到模型(一)的某个字段

好的&#xff0c;让我们换一个更容易理解的例子&#xff0c;涉及到图书和作者之间的关系。假设我们有两个模型&#xff1a;library.book&#xff08;图书&#xff09;和 library.author&#xff08;作者&#xff09;。每本图书可以有一个作者&#xff0c;因此我们可以使用 Many…

「Qt Widget中文示例指南」如何实现一个平板电脑示例?(一)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 当您在平板电脑上使用…

Linux-TCP重传

问题描述&#xff1a; 应用系统进行切换&#xff0c;包含业务流量切换&#xff08;即TongWeb主备切换&#xff09;和MYSQL数据库主备切换。首先进行流量切换&#xff0c;然后进行数据库主备切换。切换后发现备机TongWeb上有两批次慢请求&#xff0c;第一批慢请求响应时间在133…

9.26-9.29学习

一.项目结构的建立 5个微服务模块 新建好各个模块后&#xff0c;在项目pom下引入各模块。各pom文件指定springboot版本2.1.8.RELEASE .gitignore #表示任意路径下的xx文件 **/mvnw **/mvnw.cmd**/.mvn **/target/.idea**/.gitignore 二.数据库初始化 一个微服务模块对应一个数…

Hi3536AV100 22AP20/SS626V100 芯片及开发板

22AP20 是针对多路高清/超高清&#xff08;1080p/4M/5M/4K&#xff09;智能 NVR 产品应用开发的新一代专业高端 SoC 芯 片。22AP20 集成了 ARM Cortex-A55 八核处理器和性能强大的图像分析工具处理器&#xff0c;支持多种智能算法 应用。22AP20 支持 24 路 1080p 多协议解码及 …

2024年配置YOLOX运行环境+windows+pycharm24.0.1+GPU

1.配置时间2024/9/25 2.Anaconda-python版本3.7&#xff0c;yolox版本0.2.0 YOLOX网址: https://github.com/Megvii-BaseDetection/YOLOX 本人下载的这个版本 1.创建虚拟环境 conda create -n yolox37 python37 激活 conda activate yolox37 2.安装Pytorch cuda等&…

正向代理与反向代理:原理、区别以及应用(Nginx 和 Tomcat)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1. 实现原理正向代理工作流程&#xff1a; 反向代理工作流程&#xff1a; 区别 2. 使用案例Nginx作为正向代理Nginx作为反向代理Tomcat作为反向代理 3. 适用场景…