C++ FileApi.h 无缓存,如何让磁盘 activity 达到 100%
C++ FileApi.h no caching, how do i get the disk activity to 100%
您好,感谢您审阅我的问题。
我有一个配置有 PCIe RAID0 控制器 x16 线的系统,通过 m.2 连接器连接到 4 个 NVMe Intel 驱动器,每个驱动器 2Tb。
使用 ATTO 磁盘基准测试 应用程序,文件大小设置为 8Gb,块大小设置为 2Mb,同时通过查看任务管理器磁盘 activity 的最大读取速率为 ~7Gb/S百分比在过程中达到峰值100%
我的问题:
我使用 Qt-Creator 和 MinGW-64 位编译器开发了一个简单的 c++ 应用程序,使用 FileApi.h header 打开文件 禁用系统缓存(无缓冲) 并从相同的文件大小 (8Gb) 读取相同的字节量 (2Mb) 结果甚至不接近,速率太慢了 ~1.2Gb/S过程中的磁盘activity约为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;
}
}
感谢任何帮助或建议,我将不胜感激。
在每次迭代中,您都会在内存中分配新的缓冲区。它会导致大量内存流量和性能下降。初始化一次,重复使用:
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 */
。
您好,感谢您审阅我的问题。
我有一个配置有 PCIe RAID0 控制器 x16 线的系统,通过 m.2 连接器连接到 4 个 NVMe Intel 驱动器,每个驱动器 2Tb。 使用 ATTO 磁盘基准测试 应用程序,文件大小设置为 8Gb,块大小设置为 2Mb,同时通过查看任务管理器磁盘 activity 的最大读取速率为 ~7Gb/S百分比在过程中达到峰值100%
我的问题: 我使用 Qt-Creator 和 MinGW-64 位编译器开发了一个简单的 c++ 应用程序,使用 FileApi.h header 打开文件 禁用系统缓存(无缓冲) 并从相同的文件大小 (8Gb) 读取相同的字节量 (2Mb) 结果甚至不接近,速率太慢了 ~1.2Gb/S过程中的磁盘activity约为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;
}
}
感谢任何帮助或建议,我将不胜感激。
在每次迭代中,您都会在内存中分配新的缓冲区。它会导致大量内存流量和性能下降。初始化一次,重复使用:
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 */
。