2

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

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

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

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

我已经阅读了这个类似的问题,但没有找到解决方案。如果有帮助,我可以提供代码。

4

2 回答 2

2

...在 RAID 配置中运行多个磁盘单元... 如何?IBM i 不允许程序访问硬件。您如何将 I/O 定向到任何特定的物理磁盘?

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

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

回答我想它们都不是有点夸张——我知道哪些磁盘属于 SYSBASE 并且这些磁盘不是许多读取请求的目标。我只是想为不熟悉 IBM i 的观众进行概括。在下图中,您将看到写入请求正在推动 % 繁忙度,但即使它们针对相同的文件,读取请求也不会。

在此处输入图像描述

...我怎样才能让操作系统(IBM i)在写入磁盘时不缓冲数据... 使用内存不足的主存储池来最大化分页,写入巨大的数据块以保证系统和磁盘控制器缓存溢出并使用繁忙的机器,因此其他任务也需要磁盘 I/O。

于 2013-05-03T19:50:41.767 回答
2

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

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

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

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

于 2013-05-03T20:38:32.943 回答