Я пытаюсь вручную проверить скорость чтения и записи SSD через NVMe. Текущий метод, который я использую, это монтировать файловую систему на SSD и читать / записывать 20 ГБ в файл в этой файловой системе с размерами блоков 4 КБ, 32 КБ, 128 КБ, 215 КБ, 1 МБ, 64 МБ, 256 МБ и 1 ГБ во время записи. время начала чтения / записи и время завершения. Этот процесс вызывается из скрипта bash. Сценарий bash попытается запустить несколько "приложений", вызывая указанную ниже функцию n раз, каждый раз запуская процесс в фоновом режиме.

while [ $instCnt -le $appInstances ]
    do
    fsrw -w $blocksize /fsmnt/fs${instCnt}/usernumber1/j.j &

Вот функция чтения из исполняемого файла fsrw

bool perform_readop ()
{
// File descriptor.
int32_t fd = -1;

// Function status.
bool status = false;

//Zero read count
int zero_reads = 0;

// Open the file.
fd = open (fname.c_str (), O_RDONLY);

// Verify the file has been opened.
if (fd == -1)
{
    cout << get_datetime_string() << "Read open of " << fname << " failed.  Errno: " 
    << errno << endl;
}
else
{
    // Total bytes read.
    uint64_t rd = 0;

    // Elapsed time.
    struct timeval tv = { 0 };
    get_elapsed_time (&tv);

    // Notify the user that the read test has started.
    cout << get_datetime_string() << "Starting read" << endl;

    while(rd < READ_LIMIT && zero_reads < 10) {
        // Run until it is time for the test to stop.
        ssize_t readsize = read (fd, &buf[0], blocksize);
        if (readsize == -1)
        {
            cout << get_datetime_string << "Read failure.  Errno: " << errno << endl;
            zero_reads = 10;
        }
        else if (readsize == 0)
        {
            cout << get_datetime_string << "Reached EOF." << endl;
            zero_reads++;
        }
        else
        {
            rd += readsize;
        }
    }       
    // Get the elapsed time.
    get_elapsed_time (&tv);

    // Report the number of bytes read.
    cout << get_datetime_string() << "Read " << rd << " bytes in " << tv.tv_sec << "." 
    << tv.tv_usec << " seconds, bytes per second " << bytes_per_second (&tv, rd) << endl;

    // Close the file.
    close (fd);

    // Set the function return status when all read operations have
    // been successful.
    if (zero_reads < 10)
    {
        status = true;
    }
}

  return status;

}

Я перенес этот метод из работы, ранее проделанной другими, и я действительно не уверен, является ли это допустимым методом проверки пропускной способности к SSD. Результаты теста, особенно для операции чтения, не являются реалистичными; они намного выше, чем ожидалось. Fio предполагает, что пропускная способность для чтения и записи должна составлять около 500 МБ / с, но в этом тесте скорость записи составляет 1 ГБ +/ с, а скорость чтения - около 8 ГБ / с.

1 ответ1

0

Непонятно, каков ваш вопрос - вы, кажется, спрашиваете «почему мои результаты нереалистичны (и почему они быстрее, чем у fio?)». Вы не включаете свою работу с fio, поэтому об этом ничего нельзя сказать :-( Я также не знаю, что делает программа fsrw. Я сделаю удар в том, что осталось:

Допустим, у нас есть только ваша программа и ядро (это упрощение). Ваша программа выдает ошибки, и ядро говорит: «Да, я их получил», как только оно помещает их в очередь во внутреннем буфере, что позволяет вашей программе продолжать работу. Только если этот внутренний буфер ядра слишком переполнен, ваша программа будет блокироваться при записи, пока не будет места для ее принятия. Это означает, что если программа записывает "небольшие" объемы данных в тихой системе, она никогда не будет ждать, пока диск будет обслуживать операции ввода-вывода - мы отделили ее от скорости диска с помощью буфера. Очевидно, что эта иллюзия может длиться так долго и зависит от того, насколько большой буфер, насколько он заполнен и т.д.

Кроме того, если имеется неиспользуемая оперативная память, ядро может использовать ее для кэширования частей дисков. Когда я записываю данные на диск, если есть место, данные, которые я пишу, будут не только буферизироваться и сбрасываться позже, но и сохраняться после завершения очистки на случай, если это понадобится позже. Вы можете увидеть этот эффект, написав файл, а затем проверив его бесплатно, и, как правило, вы увидите, что объем оперативной памяти уменьшился, поскольку части этого файла хранятся в кеше. Если я в конечном итоге получаю его из кеша Linux, то скорость, которую я достигаю, обычно близка к скорости оперативной памяти, а диск остается нетронутым (если вы знаете, как использовать iostat, вы заметите, что он не сообщает о каком-либо / большом количестве дисковых операций ввода / вывода). О, когда это происходит).

Так:

  • Обычный ввод-вывод записи может быть буферизован
  • Обычный ввод / вывод может быть кэширован
  • Чтение кэшированных данных НАМНОГО быстрее, чем чтение некэшированных данных
  • Ваша программа чтения восприимчива к предыдущему пункту

Обратите внимание, что это упрощение. Я не рассмотрел такие вещи, как readahead или взаимодействия с файловой системой, почему вы fsync и так далее.

Кроме того, блоки, когда ядро отправляет их на диск, могут отличаться от размера, который ваша программа отправляет. Вы можете отправить ядру 16 x 4 Кбайт непрерывных записей, но ядро может объединить их и отправить одну запись 64 Кбайт на диск. Обычно это полезно в реальной жизни, но вы должны знать об этом при проведении синтетического бенчмаркинга.

Таким образом, я думаю, что ваши результаты "нереалистичны", потому что вы получаете огромную выгоду от буферизации и кеширования Linux. Если ваша реальная рабочая нагрузка действительно такая, то скорость вашего SSD не является вашим узким местом, и более быстрые диски вам не сильно помогают (настолько реалистично это сложное слово)! Вы можете получить числа, близкие к цифрам самого SSD, убедившись, что размеры вашего набора данных во много (как минимум, в три) раза больше, чем размер общей памяти в вашей системе, или выполнив ввод / вывод, который не может быть буферизован или кэширован. , Я не могу сказать, почему вы работаете медленнее, чем fio, потому что любой ответ на этот вопрос очень специфичен для fio, и никакая работа не была включена в вопрос.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .