C++ FileApi.h 没有缓存,我如何让磁盘活动达到 100%

Posted

技术标签:

【中文标题】C++ FileApi.h 没有缓存,我如何让磁盘活动达到 100%【英文标题】:C++ FileApi.h no caching, how do i get the disk activity to 100% 【发布时间】:2020-02-12 11:53:42 【问题描述】:

您好,感谢您查看我的问题。

我有一个配置有 PCIe RAID0 控制器 x16 线的系统,通过 m.2 连接器连接到 4 个 NVMe Intel 驱动器,每个驱动器 2Tb。 使用 ATTO Disk Benchmark 应用程序,文件大小设置为 8Gb,块大小设置为 2Mb,最大读取速率约为 7Gb/S,同时通过查看任务管理器,磁盘活动百分比处于峰值 100%在这个过程中。

我的问题: 我使用 Qt-Creator 和 MinGW-64bit 编译器开发了一个简单的 c++ 应用程序,使用 FileApi.h 标头打开一个带有 系统缓存禁用(无缓冲) 的文件并读取相同的文件大小 (8Gb) 的相同字节量 (2Mb) 结果甚至不接近,速率如此缓慢 ~1.2Gb/S 并且过程中的磁盘活动约为 23%

这是我的代码:

        #include <fileapi.h>

        void main()
        
        HANDLE dataFile;

            dataFile = CreateFileA("File.bin", GENERIC_READ, 0, nullptr,
           OPEN_EXISTING,  FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, nullptr);
            FlushFileBuffers(dataFile);
            if (dataFile == INVALID_HANDLE_VALUE)
                return ;

        //Start reading 3000 times from the file
            int counter = 0;
            while(counter < 3000)
                char * buffer = new char [pktSize*sizeof(int)];
                unsigned long read;
                ReadFile(dataFile, buffer, 2097152  /*2 Megabytes */, &read, nullptr);
                counter+=1;
                delete[] buffer;
            
        

感谢任何帮助或建议,并将非常感激。

【问题讨论】:

【参考方案1】:

在每次迭代中,您都会在内存中分配新的缓冲区。它会导致大量内存流量和性能下降。初始化一次并重复使用:

char * buffer = new char [pktSize*sizeof(int)];
while(counter < 3000)

  unsigned long read;
  ReadFile(dataFile, buffer, 2097152  /*2 Megabytes */, &read, nullptr);
  counter+=1;

delete[] buffer;

您还应该确保缓冲区大小pktSize*sizeof(int) 大于2097152 /*2 Megabytes */

【讨论】:

以上是关于C++ FileApi.h 没有缓存,我如何让磁盘活动达到 100%的主要内容,如果未能解决你的问题,请参考以下文章

刷新磁盘写缓存

如何模拟慢速和无读缓存磁盘驱动器

如何在 C# 中清空/刷新 Windows READ 磁盘缓存?

Glide:在内存缓存中预加载图像(有或没有磁盘缓存)

C++写文件再次运行程序后,之前保存的文件的数据就没有了,如何让数永久保存?

如何更改 Okhttp 中的默认缓存策略?