управление процессами и приоритетами

Инструменты для управления и диагностики системы

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

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

управление процессами и приоритетами

Непрочитанное сообщение Olej » 15 июл 2015, 12:57

Подсказали:

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

time timeout 1s ./a.out
Команда timeout.

Очень полезно при программировании и отладке, когда есть риск зависших программ, да ещё таких, которые отбивают или перехватывают реакцию на сигналы.

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

olej@nvidia ~/2015_WORK/in.WORK/FWall/disfw/cliserv $ time timeout 3s ./tcpserv -vv -p50000 
listening on the TCP port 50000

real	0m3.002s
user	0m0.000s
sys	0m0.000s
Это показан запуск моего тестового TCP сервера (который конечно сам никогда не завершится).
Для проверки выбран запуск именно программы, запускаемой с разнообразными своими параметрами.

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

управление процессами и приоритетами

Непрочитанное сообщение Olej » 15 июл 2015, 13:22

Команда chrt, которая позволяет либо а). изменить режим уже выполняющейся программы, либо б). запустить программу в режиме диспетчирования реального времени и определить приоритет реального времени, см.:

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

[Olej@modules ~]$ chrt --help

chrt - manipulate real-time attributes of a process

Set policy:
  chrt [options] [<policy>] <priority> [-p <pid> | <command> [<arg>...]]
...
О режиме реального времени в стандартном Linux, как я знаю из обсуждений, многие не знают вообще.
И не путать - это не имеет никакого отношения к действительно реальному времени, в Linux это понимается как: "делать так, как это делают в системах реального времени".

Это информация о приоритетах в системе вообще:

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

[Olej@modules ~]$ chrt --max
SCHED_OTHER min/max priority    : 0/0
SCHED_FIFO min/max priority     : 1/99
SCHED_RR min/max priority       : 1/99
SCHED_BATCH min/max priority    : 0/0
SCHED_IDLE min/max priority     : 0/0
Вот так запускается любая программа в режиме диспетчирования реального времени:

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

[Olej@modules ~]$ sudo chrt -r 50 bash
[sudo] password for Olej:
...
[root@modules Olej]# ps
  PID TTY          TIME CMD
 3068 pts/2    00:00:00 sudo
 3074 pts/2    00:00:00 bash
 3100 pts/2    00:00:00 ps
Естественно, что такое изменение режима и приоритета допустимо только для root (иначе развалить работу всей системы ничего не стоит ;-) ).

А вот так изменяется режим уже запущенной ранее программы и контролируется её режим:

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

[root@modules Olej]# chrt -p 3074
pid 3074's current scheduling policy: SCHED_RR
pid 3074's current scheduling priority: 50

[root@modules Olej]# chrt -r -p 5 3074

[root@modules Olej]# chrt -p 3074
pid 3074's current scheduling policy: SCHED_RR
pid 3074's current scheduling priority: 5

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

управление процессами и приоритетами

Непрочитанное сообщение Olej » 15 июл 2015, 13:39

Управление и контроль аффинити маской процесса (битовой маской тех процессоров в SMP, которые позволено задействовать процессу).
Ещё лет 5 назад эта команда мало кого интересовала, на сегодня она актуальна, потому как на каждом рабочем столе стоит компьютер с несколькими ядрами.
Команда taskset:

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

bash-4.2$ taskset
Usage: taskset [options] [mask | cpu-list] [pid|cmd [args...]]

Options:
 -a, --all-tasks         operate on all the tasks (threads) for a given pid
 -p, --pid               operate on existing given pid
 -c, --cpu-list          display and specify cpus in list format
 -h, --help              display this help
 -V, --version           output version information
...
Вот проверка аффинити маски процесса и как она выглядит (а заодно как быстро проверить сколько у вас процессоров):

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

[Olej@modules affinity]$ cat /proc/cpuinfo | grep processor | wc -l
4

[Olej@modules affinity]$ uname -a
Linux modules.localdomain 3.15.4-200.fc20.x86_64 #1 SMP Mon Jul 7 14:24:41 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

[Olej@modules affinity]$ ps
  PID TTY          TIME CMD
 3562 pts/10   00:00:00 bash
 5070 pts/10   00:00:00 ps
    
[Olej@modules affinity]$ taskset -p 3562
pid 3562's current affinity mask: f

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

-bash-4.2$ cat /proc/cpuinfo | grep processor | wc -l
2

bash-4.2$ uname -a
Linux notebook.localdomain 3.14.8-200.fc20.i686 #1 SMP Mon Jun 16 22:36:56 UTC 2014 i686 i686 i386 GNU/Linux
       
-bash-4.2$ ps
  PID TTY          TIME CMD
 2139 pts/1    00:00:00 bash
 2234 pts/1    00:00:00 ps

-bash-4.2$ taskset -p 2139
pid 2139's current affinity mask: 3
Как легко видеть, это получено на разных процессорах.

Вот как можно одну и ту же задачу (многопоточную ... что за задача не важно) не только на указанном числе процессоров (1, 2, 3, 4), но и выборочно указать на каких процессорах разрешить выполнение задачи:

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

olej@atom:~/2014-WORK/GlobalLogic/BOOK.Tools.org/examples.others.DRAFT/affinity$ taskset -c 0-3 ./tspeed -t4 -n60 -a100
threads number = 4, repeat slices in thread 15 times : full time was 02 sec. 208 msec.

olej@atom:~/2014-WORK/GlobalLogic/BOOK.Tools.org/examples.others.DRAFT/affinity$ taskset -c 0 ./tspeed -t4 -n60 -a100
threads number = 4, repeat slices in thread 15 times : full time was 05 sec. 963 msec.

olej@atom:~/2014-WORK/GlobalLogic/BOOK.Tools.org/examples.others.DRAFT/affinity$ taskset -c 1 ./tspeed -t4 -n60 -a100
threads number = 4, repeat slices in thread 15 times : full time was 05 sec. 950 msec.

olej@atom:~/2014-WORK/GlobalLogic/BOOK.Tools.org/examples.others.DRAFT/affinity$ taskset -c 2 ./tspeed -t4 -n60 -a100
threads number = 4, repeat slices in thread 15 times : full time was 05 sec. 939 msec.

olej@atom:~/2014-WORK/GlobalLogic/BOOK.Tools.org/examples.others.DRAFT/affinity$ taskset -c 3 ./tspeed -t4 -n60 -a100
threads number = 4, repeat slices in thread 15 times : full time was 05 sec. 970 msec.

olej@atom:~/2014-WORK/GlobalLogic/BOOK.Tools.org/examples.others.DRAFT/affinity$ taskset -c 0-1 ./tspeed -t4 -n60 -a100
threads number = 4, repeat slices in thread 15 times : full time was 02 sec. 967 msec.

olej@atom:~/2014-WORK/GlobalLogic/BOOK.Tools.org/examples.others.DRAFT/affinity$ taskset -c 0,2 ./tspeed -t4 -n60 -a100
threads number = 4, repeat slices in thread 15 times : full time was 04 sec. 405 msec.

olej@atom:~/2014-WORK/GlobalLogic/BOOK.Tools.org/examples.others.DRAFT/affinity$ taskset -c 0,1 ./tspeed -t4 -n60 -a100
threads number = 4, repeat slices in thread 15 times : full time was 02 sec. 987 msec.

olej@atom:~/2014-WORK/GlobalLogic/BOOK.Tools.org/examples.others.DRAFT/affinity$ taskset -c 0,3 ./tspeed -t4 -n60 -a100
threads number = 4, repeat slices in thread 15 times : full time was 02 sec. 956 msec.
Точно так же, как этой командой можно запускать новый процесс, также можно изменить разрешение на использование процессоров для уже ранее выполняющегося процесса по его PID (здесь похоже на chrt).

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

управление процессами и приоритетами

Непрочитанное сообщение Olej » 20 фев 2019, 12:07

Olej писал(а):

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

time timeout 1s ./a.out
Команда timeout.

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

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

olej@ACER:~/2019_WORK/own.WORK/AplitSoft/FaceDL$ timeout 5s ls
common.py  HISTORY  linaro  linaro.1  linaro.2	linaro.3  MLfaces  Movie1.mkv  Movie2.mkv  Movie3.mkv  Nfaces

olej@ACER:~/2019_WORK/own.WORK/AplitSoft/FaceDL$ echo $?
0
А это - ping на несуществующий IP:

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

olej@ACER:~/2019_WORK/own.WORK/AplitSoft/FaceDL$ timeout 3s ping 10.0.30.68 > /dev/null

olej@ACER:~/2019_WORK/own.WORK/AplitSoft/FaceDL$ echo $?
124

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

управление процессами и приоритетами

Непрочитанное сообщение Olej » 13 мар 2019, 13:58

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

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

olej@ACER:~/2019_WORK/own.WORK/AplitSoft/OrgDoc/time.report.01$ aptitude search cpulimit
p   cpulimit                                                        - ограничение использования центрального процессора                        

olej@ACER:~/2019_WORK/own.WORK/AplitSoft/OrgDoc/time.report.01$ sudo apt install cpulimit
[sudo] пароль для olej: 
Чтение списков пакетов… Готово
Построение дерева зависимостей       
Чтение информации о состоянии… Готово
Следующие НОВЫЕ пакеты будут установлены:
  cpulimit
Обновлено 0 пакетов, установлено 1 новых пакетов, для удаления отмечено 0 пакетов, и 6 пакетов не обновлено.
Необходимо скачать 20,9 kB архивов.
После данной операции объём занятого дискового пространства возрастёт на 47,1 kB.
Пол:1 http://deb.debian.org/debian buster/main amd64 cpulimit amd64 2.5-1 [20,9 kB]
Получено 20,9 kB за 0с (66,1 kB/s)
Выбор ранее не выбранного пакета cpulimit.
(Чтение базы данных … на данный момент установлено 379869 файлов и каталогов.)
Подготовка к распаковке …/cpulimit_2.5-1_amd64.deb …
Распаковывается cpulimit (2.5-1) …
Настраивается пакет cpulimit (2.5-1) …
Обрабатываются триггеры для man-db (2.8.5-2) …

olej@ACER:~/2019_WORK/own.WORK/AplitSoft/OrgDoc/time.report.01$ cpulimit --help
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

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

управление процессами и приоритетами

Непрочитанное сообщение Olej » 02 апр 2023, 01:59

Тестовая задача:

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

olej@ACER:~/2019_WORK/own.WORK/fb$ dd if=/dev/zero of=/dev/null &
[1] 29976

olej@ACER:/usr/share/consolefonts$ top -p 29976
Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
%Cpu(s): 30,8 us, 36,2 sy,  0,0 ni, 32,8 id,  0,2 wa,  0,0 hi,  0,0 si,  0,0 st
MiB Mem :  11888,2 total,    470,8 free,   8401,2 used,   3016,2 buff/cache
MiB Swap:  12165,0 total,  10713,8 free,   1451,2 used.   1981,1 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                   
29976 olej      20   0    5264    752    688 R  99,7   0,0   0:34.07 dd                                                                        
Загрузка 100% - 1-го из процессоров!
Ограничиваю:

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

olej@ACER:~/2019_WORK/own.WORK/AplitSoft/OrgDoc/time.report.01$ cpulimit -l20 -p29976
Process 29976 detected
...
Обращает на себя внимание (для меня это неожиданность), что контролирующий процесс не прекращается (не завершается)!
Проверка:

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

olej@ACER:/usr/share/consolefonts$ top -p 29976
Tasks:   1 total,   0 running,   0 sleeping,   1 stopped,   0 zombie
%Cpu(s): 25,3 us, 13,7 sy,  0,0 ni, 60,7 id,  0,2 wa,  0,0 hi,  0,2 si,  0,0 st
MiB Mem :  11888,2 total,    466,0 free,   8404,0 used,   3018,3 buff/cache
MiB Swap:  12165,0 total,  10713,8 free,   1451,2 used.   1976,8 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                   
29976 olej      20   0    5264    752    688 T  22,7   0,0   3:07.17 dd                                                                        
Всё! 20% загрузки...
Останавливаю контролирующий процесс:

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

olej@ACER:~/2019_WORK/own.WORK/AplitSoft/OrgDoc/time.report.01$ cpulimit -l20 -p29976
Process 29976 detected
^C Exiting...
Проверяю:

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

olej@ACER:/usr/share/consolefonts$ top -p 29976
Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
%Cpu(s): 39,9 us, 35,8 sy,  0,0 ni, 24,3 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
MiB Mem :  11888,2 total,    458,5 free,   8411,8 used,   3018,0 buff/cache
MiB Swap:  12165,0 total,  10713,8 free,   1451,2 used.   1969,4 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                   
29976 olej      20   0    5264    752    688 R  98,0   0,0   4:02.64 dd                                                                        
Снова процесс отпущен на все 100%!


Тема поднималась пользователем Olej 02 апр 2023, 01:59.

Ответить

Вернуться в «Системные утилиты»

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей