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