如何判断是否正在使用O_DIRECT?

3

我正在运行一个支持O_DIRECT的IO密集型进程。在进程运行期间,有没有一种方法可以检查是否正在使用O_DIRECT?

我尝试过"iostat -x 1",但不确定哪个字段会对我有所帮助。

谢谢。


你在寻找什么方式?在进行IO时?还是在文件打开时? - Andrew Henle
当IO正在进行时。 - cmutex
1个回答

3

您需要获取正在运行的进程的pid。一旦获得pid,您就可以执行

cat /proc/[pid]/fdinfo/<fd number>

您还需要知道被打开文件的fd号码。

它将显示flags字段,该字段是八进制值,显示传递给打开文件描述符fd的标志。您需要检查它以了解是否设置了O_DIRECT

例如,在我的ubuntu机器(X86_64)上,我创建了2个文件- foo1和foo2。

touch foo1 foo2

然后使用O_DIRECT打开foo1文件,不使用O_DIRECT打开foo2文件。以下是程序:

#define _GNU_SOURCE
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main()
{
    printf("%u\n", getpid());

    int fd1 = open("foo1", O_RDWR|O_DIRECT);   //O_DIRECT set

    printf("foo1: %d\n", fd1);
    int fd2 = open("foo2", O_RDWR);         //Normal
    printf("foo2: %d\n", fd2);
    sleep(60);
    close(fd1);
    close(fd2);
    return 0;
}

运行此代码后得到输出结果:

8885
foo1: 3         //O_DIRECT
foo2: 4
8885 is the pid. So I did

cat /proc/8885/fdinfo/3     //O_DIRECT
pos:    0
flags:  0140002
mnt_id: 29 
-------------------------------
cat /proc/8885/fdinfo/4
pos:    0
flags:  0100002
mnt_id: 29

从以上输出结果中,您可以看到对于O_DIRECT,在标志字段中也设置了0040000


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接