【问题标题】:Direct disk IO to/from buffer was allocated by mmap与缓冲区的直接磁盘 IO 由 mmap 分配
【发布时间】:2017-09-06 11:35:45
【问题描述】:

我需要有关直接磁盘 IO 的帮助。我通过带有标志 O_DIRECT 的文件描述符 (fd) 打开一个文件。在我的用户空间应用程序中,我想从文件中读取大量数据,而这些数据只使用了一次。通过“set_memory_uc”(使用x86)和“remap_pfn_range”在我的内核模块中分配了一块未缓存的内存缓冲区,其中vm_page_prot设置为非缓存(pgrot_noncached)。此缓冲区旨在用于通过 PCIe 进行 DMA 传输。

我试过了

读取(fd,缓冲区,len)

和

lseek(fd, 0x1000, SEEK_SET)

'buffer' VA 对齐到 4k 边界。 'len' (n*4k) 也是如此

出于某种原因,'lseek' 似乎有效,因为在调用 lseek 后它返回 0x1000

但“读取”返回 -1

直接磁盘读取磁盘数据到mmap缓冲区有什么限制吗?

【问题讨论】:

    标签: linux linux-kernel


    【解决方案1】:

    请考虑使用带有POSIX_FADV_NOREUSE 标志的posix_fadvise() 而不是O_DIRECT,以指示“数据将仅使用一次”。

    【讨论】:

    • +1 这个。使用O_DIRECT 一开始几乎总是一个错误。可能有合法用途,但我真的无法想象它会有什么好处(实际上,不是在某人的想象中)。唯一值得商榷的“优势”是编写时数据更安全,但这是一种错觉。除此之外,它永远不会比缓存读取快,但通常很多慢。
    • 感谢您回答我的问题。我对“posix_fadvise()”的问题是磁盘读取性能。 “O_DIRECT”和“posix_fadvise()”之间的数据流路径不是不同吗?我使用“O_DIRECT”的图像数据绕​​过操作系统缓冲区和缓存直接传输到物理内存以进行磁盘读取。但是“posix_fadvise()”仍然通过操作系统缓冲区和缓存。
    • @SharonLee:看这里:unix.stackexchange.com/questions/6467/use-of-o-direct-on-linux - 你相信O_DIRECT 会更快,但可能不会。
    • @John Zwinck:谢谢你的链接。我想我对 O_DIRECT 在进行磁盘读取时的工作方式有了更好的了解。我的最终目标是确保在 DMA 传输之前将所有数据填充到目标内存块(物理内存块)中。看来我实际上需要“fsync”或“fdatasync”。我的应用程序真的需要带有 POSIX_FADV_NOREUSE 的“posix_fadvise”吗?如果我不确认不再需要缓存会发生什么?会不会影响磁盘读取性能?
    • @SharonLee: posix_fadvise() 不会影响程序的正确性。因此,欢迎您尝试不使用它——它不会使您的程序在性能方面有所不同。
    猜你喜欢
    • 2011-09-13
    • 2011-09-06
    • 1970-01-01
    • 2016-12-21
    • 2014-09-12
    • 2011-07-16
    • 2010-11-29
    • 2018-05-16
    相关资源
    最近更新 更多