Как ограничить загрузку процессора в Ubuntu Linux

Здесь будут размещаться ссылки и отзывы на интересные публикации по Linux

Модераторы: Olej, vikos

Правила форума
Запрещается помещать сообщения, не имеющие отношения к обсуждаемой статье. Все такие сообщения будут удаляться непосредствено после обнаружения.
Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Как ограничить загрузку процессора в Ubuntu Linux

Непрочитанное сообщение Olej » 18 мар 2019, 00:46

Вообще то, меня команда cpulimit интересовала именно применительно к однопоточным приложениям, которые в Linux составляют 95%, или около того, от их общего числа.

А если вовлекать в рассмотрение параллельность, то нужно сюда подключать (viewtopic.php?f=10&t=4285#p12981) команды taskset, афинити маску, возможно, команду chrt и т.д.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Как ограничить загрузку процессора в Ubuntu Linux

Непрочитанное сообщение Olej » 18 мар 2019, 00:51

roms писал(а):в гостевой системе у меня 1 процессор (виртуальный)
Кстати, в какой виртуальной машине, под каким гипервизором?
От этого может тоже меняться наблюдаемая картина.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Как ограничить загрузку процессора в Ubuntu Linux

Непрочитанное сообщение Olej » 18 мар 2019, 01:10

roms писал(а): Два потока всего, "натравливаю" cpulimit на родительский, он его и ограничивает, дочерний как был 100% загрузка, так и остается.
Относительно параллельности на сегодня появилось такое разнообразие, в зависимости от того, на каком языке (в какой языковой системе) подготовить тесты:
- параллельные процессы, fork(), C/C++;
- нативные потоки ядра, pthread_t, C/C++;
- параллельные потоки Python с их глобальной блокировкой...
- лёгки потоки (go-рутины) языка Go, которые во многом реализуются без поддержки ядра - см.: Планирование параллельного исполнения в Go

И в зависимости от того, какую параллельность вы будете использовать, видимые результаты могут радикально различаться!

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Как ограничить загрузку процессора в Ubuntu Linux

Непрочитанное сообщение Olej » 18 мар 2019, 09:49

roms писал(а):Пишут:
Все дочерние процессы и потоки указанного процесса будут использовать один и тот же процент загрузки ЦП
похоже это не так, к сожалению.
Действует только на тот процесс(поток ?) PID которого указан опцией p
Возможно, тут нужно поиграться с опцией -m :

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/AplitSoft/FaceDL/cloud/HISTORY$ cpulimit -h
CPUlimit version 2.4
Usage: cpulimit TARGET [OPTIONS...] [-- PROGRAM]
   TARGET must be exactly one of these:
      -p, --pid=N        pid of the process
      -e, --exe=FILE     name of the executable program file
                         The -e option only works when
                         cpulimit is run with admin rights.
      -P, --path=PATH    absolute path name of the
                         executable program file
   OPTIONS
      -b  --background   run in background
      -f  --foreground   launch target process in foreground and wait for it to exit
      -c  --cpu=N        override the detection of CPUs on the machine.
      -l, --limit=N      percentage of cpu allowed from 1 up.
                         Usually 1 - 200, but can be higher
                         on multi-core CPUs (mandatory)
      -m, --monitor-forks  Watch children/forks of the target process
      -q, --quiet        run in quiet mode (only print errors).
      -k, --kill         kill processes going over their limit
                         instead of just throttling them.
      -r, --restore      Restore processes after they have
                         been killed. Works with the -k flag.
      -s, --signal=SIG   Send this signal to the watched process when cpulimit exits.
                         Signal should be specificed as a number or 
                         SIGTERM, SIGCONT, SIGSTOP, etc. SIGCONT is the default.
      -v, --verbose      show control statistics
      -z, --lazy         exit if there is no suitable target process,
                         or if it dies
          --             This is the final CPUlimit option. All following
                         options are for another program we will launch.
      -h, --help         display this help and exit

roms
Активист
Сообщения: 11
Зарегистрирован: 14 мар 2019, 11:27
Контактная информация:

Re: Как ограничить загрузку процессора в Ubuntu Linux

Непрочитанное сообщение roms » 18 мар 2019, 17:09

Olej писал(а):
roms писал(а):в гостевой системе у меня 1 процессор (виртуальный)
Кстати, в какой виртуальной машине, под каким гипервизором?
От этого может тоже меняться наблюдаемая картина.
VirtualBox Версия 5.1.38_Ubuntu r122592
Хост - Ubuntu 16.04 x86_64 ( процессор: Pentium G2020 )
Гостевая - Ubuntu 16.04 i686 ( 1 процессор в настройках, паравиртуализация KVM)
nproc предсказуемо выдает 2 на хосте и 1 на гостевой
============
попробовал свой примерчик на реальной машинке(та же, что выше выступала хостом)
результат тот же
"родитель" ограничивается нормально, "потомок" - 100% загрузка
"потомок" выполняется на другом ядре, явно видно разную загрузку по ядрам
что подтверждает Вашу мысль:
А 2-е ... соображение: ... с большой вероятностью в системе ничем не загруженной (а при тестировании это зачастую так) новый процесс распределиться на свободный процессор, не тот на котором выполняется родитель, и этот новый процессор не находится под контролем cpulimit.

roms
Активист
Сообщения: 11
Зарегистрирован: 14 мар 2019, 11:27
Контактная информация:

Re: Как ограничить загрузку процессора в Ubuntu Linux

Непрочитанное сообщение roms » 18 мар 2019, 18:03

Вообще то, на 1 процессоре вот такой цикл должен бы вообще отбивать у вас всякую активность:
Код:
while(1){};
то же опасался )
тем не менее тормозов практически нет, видимо планировщик оставляет какой то резерв для других задач

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Как ограничить загрузку процессора в Ubuntu Linux

Непрочитанное сообщение Olej » 19 мар 2019, 00:51

roms писал(а): то же опасался )
тем не менее тормозов практически нет, видимо планировщик оставляет какой то резерв для других задач
Относительно параллельности и загрузки процессоров (ядер) я вам такую вот интересную штуку нарисую:

Код: Выделить всё

#include <sys/time.h>
#include <unistd.h>
#include <iostream>

using namespace std;

void delay( ulong msec ) {                   // пассивная задержка в миллисекундах
   struct timespec pause = { 0, 0 };
   pause.tv_sec  = msec / 1000;
   pause.tv_nsec = ( msec % 1000 ) * 1000000L;
   nanosleep( &pause, NULL );
}

static pthread_spinlock_t loc; 

int rept = 10, msec = 100;

bool bspin = true;

static void* block_func( void* par ) {       // функция потока
   for( int i = 0; i < rept; i++ ) {
      if( bspin ) pthread_spin_lock ( &loc );
      delay( msec );
      if( bspin ) pthread_spin_unlock ( &loc );
   }
   return NULL;
}

int main( int argc, char *argv[] ) {
   int nthr = 5;
   if( argc > 1 && atoi( argv[ 1 ] ) != 0 ) nthr = atoi( argv[ 1 ] );
   bspin = nthr > 0;
   nthr = abs( nthr ); 
   cout << getpid() << ": число потоков = " << nthr << endl;
   pthread_spin_init( &loc, 1 );
   pthread_t *h = new pthread_t[ nthr ];
   struct timeval tb, tf;
   gettimeofday( &tb, NULL );
   cout << "wait...";
   for( int i = 0; i < nthr; i++ )           // параллельные потоки
      if( pthread_create( h + i, NULL, &block_func, NULL ) != 0 ) {
         cout << "ошибка создания потока " << i << endl;         
         return EXIT_FAILURE;
      }
   for( int i = 0; i < nthr; i++ ) 
      pthread_join( h[ i ], NULL );
   gettimeofday( &tf, NULL );
   cout << "\r";
   delete [] h;
   timersub( &tf, &tb, &tf );
   long interv = tf.tv_sec * 1000L + tf.tv_usec / 1000L +
                 ( tf.tv_usec % 1000 > 500 ? 1 : 0 );
   cout << "интервал выполнения: " << nthr << " x " << rept << " x " 
        << msec << " = " << interv << " миллисекунд" << endl;
   pthread_spin_destroy( &loc );
}
Очень интересно:

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/SMP_block$ ./block 30
8623: число потоков = 30
интервал выполнения: 30 x 10 x 100 = 30020 миллисекунд
И если одновременно посмотрим:

Код: Выделить всё

olej@ACER:~$ top -p 8623
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
%Cpu(s): 99,2 us,  0,8 sy,  0,0 ni,  0,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
MiB Mem :  11888,2 total,   1465,5 free,   6084,4 used,   4338,4 buff/cache
MiB Swap:  12165,0 total,  12162,2 free,      2,8 used.   4372,9 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                                                  
 8623 olej      20   0  210532   3588   3184 S 190,7   0,0   0:54.81 block                                                                                                    
В системе (в моём тесте) 2 процессора, и они загружены на 200%, т.е. полностью. Если в вашей системе будет 16 процессоров, то задача эта создаст загрузку 1600% ! ;-)
Что здесь происходит? Когда 1 поток, захватив спин-блокировку выполняет пассивное ожидание nanosleep(), все остальные N-1 потоков тупо крутятся активно на спин-блокировке, ожидая её освобождения.
А если вот так:

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/SMP_block$ ./block -30
8659: число потоков = 30
интервал выполнения: 30 x 10 x 100 = 1003 миллисекунд

Здесь (- значение параметра) захват спин-блокировки не происходит, и задача завершается ровно в N (по числу потоков) раз быстрее - все потоки выполняются параллельно.
Вложения
block.cc
(1.78 КБ) 136 скачиваний

roms
Активист
Сообщения: 11
Зарегистрирован: 14 мар 2019, 11:27
Контактная информация:

Re: Как ограничить загрузку процессора в Ubuntu Linux

Непрочитанное сообщение roms » 19 мар 2019, 07:53

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

Ответить

Вернуться в «Публикации, книги и обсуждения»

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и 6 гостей