Распределить рабочую нагрузку между различными процессорами

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

По этому я обнаружил, что если я спрошу top, программа, которую я запускаю, показывает загрузку процессора на 100%, в то время как при открытии System monitor загрузка процессора составляет только ~25% в Processes Вкладка. В дополнение Resources На вкладке "Системный монитор" отображаются 4 процессора, использование которых для каждого из них изменяется от ~5 до ~100%:

Исход lscpu является:

@C:~$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    2
Core(s) per socket:    2
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 142
Model name:            Intel(R) Core(TM) i5-7200U CPU @2.50GHz
Stepping:              9
CPU MHz:               3099.937
CPU max MHz:           3100,0000
CPU min MHz:           400,0000
BogoMIPS:              5423.81
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              3072K
NUMA node0 CPU(s):     0-3

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

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

2 ответа

Решение

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

Короче говоря: нет. Программа однопоточная.

Топ может показать использование процессора двумя способами: насыщенность на процессор или доля от общего количества. Если у вас четырехъядерная система, сверху может отображаться режим Irix:

Также для многопроцессорных сред, если режим Irix выключен, top будет работать в режиме Solaris, где загрузка ЦП задачи будет разделена на общее количество процессоров. Вы можете переключать режимы Irix/Solaris с помощью интерактивной команды "I".

Вы можете переключить это, нажав I сверху. Поскольку у вас четыре ядра процессора, использование делится на четыре, и вы увидите 25%. Если вы включите режим Irix, он покажет 100%.

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

В Linux есть планировщик, который будет распределять запущенные потоки по разным процессорам / ядрам.

100% против 25% загрузки процессора

В соответствии с lscpuу вас есть четыре ядра в вашем процессоре:

On-line CPU(s) list:   0-3

top использует 100% на ядро, так что если у вас четырехъядерный процессор, это 400%. Вы используете одно ядро ​​полностью, так что это 100% из 400%. Системный монитор использует 100% для всего (или, возможно, для каждого фактического процессора, я не уверен). Одно ядро ​​- это четверть из четырех доступных ядер, поэтому в системном мониторе оно показало 25% использования.

Значительное замедление при использовании одного ядра

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

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

Изменение приоритета задачи

Ты можешь использовать nice с высоким значением, таким как 15, чтобы задача уступила место другим задачам, которым требуется процессор:

nice -n 15 the-program its-arguments

Замедление задачи

Вы можете попробовать оба niceв программу до высокого значения, например 15, и с помощью cpulimit программа (в cpulimit Пакет APT), чтобы уменьшить загрузку процессора, пока он разрешен к запуску.

Пример замедления the-program its-arguments использование процессора до 60% при значении 15:

cpulimit -q -z -l 60 -- nice -n 15 the-program its-arguments

Использование нескольких ядер

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

Один из них - запускать процесс четыре раза каждый с одной четвертой рабочей нагрузки, если есть какой-либо способ указать рабочую нагрузку при его запуске. Одна возможность, полезная в некоторых обстоятельствах, использует xargs -n ## -P 4 command обрабатывать ## элементы по одному на каждом ядре, используя 4 ядра.

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

Есть и другие возможности.

Сочетание использования нескольких ядер с замедлением задачи и установкой значения добротности

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

Другие вопросы по тегам