Непонятно, в чем ваш вопрос - вы, кажется, спрашиваете «почему мои результаты нереалистичны (и почему они быстрее, чем у fio?)» Вы не включаете свою работу с fio, поэтому об этом ничего не скажешь :-( Я также не знаю, что делает программа fsrw. Я попробую сделать то, что осталось:
Допустим, у нас есть только ваша программа и ядро (это упрощение). Ваша программа выдает ошибки, и ядро говорит: «Да, я их получил», как только оно помещает их в очередь во внутреннем буфере, что позволяет вашей программе продолжать работу. Только если этот внутренний буфер ядра слишком переполнен, ваша программа будет блокироваться при записи, пока не будет места для ее принятия. Это означает, что если программа записывает «небольшие» объемы данных в тихой системе, она никогда не будет ждать, пока диск будет обслуживать операции ввода-вывода - мы отделили ее от скорости диска с помощью буфера. Очевидно, что эта иллюзия может длиться так долго и зависит от того, насколько большой буфер, насколько он заполнен и т. Д.
Кроме того, если имеется неиспользуемая оперативная память, ядро может использовать ее для кэширования частей дисков. Когда я записываю данные на диск, если есть место, данные, которые я пишу, будут не только буферизироваться и сбрасываться позже, но и сохраняться после завершения очистки на случай, если это потребуется позже. Вы можете увидеть этот эффект, написав файл, а затем проверив его бесплатно, и, как правило, вы увидите, что объем оперативной памяти уменьшился, поскольку части этого файла хранятся в кеше. Если я в конечном итоге получаю его из кеша Linux, то скорость, которую я достигаю, обычно близка к скорости оперативной памяти, а диск остается нетронутым (если вы знаете, как использовать iostat, вы заметите, что он не сообщает о каком-либо / большом количестве дисковых операций ввода / вывода). О, когда это происходит).
Так:
- Нормальная запись ввода / вывода может быть буферизована
- Обычный ввод / вывод может быть кэширован
- Чтение кэшированных данных НАМНОГО быстрее, чем чтение некэшированных данных
- Ваша программа чтения восприимчива к предыдущему пункту
Обратите внимание, что это упрощение. Я не рассмотрел такие вещи, как readahead или взаимодействия с файловой системой, почему вы fsync
и так далее.
Кроме того, блоки, когда ядро отправляет их на диск, могут отличаться от размера, который ваша программа отправляет. Вы можете отправить ядру 16 x 4 Кбайт непрерывных записей, но ядро может объединить их и отправить одну запись 64 Кбайт на диск. Обычно это полезно в реальной жизни, но вы должны знать об этом при проведении синтетического бенчмаркинга.
Таким образом, я думаю, что ваши результаты "нереалистичны", потому что вы получаете огромную выгоду от буферизации и кеширования Linux. Если ваша реальная рабочая нагрузка действительно такая, то скорость вашего SSD не является вашим узким местом, и более быстрые диски вам не сильно помогают (настолько реалистично это сложное слово)! Вы можете получить числа, близкие к цифрам самого SSD, убедившись, что размеры вашего набора данных во много (как минимум, в три) раза больше, чем размер общей памяти в вашей системе, или выполнив ввод / вывод, который не может быть буферизован или кэширован., Я не могу сказать, почему вы работаете медленнее, чем fio, потому что любой ответ на этот вопрос очень специфичен для fio, и никакая работа не была включена в вопрос.