Как определить, используется ли O_DIRECT?

#io #linux-kernel

#io #linux-ядро

Вопрос:

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

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

Спасибо.

Комментарии:

1. Какие средства вы ищете? Во время выполнения ввода-вывода? Когда файл открыт?

2. Во время выполнения ввода-вывода.

Ответ №1:

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

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

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

Он покажет поле flags. Поле 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("%un", getpid());

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

    printf("foo1: %dn", fd1);
    int fd2 = open("foo2", O_RDWR);         //Normal
    printf("foo2: %dn", 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 также установлено.