我正在使用 QNX 6.5 操作系统。QNX 6.5 支持 POSIX API。我正在尝试构建一个用于评估硬盘性能的应用程序。我的应用程序将连续地从起始扇区到结束扇区将用户定义的数据缓冲区(以 kB 或 MB 为单位)读/写/读后写到硬盘中。执行的操作(读取、写入、写后读取)取决于用户的选择。每次执行操作时,应用程序都会跟踪使用时间ClockCycles()
并计算每个扇区读/写操作的速度。
我正在使用open()
call 打开设备文件,例如/dev/hd0
.我正在使用read()
, write()
API 来执行读/写操作。我的问题是:我没有获得实际磁盘读/写的正确速度。实际上应用程序经常返回数据读/写到缓存的速度。当我尝试在写入操作后立即执行读取时,问题更加明显。写操作之后的读操作速度非常高,约为1000-1200 MB/S;而正常读取需要 50-60 MB/S。我正在使用像O_SYNC
和 之类的开放标志O_RDWR
。我还尝试将标志更改为O_DSYNC
和O_RSYNC
。但我发现这些标志对应用程序的输出没有影响。O_DIRECT
Linux 中没有类似的标志。
我还尝试在启动过程中禁用硬盘驱动器中的缓存。然后我得到了 MB 量级数据大小的读/写速度精度。但即便如此,当立即写入后读取较小的数据大小时,读取速度仍然非常高。我还看到过一些宏,例如CACHE_FLUSH
,CACHE_INVALIDATE
用于需要 DMA 传输的驱动程序。但我不知道如何在应用程序中使用这些宏。谁能帮助我如何绕过缓存并提高硬盘读/写操作的速度?我的硬盘可以格式化也可以未格式化。我已经对这两种情况进行了测试。
答案1
高清缓存
关于您的最后一段,我相信当您向驱动器读取/写入少于 1-2M 的数据时,性能会受到驱动器上缓存的影响,在当今的 HD 中,缓存的范围通常为 2M 到 16M。
最小化 HD Cache 的影响
假设您已成功禁用操作系统级文件系统缓存。为了最大限度地减少HD缓存的影响,您应该写入至少两倍于HD缓存的数据。
假设硬盘有2M缓存。
以200kb文件的数据写入进行测试。写入20个(单个文件),并丢弃前10个文件的结果并平均最后10s。
对于 200kb 读取测试,您将需要 20 个文件。内容可以相同,但必须是单独的文件。多次读取同一个小文件(<2M)将使用HD缓存。
类似程序
你应该检查一下邦妮++。您也许可以在 QNX 中编译它。