Оптимизация массивных записей на диск - PullRequest
7 голосов
/ 09 декабря 2011

У меня есть приложение C (VStudio 2010, win7 64bit), работающее на машине с двумя чипами xeon, что означает 12 физических и 24 логических ядра и 192 гигабайта оперативной памяти. РЕДАКТИРОВАТЬ: ОС Win7 (то есть, Windows 7, 64-разрядная версия).

Приложение имеет 24 потока (каждый поток имеет свое логическое ядро), выполняющих вычисления и заполняющих различные части массивной структуры Си. Структура, когда все потоки завершены (и все потоки идеально сбалансированы, поэтому они завершаются одновременно), составляет около 60 гигабайт.

(У меня есть контроль над настройкой оборудования, поэтому я собираюсь использовать 6 дисков по 2 ТБ с RAID 0, что означает, что физические ограничения на запись будут примерно в 6 раз выше средней скорости последовательной записи, или примерно 2 гигабайта в секунду. )

Какой самый эффективный способ получить это на диск? Очевидно, что время ввода / вывода превзойдет время вычислений. Из моих исследований по этой теме кажется, что write () (в отличие от fwrite ()) - путь. Но какие еще оптимизации я могу сделать на стороне программного обеспечения, с точки зрения установки размеров буфера и т. Д. Будет ли mmap более эффективным?

Ответы [ 2 ]

8 голосов
/ 09 декабря 2011

mmap () или boost mmap - почти всегда лучший подход. ОС умнее вас, пусть беспокоится о том что кешировать!

Вы не сказали, какая ОС, но в Linux madvise или эквивалентные подсказки могут действительно повысить производительность.

6 голосов
/ 09 декабря 2011

Трудно судить о лучшем для вашей ситуации.

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

Тогда у вас есть выбор между mmap и write.Это также зависит от операционной системы, которую вы используете.На Unix я бы попробовал и mmap, и pwrite.pwrite полезен, потому что каждый из ваших потоков может записывать в файл в нужной позиции файла, не борясь за смещения файла.

mmap может быть хорошо, потому что вместо копирования в файловый кеш ваши потоки будут записывать непосредственно в файловый кеш.Вероятно, 60 ГБ слишком велики для mmap всего файла, поэтому каждому потоку, вероятно, понадобится свое собственное окно mmap для файла, который он может перемещать.

В Windows вы, вероятно, захотите использовать перекрывающийся асинхронный ввод-вывод,Это можно сделать только с помощью вызовов Win32 API.

...