我正在开发QNX6.5操作系统。QNX6.5支持POSIX API。我正在尝试构建一个用于评估硬盘性能的应用程序。我的应用程序将在用户定义的kB或MB大小的数据缓冲区从开始扇区到结束扇区连续写入硬盘后读取/写/读。所执行的操作(读、写、写后读)取决于用户的选择。每次执行操作时,应用程序将使用ClockCycles()跟踪时间,并计算每个扇区读写操作的速度。
我使用open()调用来像/dev/hd0一样打开设备文件。我使用read()、write() API来执行读/写操作。我的问题是:我没有得到正确的速度的实际磁盘读写。实际上,应用程序经常会返回数据读/写到缓存的速度。当我试图在写操作后立即进行读取时,问题就更加明显了。写入操作后读取操作的速度非常高,为1000~1200 MB/S;而正常读取为50-60MB/S,我使用的是O_SYNC和O_RDWR等开放标志。我还尝试将标志更改为O_DSYNC和O_RSYNC。但是我发现这些标志对应用程序的输出没有任何影响。在Linux中没有类似于O_DIRECT的标志。
我还试图在启动期间禁用硬盘驱动程序中的缓存。在此基础上,获得了MBs级数据大小的读写速度精度。但即便如此,当在立即写入后读取较低的数据大小时,读取速度仍然非常高。我还看到了一些宏,如CACHE_FLUSH、CACHE_INVALIDATE,用于需要DMA传输的驱动程序中。但我不知道如何在应用程序中使用这些宏。有谁能帮我绕过缓存,获得硬盘读写操作的速度?我的硬盘可以格式化也可以不格式化.我对这两种情况都进行了测试。
发布于 2013-02-04 03:41:49
关于你的最后一段,我相信当你对驱动器的读写不足1-2米时,驱动器上的缓存会影响性能,目前硬盘的缓存范围通常在200万到16M之间。
效应
假设您成功地禁用了OS级文件系统缓存。为了最大限度地减少HD缓存的影响,您应该至少将数据写成HD缓存的两倍。
假设HD有200万缓存。
用数据写200 of文件进行测试。编写其中的20个文件(单个文件),并丢弃前10个文件的结果,平均最后10个文件。
对于200 20的读取测试,您将需要20个文件。内容可以是相同的,但它们必须是单独的文件。一次又一次读取相同的小文件(<2m)将使用HD缓存。
你应该去看看Bonnie++。您可能能够在QNX中编译它。
https://unix.stackexchange.com/questions/63593
复制相似问题