我想知道在什么情况下直接I / O传输会失败?
我有三个子查询。根据“了解Linux内核”一书..
- 所以要解释失败,需要检查应用程序是否具有自缓存功能?不知道如何做到这一点。
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中是否会失败(假设有足够的磁盘空间)?
答案 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
的程序都具有自我缓存是一个危险的假设(可能我会说这很有可能,但是您不确定)。
O_DIRECT
and they are mentioned in the man page of open (see the O_DIRECT
section of NOTES)。tmpfs
)上使用它不支持O_DIRECT
。我想如果到磁盘的路径由于某种原因而返回失败(例如,磁盘快要死了,并且比写回发生的错误要早得多地返回错误),它也可能会失败。