Быстрое чтение с HDD для Linux — странное явление

[Извините за путаницу: в оригинальном сообщении в заголовке было «SSD» вместо «HDD», но я выяснил, что я выполнил тесты на HDD случайно, поскольку получал неправильную точку монтирования. На SSD это явление не происходило. Все еще интересно, что это случается для HDD все же.]

Я использую следующий код для чтения в цикле из заданного количества файлов постоянного размера. Все файлы для чтения существуют, и чтение успешно.

Понятно, что изменение размера файла влияет на fMBPerSecondпотому что при чтении файлов, которые меньше размера страницы, все еще читается вся страница. Тем не мение, nNumberOfFiles оказывает влияние на fMBPerSecond а также то, чего я не понимаю. Видимо, это не nNumberOfFiles само по себе, что имеет эффект, но это продукт nNumberOfFiles * nFileSize,

Но почему это должно иметь эффект? Файлы открываются / читаются / закрываются последовательно в цикле.

Я проверял с nFileSize = 65536, При выборе nNumberOfFiles = 10000 (или меньше) я получаю что-то вокруг fMBPerSecond = 500 MB/s, С nNumberOfFiles = 20000 Я получаю что-то вокруг fMBPerSecond = 100 MB/s, что является резкой потерей производительности.

О, и я должен упомянуть, что очищаю кеш диска перед чтением, выполнив:

sudo sync
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'

Любые идеи о том, что происходит здесь за кулисами, будут приветствоваться.

Pedram

void Read(int nFileSize, int nNumberOfFiles)
{
char szFilePath[4096];

unsigned char *pBuffer = new unsigned char[nFileSize];

Helpers::get_timer_value(true);

for (int i = 0; i < nNumberOfFiles; i++)
{
sprintf(szFilePath, "files/test_file_%.4i", i);

int f = open(szFilePath, O_RDONLY);

if (f)
{
if (read(f, pBuffer, (ssize_t) nFileSize) != (ssize_t) nFileSize)
printf("error: could not read file '%s'\n", szFilePath);

close(f);
}
else
{
printf("error: could not open file for reading '%s'\n", szFilePath);
}
}

const unsigned int t = Helpers::get_timer_value();

const float fMiliseconds = float(t) / 1000.0f;
const float fMilisecondsPerFile = fMiliseconds / float(nNumberOfFiles);
const float fBytesPerSecond = 1000.0f / fMilisecondsPerFile * float(nFileSize);
const float fMBPerSecond = fBytesPerSecond / 1024.0f / 1024.0f;

printf("t = %.8f ms / %.8i bytes - %.8f MB/s\n", fMilisecondsPerFile,
nFileSize, fMBPerSecond);

delete [] pBuffer;
}

3

Решение

Существует несколько моделей твердотельных накопителей, особенно более дорогих моделей центров обработки данных, которые сочетают внутренний кэш DRAM с (более медленными) постоянными ячейками NAND. Пока данные, которые вы читаете, помещаются в кэш DRAM, вы получите более быстрый ответ.

1

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

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

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