如何防止C read()从缓存中读取

如何防止C read()从缓存中读取,c,unix,caching,io,ibm-midrange,C,Unix,Caching,Io,Ibm Midrange,我有一个程序,用于在raid配置中运行多个磁盘单元。1进程同步(O_SYNC)使用write()将随机数据写入文件。然后,它将目录名放入共享内存队列中,第二个进程正在等待队列中有条目,以便使用read()将数据读回内存 我似乎无法克服的问题是,当第二个进程尝试将数据读回内存时,没有一个磁盘单元显示读取访问。程序有代码来检查读回的数据是否等于写入磁盘的代码,并且数据始终匹配 我的问题是,如何使操作系统(IBM I)在写入磁盘时不缓冲数据,以便read()系统调用访问磁盘上的数据而不是缓存中的数据?

我有一个程序,用于在raid配置中运行多个磁盘单元。1进程同步(
O_SYNC
)使用
write()
将随机数据写入文件。然后,它将目录名放入共享内存队列中,第二个进程正在等待队列中有条目,以便使用
read()
将数据读回内存

我似乎无法克服的问题是,当第二个进程尝试将数据读回内存时,没有一个磁盘单元显示读取访问。程序有代码来检查读回的数据是否等于写入磁盘的代码,并且数据始终匹配

我的问题是,如何使操作系统(IBM I)在写入磁盘时不缓冲数据,以便
read()
系统调用访问磁盘上的数据而不是缓存中的数据?我正在进行简单的吞吐量计算,
read()
操作总是比
write
操作快10多倍

我曾尝试使用
O_DIRECT
标志,但似乎无法获取要写入文件的数据。这可能与设置正确的对齐缓冲区有关。我还尝试了
posix\u fadvise(fd、offset、len、posix\u FADV\u DONTNEED)
系统调用

我读过类似的问题,但还没有找到解决办法。如果有帮助,我可以提供代码

…在raid配置中使用多个磁盘单元。。。怎样IBM i不允许程序访问硬件。如何将I/O定向到任何特定的物理磁盘

回答:写入/读取操作是针对IFS并行完成的,因此流文件管理器将选择目标磁盘。通过有足够的线程读/写,可以提高SYSBASE或IASP的繁忙程度

…没有一个磁盘单元显示读取访问。没有?除非您在受限状态下运行系统上的唯一作业,否则磁盘上将存在其他任务的读取活动。系统是否划分为多个LPAR?多个ASP?我建议您可能正在监视此程序未写入的磁盘,因为IBMi处理的是物理I/O,而不是程序

回答我想没有一点夸张-我知道哪些磁盘属于SYSBASE,并且这些磁盘没有被许多读取请求锁定。我只是想为一个不熟悉IBM I的观众做一个概括。在下面的图片中,您将看到写请求提高了%的忙度,但读请求不是,即使它们针对的是相同的文件

…如何使操作系统(IBM I)在写入磁盘时不缓冲数据。。。使用内存不足的主存储池最大化分页,写入大量数据块,以确保系统和磁盘控制器缓存溢出,并使用繁忙的机器,以便其他任务也需要磁盘I/O。

…在raid配置中使用多个磁盘单元。。。怎样IBM i不允许程序访问硬件。如何将I/O定向到任何特定的物理磁盘

回答:写入/读取操作是针对IFS并行完成的,因此流文件管理器将选择目标磁盘。通过有足够的线程读/写,可以提高SYSBASE或IASP的繁忙程度

…没有一个磁盘单元显示读取访问。没有?除非您在受限状态下运行系统上的唯一作业,否则磁盘上将存在其他任务的读取活动。系统是否划分为多个LPAR?多个ASP?我建议您可能正在监视此程序未写入的磁盘,因为IBMi处理的是物理I/O,而不是程序

回答我想没有一点夸张-我知道哪些磁盘属于SYSBASE,并且这些磁盘没有被许多读取请求锁定。我只是想为一个不熟悉IBM I的观众做一个概括。在下面的图片中,您将看到写请求提高了%的忙度,但读请求不是,即使它们针对的是相同的文件


…如何使操作系统(IBM I)在写入磁盘时不缓冲数据。。。使用内存不足的主存储池来最大化分页,写入大量数据块,以确保系统和磁盘控制器缓存溢出,并使用繁忙的机器,以便其他任务也需要磁盘I/O。

我的想法是,如果写入足够的数据,那么根本就没有足够的内存来缓存它,因此,一些数据必须写入磁盘

如果要确保对文件的小写入有效,还可以尝试写入另一个大文件(来自同一进程或不同进程-例如,如果=/dev/zero of=myfile.dat bs=4k count=some\u large\u number),强制其他数据填充缓存

另一个“诀窍”可能是“咀嚼”系统中的一些(更像大多数)RAM—只需分配一大块内存,然后一次写入其中的一小部分—例如,一个整数数组,在循环中写入数组的每256个条目,每次向前移动一步—这样,你快速浏览所有的内存,因为你一直在写,所以内存必须是常驻的。[我使用此技术在运行VM测试时模拟“繁忙”的虚拟机]

另一个选项当然是在OS/文件系统驱动程序中屏蔽缓存系统本身,但我会非常担心这样做-它几乎肯定会将系统减慢到缓慢爬行的速度,除非有一个现有的选项来禁用它,否则您可能会发现很难准确/正确/可靠地执行此操作。

我的想法是,如果您