我正在运行一个支持O_DIRECT的IO密集型进程。有没有办法判断进程运行时是否正在使用O_DIRECT?
我尝试过“ 1./X.shape[0])*np.matmul(Xm.T,Xm)
”,但不确定哪个字段对我有帮助。
谢谢。
答案 0 :(得分:1)
您将必须获取正在运行的进程的pid。收到pid后,就可以
cat /proc/[pid]/fdinfo/<fd number>
您还必须知道要打开的文件的文件编号。
它将显示标志字段。标志字段是八进制值,显示传递来打开文件描述符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
中也已设置。