Расчет пропускной способности жесткого диска

Мое приложение создает файл размером 2 ГБ, и ему нужно выбрать самый быстрый диск в системе с достаточным пространством. Я пытаюсь рассчитать пропускную способность, создав файл, установив длину, а затем последовательно записав в него данные следующим образом:

FileInfo file = null;
var drives = DriveInfo.GetDrives();
var stats = new List<DriveInfoStatistics>();

foreach (var drive in drives)
{
    do
    {
        file = new FileInfo(Path.Combine(drive.RootDirectory.FullName, Guid.NewGuid().ToString("D") + ".tmp"));
    }
    while (file.Exists);

    try
    {
        using (var stream = file.Open(FileMode.CreateNew, FileAccess.Write, FileShare.None))
        {
            var seconds = 10;
            var frameRate = 120F;
            var bytesWritten = 0L;
            var bytesPerPixel = 1;
            var watch = new Stopwatch();
            var videoSize = new Size(1328, 1048);
            var buffer = new byte [(int) (videoSize.Width * videoSize.Height * bytesPerPixel)];

            stream.SetLength((long) (videoSize.Width * videoSize.Height * bytesPerPixel * frameRate * seconds));

            watch.Restart();
            for (int i = 0; i < seconds; i++)
            {
                for (int j = 0; j < frameRate; j++)
                {
                    stream.Write(buffer, 0, buffer.Length);
                    bytesWritten += buffer.Length;
                }
            }
            watch.Stop();

            stats.Add(new DriveInfoStatistics(drive, bytesWritten / watch.Elapsed.TotalSeconds));
        }
    }
    catch
    {
    }
    finally
    {
        file.Refresh();
        if (file.Exists) { try { file.Delete(); } finally { file.Refresh(); } }
    }
}

if (stats.Count == 0)
{
    throw (new Exception("No suitable drives were found."));
}
else
{
    stats.Sort((x, y) => y.DataTransferRate.CompareTo(x.DataTransferRate));

    message
        = "The following drives are suitable candidates (best to worst):"
        + Environment.NewLine
        + Environment.NewLine
        + string.Join(Environment.NewLine, stats.ConvertAll<string>(s => (s.DriveInfo.RootDirectory.FullName.Substring(0, 2).ToUpper() + " " + ConversionUtilities.ToIsuBytesNotation(s.DataTransferRate) + "ps")))
        + Environment.NewLine
        + Environment.NewLine
        + "Test results may vary based on other applications accessing the drives."
        + Environment.NewLine
        + Environment.NewLine
        + "Try the test with the system configured as it would be in production."
        ;

    MessageBox.Show(message);
}

Результаты, которые я получаю, не имеют смысла:

Рабочий стол

D: 4.15 GBps // SSD.
F: 4.09 GBps // HDD (5200 RPM).
E: 4.06 GBps // HDD (7500 RPM).
C: 4.03 GBps // SSD.
H: 2.45 GBps // Ram Disk!!!
  • Прежде всего, SSD и HDD расположены слишком близко друг к другу.
  • Во-вторых, скорость намного выше, чем я ожидал.
  • В-третьих, Ram Disk (созданный с помощью RAMDisk), похоже, имеет самую низкую пропускную способность. На практике Ram Disk намного превосходит другие при записи реальных видеоданных.

НОУТБУК

E: 981.24 MBps // Ram Disk.
C: 100.17 MBps // HDD (5200 RPM).
D: 055.94 MBps // HDD (5200 RPM).

Результаты того же кода на моем ноутбуке для разработки более правдоподобны.

Что-то не так с кодом выше? Если нет, то как бы вы объяснили пропускную способность 4 Гбит/с для SSD, в то время как для Ram Disk максимальная скорость составляет 2,5 Гбит/с?

Я понимаю, что есть много факторов, влияющих на пропускную способность, и что программное обеспечение для бенчмаркинга очень сложное. Однако в моем случае запись видеофайла размером 2 ГБ со скоростью 120 кадров в секунду без потери кадров имеет решающее значение, и приведенный выше код должен предоставить пользователю быструю и грязную рекомендацию о том, какой диск использовать для хранения временных видеокадров. Позже кадры подвергаются постобработке и перекодируются в видео MP4 размером всего несколько мегабайт.

Наконец, я попробовал приведенный выше код вместе с Contig.exe из Sysinternals, чтобы обеспечить непрерывную компоновку для повышения производительности жесткого диска. Однако я не заметил разницы в производительности, которая указывает на то, что файл был недостаточно фрагментирован с самого начала (при создании).


person Raheel Khan    schedule 03.08.2015    source источник


Ответы (1)


Если программа записывает данные на диск, происходит довольно много разных вещей:

Сначала данные записываются в буфер ОЗУ, и операция подтверждается записывающей программе задолго до того, как данные будут переданы на следующие этапы.

Затем данные записываются на контроллер жесткого диска, который может выполнять собственное кэширование.

Затем данные записываются на жесткий диск, который, в свою очередь, может выполнять собственное кэширование.

Очень сложно измерить реальную пропускную способность с помощью программного обеспечения высокого уровня.

Один из вариантов: Напишите очень большой файл, который, как ожидается, будет намного больше, чем любые файлы в операционной системе/контроллере/жестком диске. Это дает вам хорошую оценку устойчивой скорости записи.

person DrKoch    schedule 03.08.2015
comment
Я подумал, что будет проще получить приблизительное представление об относительной скорости. В моем случае важна не фактическая скорость. Я не нашел способа определить, был ли данный диск HDD, SSD или Ram Disk. Этой информации было бы достаточно без необходимости выполнять настоящие тесты записи. - person Raheel Khan; 03.08.2015
comment
Не забывайте обо всем, что могло происходить: антивирус, шифрование, сжатие. - person BugFinder; 03.08.2015
comment
Я мало читал по этому поводу, но -disk-is-ssd-without-writing" title="Какой самый простой способ в c Sharp проверить, является ли жесткий диск ssd без записи"> stackoverflow.com/questions/13726522/ обсуждает решение для определения если диск ssd или hdd. - person prettyvoid; 03.08.2015
comment
@BugFinder: я уже исключил все формы транскодирования, сжатия, обработки «на лету» в пользу скорости последовательной записи. Мы просто берем необработанные данные из аппаратного буфера камеры и записываем их напрямую в двоичном формате без какого-либо преобразования. - person Raheel Khan; 08.08.2015
comment
@prettyvoid: Спасибо. Кажется, что метод в связанном вопросе не является надежным, но он ближе всего к тому, чтобы дать разумную рекомендацию. Я до сих пор понятия не имею, ошибаюсь ли я со своими собственными тестами записи (код, включенный в вопрос). - person Raheel Khan; 08.08.2015