Ускоряет ли многопроцессорная передача файлов по сравнению с многопоточностью - PullRequest
0 голосов
/ 28 сентября 2018

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

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

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

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Краткий ответ : Как правило, это действительно зависит от вашей рабочей нагрузки. Если вы серьезно относитесь к производительности, просьба сообщить подробности.например, сохраняете ли вы изображения на диске, имеют ли они размеры> 1 ГБ или нет, и т. д.

Примечание. В общем случае, если это не является критически важным, оба способа приемлемы, поскольку мы можем легко переключаться междумногопоточные и многопроцессорные реализации, использующие многопоточность. Многопоточность и многопроцессорность. Процесс.

еще несколько комментариев Кажется, что узким местом будет не CPU, а IO.

Для многопроцессорных / многопоточныхИз-за GIL и / или вашей реализации у нас может быть разница в производительности.Вы можете реализовать оба способа и попробовать.Кстати, IMHO, это не будет сильно отличаться.Я думаю, что асинхронный ввод-вывод против блокирующего ввода-вывода будет иметь большее влияние.

0 голосов
/ 29 сентября 2018

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

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

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

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

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

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

Обычно:

Многопоточность - проще в использовании в одном приложении, поскольку все потоки совместно используют виртуальное адресное пространство одного процесса и могут легко взаимодействовать друг с другом.С другой стороны, один процесс имеет ограниченный размер виртуального адресного пространства (менее 4 ГБ на 32-битном компьютере).

Многопроцессорность - сложнее использовать в одном приложении (необходимость межпроцессного взаимодействия), но большемасштабируемость и надежность (если происходит сбой процесса передачи файлов), + больше виртуального адресного пространства для использования.

0 голосов
/ 28 сентября 2018

Если следующие предположения верны:

  1. Ваш скрипт просто получает данные из сети и записывает эти данные на диск (более или менее) дословно, то есть он не выполняет дорогостоящей обработкина данных
  2. Ваш сценарий выполняется на современном процессоре с типичным современным сетевым оборудованием (например, гигабитный Ethernet или более медленный)
  3. Процедуры загрузки вашего сценария не являются крайне неэффективными (например, вы получаете разумно-размер кусков данных, а не просто 1 байт за раз или что-то глупое в этом роде)

... тогда вряд ли ваша скорость загрузки будет ограничена ЦП.Скорее всего, узким местом будет либо пропускная способность сети, либо пропускная способность дискового ввода-вывода.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...