Каковы лучшие практики для интенсивного чтения и записи данных на HD? - PullRequest
8 голосов
/ 25 января 2011

Я занимаюсь разработкой приложения на C ++ (работающего в системе Linux), которое очень интенсивно читает файлы журналов и записывает полученные результаты на диск.Хотелось бы узнать, каковы оптимальные методы оптимизации таких приложений:

  • Какие настройки ОС повышают производительность?
  • Какие шаблоны программирования повышают пропускную способность ввода-вывода?
  • Является ли предварительная обработка данных (преобразование в двоичные, сжатие данных и т. Д.) Полезной мерой?
  • Помогает ли фрагментация / буферизация данных в производительности?
  • Какие аппаратные возможности должныЯ в курсе?
  • Какие методы лучше всего подходят для профилирования и измерения производительности в этих приложениях?
  • (выскажите здесь проблему, которую мне не хватает)

Является лиесть хорошее прочтение, где я мог бы получить основы этого, чтобы я мог адаптировать существующее ноу-хау к моей проблеме?

Спасибо

Ответы [ 5 ]

6 голосов
/ 25 января 2011

Сжатие, безусловно, может сильно помочь и намного проще, чем настройка ОС. Проверьте поддержку gzip и bzip2 в библиотеке Boost.IOStreams . Однако это сказывается на процессоре.

Измерение заданий такого типа начинается с команды time. Если системное время очень велико по сравнению с пользовательским временем, то ваша программа тратит много времени на системные вызовы. Если время настенных («настоящих») часов велико по сравнению с системным и пользовательским временем, оно ожидает диск или сеть. Команда top, показывающая значительно меньшую загрузку ЦП для программы, также является признаком узкого места ввода-вывода.

3 голосов
/ 25 января 2011

1) Проверьте размер сектора вашего диска.
2) Убедитесь, что диск дефрагментирован.
3) Считайте данные, которые являются «локальными», до последних выполненных вами операций чтения, чтобы улучшить локальность кэша (кэширование выполняется операционной системой, и многие жесткие диски также имеют встроенный кэш).
4) Пишите данные непрерывно.

Для повышения производительности записи кэшируйте блоки данных в памяти до тех пор, пока вы не достигнете кратного размера сектора, затем инициируйте асинхронную запись на диск. Не перезаписывайте данные, которые в настоящее время записываются, пока вы не можете быть уверены, что данные были записаны (т.е. синхронизировать запись). Здесь может помочь двойная или тройная буферизация.

Для лучшей производительности чтения вы можете удвоить чтение буфера. Допустим, вы кешируете 16K блоков при чтении. Считать 1-е 16К с диска в блок 1. Инициировать асинхронное чтение 2-го 16К в блок 2. Начать работу с блоком 1. Когда вы закончите с блоком 1, синхронизируйте чтение блока 2 и начните асинхронное чтение в блок 1 3-й блок 16K в блок 1. Теперь работайте с блоком 2. Когда закончите синхронизацию чтения 3-го блока 16K, инициируйте асинхронное чтение 4-го 16K в блок 2 и работайте с блоком 1. Промойте и повторяйте, пока не обработаете все данные.

Как уже говорилось, чем меньше данных вы должны прочитать, тем меньше времени будет потрачено на чтение с диска, поэтому вполне может стоить прочитать сжатые данные и потратить время ЦП на расширение каждого блока при чтении. Равное сжатие блока перед записью сэкономит ваше дисковое время. Будет ли это выигрыш или нет, будет зависеть от того, насколько интенсивна загрузка вашего процессора.

Также, если обработка блоков является асимметричной (то есть обработка блока 1 может занять в 3 раза больше времени, чем обработка блока 2), тогда рассмотрите тройную или более буферизацию для чтения.

2 голосов
/ 25 января 2011

Как было указано здесь, вы должны проверить размер блока.Вы делаете это с функциями семьи stat.В struct stat эта информация находится в поле st_blksize.

Вторым является функция posix_fadvise (), которая дает советы ОС по подкачке страниц.Вы сообщаете системе, как собираетесь использовать файл (или даже фрагмент файла).Вы найдете больше на странице руководства.

2 голосов
/ 25 января 2011

Получите информацию о томе, с которого вы будете писать / читать, и создайте буферы, соответствующие характеристикам тома.например, 10 * clusterSize.

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

0 голосов
/ 25 января 2011

В Windows используйте CreateFile () с FILE_FLAG_SEQUENTIAL_SCAN и / или FILE_FLAG_NO_BUFFERING вместо fopen () - по крайней мере, для записи этого возврата немедленно, а не для ожидания сброса данных на диск

...