【发布时间】:2013-05-03 18:31:47
【问题描述】:
我有一个程序用于在 RAID 配置中运行多个磁盘单元。 1 个进程同步(O_SYNC)使用write() 将随机数据写入文件。然后它将目录的名称放入共享内存队列中,其中第二个进程正在等待队列有条目以使用read() 将数据读回内存。
我似乎无法克服的问题是,当第二个进程尝试将数据读回内存时,没有一个磁盘单元显示读取访问。该程序有代码来检查读回的数据是否等于写入磁盘的代码,并且数据总是匹配的。
我的问题是,如何使操作系统(IBM i)在将数据写入磁盘时不缓冲数据,以便read() 系统调用访问磁盘上的数据而不是缓存中的数据?我正在做简单的吞吐量计算,read() 操作总是比write 操作快 10 倍以上。
我尝试使用O_DIRECT 标志,但似乎无法将数据写入文件。它可能与设置正确的对齐缓冲区有关。我也尝试过posix_fadvise(fd, offset,len, POSIX_FADV_DONTNEED) 系统调用。
我已经阅读了this 类似的问题,但没有找到解决方案。如果有帮助,我可以提供代码。
【问题讨论】:
-
您可以关闭用户态文件缓存,例如在 C 中使用 setvbuf()。内核模式缓存可能需要重置内核参数,或运行创建大量内存块的代码,以便内核刷新其所有缓存。您所说的(IBM i)是指 IBM itanium AIX 吗?或者是什么? PS:直接 io 并不总是意味着没有缓存。系统可以直接写入,然后将数据保存在缓存中。操作系统设计人员非常重视使用内存来绕过 io 瓶颈。
-
@jimmcnamara - IBM i 是过去的 OS/400。它有一个名为 PASE for i 的特定环境,用于运行类 UNIX 软件。
标签: c unix caching io ibm-midrange