Назад | Перейти на главную страницу

Медленная передача между внутренними дисками для больших файлов

Я запускаю Ubuntu Server 11.04 (amd64) на машине с двухъядерным процессором 1,6 ГГц, 4 ГБ ОЗУ и 2 дисками SATA по 250 ГБ 7200 (оба 3,0 ГБ / с и только что отформатированные из новой установки). Когда я передаю относительно небольшие файлы (~ 100 МБ) между двумя дисками, я получаю (лучше), чем ожидалось, скорость передачи в диапазоне 300–350 МБ / с. Однако при передаче файла размером 500 МБ скорость передачи составляет около 50 МБ / с, а для файла размером 1 ГБ - около 25 МБ / с.

Вот несколько проведенных мною тестов, демонстрирующих такое поведение:

/disk1 $ dd if=/dev/zero of=output-small.dat bs=1M count=128
 bytes (134 MB) copied, 0.388619 s, 345 MB/s
/disk1 $ dd if=/dev/zero of=output-med.dat bs=1M count=500
524288000 bytes (524 MB) copied, 20.0151 s, 26.2 MB/s
/disk1 $ dd if=/dev/zero of=output-large.dat bs=1M count=1000
1048576000 bytes (1.0 GB) copied, 45.7304 s, 22.9 MB/s

/disk2 $ dd if=/dev/zero of=output-small.dat bs=1M count=128
134217728 bytes (134 MB) copied, 0.372266 s, 361 MB/s
/disk2 $ dd if=/dev/zero of=output-med.dat bs=1M count=500
524288000 bytes (524 MB) copied, 10.0856 s, 52.0 MB/s
/disk2 $ dd if=/dev/zero of=output-large.dat bs=1M count=1000
1048576000 bytes (1.0 GB) copied, 37.1851 s, 28.2 MB/s

$ time cp /disk1/output-small.dat /disk2/test-small.dat
real    0m0.532s
user    0m0.000s
sys     0m0.410s

$ time cp output-med.dat /playpen/test-med.dat
real    0m30.879s
user    0m0.010s
sys     0m3.740s

$ time cp /disk1/output-large.dat /disk2/test-large.dat
real    0m26.643s
user    0m0.010s
sys     0m3.390s

Наконец, при запуске команды pv < /disk1/output-large.dat > /disk2/test.dat, Сначала я вижу отличную скорость передачи, но затем скорость падает до диапазона 1-10 МБ / с, периодически скачивая (намного) выше. Я знаю, что это не особенно полезное измерение производительности диска, поскольку я прохожу через pv, но это соответствует производительности с другими моими тестами.

У меня есть пара вопросов:

Небольшие файлы помещаются в кеш страницы, поэтому тест завершается до того, как материал будет на диске. Попробуйте добавить параметр conv = fsync в dd.

Для файла размером 1 ГБ, возможно, вы столкнетесь с некоторыми побочными эффектами обратной записи, что приведет к меньшей пропускной способности, чем должны быть в состоянии обрабатывать диски. Вы можете попробовать параметры dd iflag = direct и oflag = direct, чтобы обойти кеш страницы и посмотреть, как это повлияет на результат.

Возможно, вы заметили эффект кеширования файлов. Вы можете установить для iflag или oflag значение nocache и повторно протестировать, таким образом вы увидите необработанную скорость, основанную на носителе, а не скорость передачи из буфера в буфер.