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

标签 c unix caching io ibm-midrange

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

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

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

我尝试使用O_DIRECT标志,但似乎无法将数据写入文件。这可能与设置正确对齐的缓冲区有关。我还尝试了 posix_fadvise(fd, offset,len, POSIX_FADV_DONTNEED) 系统调用。

我已阅读this类似的问题但尚未找到解决方案。如果有帮助的话我可以提供代码。

最佳答案

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

如果您想确保对文件的小写入有效,您还可以尝试写入另一个大文件(来自同一进程或不同的进程 - 例如,您可以启动一个类似 dd 的进程if=/dev/zero of=myfile.dat bs=4k count=some_large_number) 强制其他数据填充缓存。

另一个“技巧”可能是“咀嚼”系统中的一些(更像是大多数)RAM - 只需分配一大块内存,然后一次写入其中的一小部分 - 例如,一个整数数组,您可以在循环中写入数组的每个第 256 个条目,每次向前移动一步 - 这样,您可以快速遍历所有内存,并且因为您正在连续写入所有内存,内存必须是常驻的。 [我在运行虚拟机测试时使用这种技术来模拟“繁忙”的虚拟机]。

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

关于c - 如何防止 C read() 从缓存中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16365440/

相关文章:

c++ - 操作系统编译时间

c - 通过二维指针数组循环的段错误

c++ - 如何在 addr2line 运行时从偏移量中的 backtrace_symbols() 解析 cpp 符号

linux - 如何列出组在 unix/linux 中有权访问的所有目录

unix - 两个进程如何共享同一个共享库?

javascript - 在 Node 环境中缓存 Contentful 内容

c - 取消引用指针错误

linux - 在别名中设置 printf

java - 如何在浏览器中跳过访问页面的历史记录

linux - 在 Linux 上刷新数据缓存