direct_io失败的原因

时间:2012-10-29 04:21:37

标签: linux file-io kernel

我想知道在什么情况下直接I / O传输会失败?

我有三个子查询。根据“了解Linux内核”一书..

  1. Linux提供了一种绕过页面缓存的简单方法:直接I / O传输。在每次I / O直接传输中,内核对磁盘控制器进行编程,以直接从属于自缓存应用程序的用户模式地址空间的页面传输数据。
  2. - 所以要解释失败,需要检查应用程序是否具有自缓存功能?不知道如何做到这一点。

    2.此外,该书还说“当自缓存应用程序希望直接访问文件时,它会打开指定O_DIRECT标志的文件。在为open()系统调用提供服务时,dentry_open()函数会检查direct_IO方法是为正在打开的文件的address_space对象实现的,并返回相反情况下的错误代码“。

    - 除了可以解释直接I / O故障的任何其他原因外?

    3.这个命令“dd if = / dev / zero of = myfile bs = 1M count = 1 oflag = direct”在linux中是否会失败(假设有足够的磁盘空间)?

2 个答案:

答案 0 :(得分:1)

底层文件系统和块设备必须支持O_DIRECT标志。此命令将失败,因为tmpfs不支持O_DIRECT

dd if=/dev/zero of=/dev/shm/test bs=1M count=1 oflag=direct

写入大小必须是底层驱动程序的块大小的倍数。此命令将失败,因为123不是512的乘法:

dd if=/dev/zero of=myfile bs=123 count=1 oflag=direct

答案 1 :(得分:0)

直接I / O继续失败的原因有很多。

  

所以要解释失败,需要检查应用程序是否具有自缓存功能?

您不能从外部进行此操作-您要么从源代码中推断出该内容,要么观看程序在运行时如何使用资源(我猜是二进制反汇编)。这更多是该程序如何工作的属性,而不是“在通话中启用此功能”。认为所有使用O_DIRECT的程序都具有自我缓存是一个危险的假设(可能我会说这很有可能,但是您不确定)。

  1. 有严格的requirements for using O_DIRECT and they are mentioned in the man page of open (see the O_DIRECT section of NOTES)
  2. 对于现代内核,要操作的区域必须与磁盘的块大小对齐,并且其大小必须是磁盘块大小的倍数。未能正确执行此操作甚至可能导致静默回退到缓冲的I / O。
  3. 是的,例如,尝试在文件系统(例如tmpfs)上使用它不支持O_DIRECT。我想如果到磁盘的路径由于某种原因而返回失败(例如,磁盘快要死了,并且比写回发生的错误要早得多地返回错误),它也可能会失败。