Не могу достичь скорости дд - PullRequest
4 голосов
/ 13 августа 2010

Я пишу код C с некоторыми ограничениями в реальном времени. Я проверил скорость записи на диск с помощью dd:

dd if = / dev / zero = = dev / sdb bs = 32K count = 32768 oflag = direct

Записывает 1 ГБ нулей в / dev / sdb с размером блока 32 КБ

Я достигаю около 103 МБ / с с этим

Теперь я программно делаю нечто подобное:

open("/dev/sdb",O_WRONLY|O_CREAT|O_DIRECT|O_TRUNC, 0666);

Я получаю значение метки времени запись из буфера 32K в / dev / sdb 10000 раз (в цикле for) получить другое значение метки времени немного увеличьте число, чтобы получить скорость в МБ / с, и она составляет около 49 МБ / с

Почему я не могу достичь той же скорости, что и дд? Strace показывает ту же команду открытия, которую я использую.

Ответы [ 2 ]

5 голосов
/ 13 августа 2010

Проверьте, что делает системные вызовы dd, не только открытие, но и последующие read s и writes.Использование правильных размеров буфера может существенно повлиять на этот тип больших копий.Обратите внимание, что /dev/zero не является хорошим тестом для бенчмаркинга, если ваша конечная цель - копирование с диска на диск.

Если вы не можете сопоставить скорость dd, сопоставив ее системный вызов для системыпозвони ... ну, читай источник.

0 голосов
/ 13 августа 2010

Я оставляю часть о сопоставлении системных вызовов с кем-то еще.Этот ответ о части буферизации.

Попробуйте сравнить размер используемого буфера.Поэкспериментируйте с диапазоном значений.

При изучении Java я написал простой клон «copy», а затем попытался сопоставить его скорость.Поскольку код делал побайтное чтение / запись, размер буфера был тем, что действительно имело значение.Я не буферизовал его сам, но просил чтение, чтобы получить куски заданного размера.Чем больше блок, тем быстрее он пошел - до определенного уровня.

Что касается использования размера блока 32 КБ, помните, что ОС все еще использует отдельные буферы ввода-вывода для процессов пользовательского режима.Даже если вы делаете что-то с конкретным оборудованием, то есть вы пишете драйвер для устройства с некоторыми физическими ограничениями, например, привод CD-RW с размерами секторов, размер блока - это только часть истории.В ОС все еще будет свой буфер.

...