Как определить, используется ли O_DIRECT? - PullRequest
2 голосов
/ 10 апреля 2019

Я выполняю интенсивный процесс ввода-вывода, который поддерживает O_DIRECT. Есть ли способ узнать, используется ли O_DIRECT во время работы процесса?

Я пробовал "iostat -x 1", но я не уверен, какое поле мне поможет.

Спасибо.

1 Ответ

1 голос
/ 11 апреля 2019

Вам нужно будет получить pid запущенного процесса.Как только вы получите pid, вы можете сделать

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

Вам также нужно будет знать номер fd открываемого файла.

В нем будет отображаться поле флагов.Поле flags представляет собой восьмеричное значение, отображающее флаги, переданные для открытия дескриптора файла fd.Вам нужно проверить его, чтобы узнать, установлен ли O_DIRECT или нет.

Например, на моей машине с Ubuntu (X86_64) я создал 2 файла - foo1 & foo2

touch foo1 foo2

и затем открыл foo1 с O_DIRECT и foo2 без O_DIRECT.Ниже приведена программа

#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также установлен.

...