C ++ Пропускная способность ввода-вывода в сети Windows

Я пытаюсь написать приложение для Visual C ++ 2008, работающее на Win2012, с возможностью асинхронного чтения / записи файлов из / в 2 разных группы дисков на NAS через один интерфейс Gbps (и переключатель Gbps).

Одновременное ручное копирование файлов (из сетевого хранилища на локальный жесткий диск и с локального жесткого диска в сетевое хранилище) показывает, что с нашей системой, сетевым интерфейсом, коммутатором и NAS мы можем выполнять пропускную способность 1 Гбит / с (отправлять 950 Мбит / с, получать 950). Mbps).

Но используя мое приложение Visual C ++, которое имеет два потока (boost), один для операций чтения, другой для операций записи (в отдельном файле), у нас есть что-то вроде 350 Мбит / с для записи и 650 Мбит / с для чтения.

При остановке устройства чтения или записи скорость отправки или получения достигает 950 Мбит / с.

Я использую stdio fread / fwrite для чтения и записи фрагментов данных размером 2 МБ.

Я тестирую много вещей, чтобы понять это, что я мог бы объяснить позже, но на данный момент, может быть, есть что-то очевидное, что может объяснить, почему я не могу получить желаемую пропускную способность?

Ниже приведен мой код для воспроизведения поведения, нет взаимодействия между потоками, поэтому операции ввода-вывода не должны блокировать друг друга. Я проверяю пропускную способность с помощью диспетчера задач.

#include <stdio.h>
#include <windows.h>
#include <boost/thread.hpp>

#define INPUT_CHUNK_SIZE 2700000
#define OUTPUT_CHUNK_SIZE 2700000
#define OUTPUT_FILE_DESIRED_SIZE 1000000000

boost::thread* readerProcessThread = NULL;
boost::thread* writerProcessThread = NULL;
bool readerEnded = false;
bool writerEnded = false;
bool stop = false;
const char* inputFileName = "\\\\NASIP\\input\\inputfile.bin";
const char* outputFileName = "\\\\NASIP\\output\\outputfile.bin";

void readerThread()
{
FILE *myFile = fopen(inputFileName, "rb");
char *inputBuffer = new char[INPUT_CHUNK_SIZE];

if(myFile)
{
while(!stop && !feof(myFile))
{
size_t readBytes = fread(inputBuffer, 1, INPUT_CHUNK_SIZE, myFile);
}

fclose(myFile);
}
delete[] inputBuffer;

readerEnded = true;
stop = (writerEnded || !writerProcessThread);
}

void writerThread()
{
char *outputBuffer = new char[OUTPUT_CHUNK_SIZE];
memset(outputBuffer, 0, OUTPUT_CHUNK_SIZE);
FILE *myFile = fopen(outputFileName, "wb");
unsigned long long writtenBytesTotal = 0;
size_t writtenBytes = OUTPUT_CHUNK_SIZE;

if(myFile)
{
while(!stop && writtenBytesTotal < OUTPUT_FILE_DESIRED_SIZE && writtenBytes == OUTPUT_CHUNK_SIZE)
{
size_t writtenBytes = fwrite(outputBuffer, 1, OUTPUT_CHUNK_SIZE, myFile);
writtenBytesTotal += (unsigned long long)writtenBytes;
}
fclose(myFile);
}

writerEnded = true;
stop = (readerEnded || !readerProcessThread);
}

int main(int argc, char * argv[])
{
readerProcessThread = new boost::thread(&readerThread);
writerProcessThread = new boost::thread(&writerThread);
if(readerProcessThread && writerProcessThread)
{
while(!stop)
{
Sleep(1000);
}
}
stop = true;
if (readerProcessThread)
{
readerProcessThread->join();
delete readerProcessThread;
readerProcessThread = NULL;
}

if (writerProcessThread)
{
writerProcessThread->join();
delete writerProcessThread;
writerProcessThread = NULL;
}
return 0;
}

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]