Почему несколько процессов замедляются?

Не уверен, что это лучший заголовок для этого вопроса, но вот.

Через python/Qt я запустил несколько процессов исполняемого файла. Каждый процесс записывает большой файл (~ 20 ГБ) на диск кусками. Я обнаружил, что первый процесс, который запускается, всегда завершается последним и продолжается намного дольше, чем другие процессы (несмотря на то, что у него такой же объем данных для записи).

Мониторы производительности показывают, что процесс по-прежнему использует ожидаемый объем ОЗУ (~ 1 ГБ), но дисковая активность процесса снизилась до минимума.

Почему это произошло? Как будто первый запущенный процесс каким-то образом блокирует доступ к диску другими процессами, а затем не восстанавливается после завершения других процессов...

Может ли ОС (Windows) быть причиной этого? Что я могу сделать, чтобы облегчить это?


person jramm    schedule 21.07.2015    source источник
comment
Я бы посмотрел на скорость непрерывной записи вашего носителя и сравнил время сохранения такого объема данных. жесткие диски могут быстро принимать короткие пакеты данных благодаря своему внутреннему кешу, но для больших файлов (последовательная запись) потребуется как минимум определенное минимальное количество времени. Я скептически отношусь к тому, что когда-либо можно будет улучшить производительность записи с помощью многопроцессорной записи на диск. Мне казалось, что накладные расходы на несколько процессов и переключение между файловыми потоками для записи, производительность вместо этого будет намного хуже.   -  person Aaron    schedule 21.07.2015


Ответы (2)


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

Прежде чем думать об оптимизации вашей программы, вы должны тщательно проанализировать, что заставляет ее работать (субъективно) медленно - узкое место.

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

Когда программа ограничена вводом-выводом, традиционные методы распараллеливания на одной машине (потоки, несколько процессов) хуже, чем бесполезны — они на самом деле снижают производительность, особенно если вы имеете дело с вращающимся диском. Это происходит потому, что если у вас есть более одного процесса, обращающегося к диску в разных местах, головка жесткого диска должна искать между теми.

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


С учетом сказанного, что можно сделать, чтобы повысить производительность ввода-вывода?

  • Получите лучшие диски (или SSD)
  • Получить больше дисков (по одному на процесс)
  • Получить больше машин
person loopbackbee    schedule 21.07.2015

Нет никаких гарантий относительно справедливости планирования ввода-вывода. То, что вы описываете, кажется довольно простым: планировщик ввода-вывода, намеренно или нет, дает толчок новым процессам. Поскольку ваш диск отключен, порядок завершения процессов не находится под вашим контролем. Скорее всего, вы тратите много дисковой полосы на поиск из-за параллельного доступа из нескольких процессов.

TL;DR: Ваши ожидания необоснованны. Когда ввод-вывод и особенно система виртуальной памяти перегружены, может случиться что угодно. Так оно и есть.

person Kuba hasn't forgotten Monica    schedule 21.07.2015