Многозадачность в Linux с несколькими процессорами - PullRequest
0 голосов
/ 10 октября 2011

Я чувствую, что мой вопрос довольно простой, но я не смог найти связанный с этим вопрос.

Мне нужно запустить программу несколько тысяч раз (каждый раз вводить по-разному), и в настоящее время это выполняется сценарием оболочки. Машина работает под управлением Ubuntu и имеет 8 процессоров (как показано cat /proc/cpuinfo). Используя top, я вижу, что используется только 1 процессор. Чтобы ускорить процесс, я хочу использовать все 8 процессоров. Я знаю, что могу запустить программу в фоновом режиме, а затем вызвать ее снова (и действительно, top показывает, что в этом случае используются 2 ЦП), поэтому я могу изменить свой сценарий оболочки для вызова программы группами по 8. Мой вопрос в том, является ли это рекомендуемым способом использования всех процессоров, или есть другой, несколько более «чистый» способ?

Ответы [ 2 ]

1 голос
/ 10 октября 2011

Вы можете использовать привязку к процессору для явного определения процессора для процессов.

http://www.cyberciti.biz/tips/setting-processor-affinity-certain-task-or-process.html

Однако, если каждый процесс выполняется на процессоре (как и должно быть, ядроубедитесь, что все работает максимально эффективно), затем просто отключите n процессов (в вашем случае 8) или заставьте свой скрипт оболочки выяснить, что такое n, чтобы ваш скрипт был немного более устойчивым, или сделайте егопараметр командной строки), и пусть ядро ​​сделает это за вас.Каждый раз, когда процесс заканчивается, запускайте другой процесс, пока не закончите.

1 голос
/ 10 октября 2011

Вопрос слишком расплывчат.

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

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

Учитывая, что у вас есть 8 ЦП, и при условии, что единственным ограниченным ресурсом является ЦП, вы не хотите, чтобы в работе одновременно выполнялось более 8 потоков. Таким образом, проблема заключается в том, как вы планируете работу, чтобы обеспечить оптимальное использование 8 ядер. Разделив работу на 8 сценариев и выполнив их одновременно, вы первоначально увидите, что все 8 сценариев работают одновременно - но вполне вероятно, что сценарии завершатся в разное время в зависимости от характера работы.

Таким образом, если вы действительно хотите оптимально использовать аппаратное обеспечение, это означает запуск 8 процессов в качестве демонов, предпочтительно с каждым процессом с установленным сродством к процессору, который подается из очереди сообщений. Но действительно ли стоит кодировать все это, если вы не собираетесь запускать это регулярно? Также может быть быстрее запустить всего 7 и сохранить ЦП для обработки очереди и других требований, предъявляемых к коробке.

...