写入后从磁盘读取而不是缓存

时间:2014-08-07 16:17:19

标签: c linux

这是我尝试使用C程序在Linux主机上执行的任务:

将随机数据写入磁盘,调用fysnc()将数据刷新到磁盘,然后读回写入from the disk的内容以确保磁盘控制器正确写入数据。我遇到的问题是读取似乎是由服务器端缓存而不是设备本身来回答的。这是我已经尝试过的:

 1. O_DIRECT (a gigantic pain in the butt, abandoned)
 2. posix_fadvise(fd,0,0,POSIX_FADV_DONTNEED)
 3. posix_fadvise(fd,0,0,POSIX_FADV_NOREUSE)
 4. O_SYNC
 5. O_ASYNC

在每种情况下,iostat都会显示0 rrqm/s和数千个写入请求。我可能是一个非常不知情的Linux用户,但我相信如果rrqm / s中没有显示IO,则操作系统缓存而不是设备本身会回答读取。

"为什么不使用iozone或iometer,或任何数十亿已经给磁盘带来压力的工具?"嗯,老实说,如果HP-UX的危险对HP-UX以外的任何事情都有效,我会这么做,但是没有其他任何事情可以做到什么危险,所以我自己做了。

2 个答案:

答案 0 :(得分:2)

您需要执行以下shell命令的等效操作:

sync                               # Instruct all data to get flushed to disk
echo 3 > /proc/sys/vm/drop_caches  # Instruct VM system to clear caches

然后再次尝试阅读该文件。

从C中做到这一点的一种方法是近似的:

sync();
int fd = open("/proc/sys/vm/drop_caches", O_WRONLY|O_TRUNC)
write(fd, "3\n");
close(fd);

答案 1 :(得分:1)

您不应该通过file system来测试磁盘。您应该阅读并撰写raw分区(例如/dev/sdc5

在大多数当前的Linux系统和硬件上,磁盘都有SMART接口。您应该使用它,请参阅smartmontools并研究其源代码。 (我想有一些ioctl(2)与此相关。)