深入理解SPDK: 内存管理

CPU 内存 物理地址空间会散列 ( interleave between channel/memory controller);

NVME 设备对使用内存物理地址空间的限制:
The NVMe 1.0 specification requires all physical memory to be describable by what is called a PRP list. To be described by a PRP list, memory must have the following properties:

NVME 设备通过DMA传输数据
NVMe devices transfer data to and from system memory using Direct Memory Access (DMA). Specifically, they send messages across the PCI bus requesting data transfers. In the absence of an IOMMU, these messages contain physical memory addresses. These data transfers happen without involving the CPU, and the MMU is responsible for making access to memory coherent.

The memory is broken into physical 4KiB pages, which we‘ll call device pages.
The first device page can be a partial page starting at any 4-byte aligned address. It may extend up to the end of the current physical page, but not beyond.
If there is more than one device page, the first device page must end on a physical 4KiB page boundary.
The last device page begins on a physical 4KiB page boundary, but is not required to end on a physical 4KiB page boundary.

The specification allows for device pages to be other sizes than 4KiB, but all known devices as of this writing use 4KiB.

用户态的程序(SPDK)使用户态的地址,而nvme 设备需要使用物理地址,因此需要实现这两个地址之间的转换(映射)。

可以考虑的方法:

  • inspect /proc/self 看虚拟地址和物理地址的映射关系。
    但是由于page swap out/swap in可能导致映射关系改变,没法保证 nvme DAM 传输过程中pinned page的要求;
  • mlock call
    mlock 强制内存的一个虚拟page 一直被一个物理页backed。这会导致swapping 被禁止。但这也无法保证那是static mapping,因为POSIX并没有定义一个支持pining memory 的API,分配pinned memroy的机制是和 OS 相关的。
  • huge page

虽然这并非内核刻意的设计,但内核对huge page的处理不同于传统4KB page的处理,kernel 从不回改变它对应的物理内存的位置。

在没有IOMMU的情况下,上面通过huge page 申请到的虚拟地址还是需要通过转换成物理地址。
MMU:mem virtual address <----> physical address of memory
IOMMU: pci bus address of nvme device buffer/cache <----> buffer virtual address
数据交换: mem virtual address <=====> buffer virtual address

原文地址:http://blog.51cto.com/xiamachao/2349968

时间: 2024-11-09 23:27:46

深入理解SPDK: 内存管理的相关文章

深入理解_JVM内存管理调优案例分析与实战10

1.高性能硬件上的程序部署策略 目前常用2种方式: (1)通过64位JDK来使用大内存: 使用第一种方式关键: <1>控制应用程序的Full GC频率.譬如10多个小时甚至一天才出现一次Full GC. 关键:大多数对象的生存时间不应该太长,保证老年代空间的稳定. 在大多数网站形势的应用里,主要对象的生存周期都是请求级或页面级的,会话级和全局级的长生命对象相对较少,控制住Full GC. 需要考虑的问题: <1>内存回收导致的长时间停顿: <2>现阶段,64位JDK的性

你应该这样理解JVM内存管理

在进行Java程序设计时,一般不涉及内存的分配和内存回收的相关代码,此处引用一句话: Java和C++之间存在一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外的人想进去,墙里面的人想出来 ,个人从这两句话中,捕获到了 两个点 . java的自动内存管理机制,极大的节省了开发人员的精力,避免了易错且复杂的内存管理设计,相对于手动的内存管理这是极大的飞跃.java自动内存管理机制,其不能根据具体的场景提供最优的内存管理,其只提供普适的内存管理机制.想比于C++的手动内存管理,灵活性不够,存在制约系

深入理解Linux内存管理

引用:Live and Learn 1. 内存地址 以Intel的中央处理器为例,Linux 32位的系统中,物理内存的基本单位是字节(Byte),1个字节有8个二进制位.每个内存地址指向一个字节,内存地址加1后得到下一个字节的地址.这里用以表示物理内存实际位置的地址,就是通常所说的物理地址(Physical Address).CPU正在执行的进程代码.进程数据和栈区数据等,都临时保存在物理内存中. 线性地址(Linear Address,亦即虚拟地址 Virtual Address)是出于以下

深入理解 Linux 内存管理

1. 内存地址 以Intel的中央处理器为例,Linux 32位的系统中,物理内存的基本单位是字节(Byte),1个字节有8个二进制位.每个内存地址指向一个字节,内存地址加1后得到下一个字节的地址.这里用以表示物理内存实际位置的地址,就是通常所说的物理地址(Physical Address).CPU正在执行的进程代码.进程数据和栈区数据等,都临时保存在物理内存中. 线性地址(Linear Address,亦即虚拟地址 Virtual Address)是出于以下考虑 (1) 隔离不同进程使用的内存

深入理解C++内存管理机制

关于C++的内存处理,可分为三大块,分别是: (一)内存管理机制 (二)内存泄露处理 (三)内存回收机制 这篇文章将就(一)内存管理机制 进行深入探讨,如有错误欢迎大家指正. C++的内存管理也可细分为 1. 程序内存布局 2. 内存的分配方式 3. 常见内存错误及对策 ---------------------------------------------------------------------------- 一. 程序内存布局 查了相关资料,明白了一点: memory layout

理解自动内存管理

翻译的这篇文章 http://docs.unity3d.com/Manual/UnderstandingAutomaticMemoryManagement.html 当一个Object,String,Array创建的时候,需要从Heap(堆)上分配内存,当不用的时候就会自动收回. 过去通常都是由程序猿来做这事的,现在,运行时的系统,比如说unity的Mono Engine会帮你自动管理内存.不但帮你减轻了工作,还可以尽量避免内存泄露(跪舔吧).

深入理解_JVM内存管理对象引用03

1.对象引用: (a)对象状态的判断: <1> 引用计数算法:无法解决对象相互引用的问题. <2> 根搜索算法:主流的判断对象是否存活的算法. (1)基本思路:通过一系列的名为:"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相关联时,证明此对象是不可用的,所以它们将会被判断为是可收回的对象. (2)Java中,GC Roots的对象包括下面几种:

深入理解_JVM内存管理内存分配和回收策略06

解决两个问题: 1.对象分配内存: 2.回收分配给对象的内存. 本节详细讲解分配的问题: 名词解释: 新生代GC(Minor GC):指发生在新生代的垃圾回收动作,非常频繁,回收速度很快. 老生代GC(Major GC/Full GC):指发生在老生代的垃圾回收动作,出现了Major GC,经常会伴随至少一次的Minor GC(但非绝对),速度一般会比Minor GC慢10倍. 打印日志说明: <1> DefNew:串行GC方式(Serial GC). <2> ParNew:Par

深入理解_JVM内存管理JDK监控工具与故障处理工具07

1.jps: JVM process Status Tool,显示系统所有的HotSpot虚拟机进程以及进程的本地虚拟机的唯一ID(LVMID,Local Virtual Machine Identifier). 对于本地虚拟机进程来说,LVMID与操作系统的进程ID(PID,Process Identifier)是一致的.如果启动了多个虚拟机进程,就需要显示主类的功能才能区分了. jps命令格式: jps [option] [hostid] jps主要选项: -v :输出虚拟机进程启动时JVM