The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Как в Linux привязать процесс к CPU и установить атрибуты планирования
При необходимости увеличить производительность определенного процесса в системе, 
можно жестко привязать его к определенному CPU (CPU affinity), исключив 
ситуацию мигрирования между процессорами, а также изменить для него алгоритм работы 
планировщика задач и увеличить приоритет.

Привязка к CPU осуществляется командой taskset, а изменение параметров  real-time 
планирования командой chrt. Обе команды можно использовать каскадно, вызывая 
одну в качестве аргумента другой. 

Например:

   taskset -c 2-3 chrt -f 1 <command>

привяжет выполнение команды к CPU со 2 по 3 ("-c 2-3", можно перечислять 
процессоры через запятую, например, "-c 2,3"), а также задействует политику 
планирования SCHED_FIFO ("-f") и установит приоритет 1 уровня. 

Политики планирования (описание - man sched_setscheduler):
   -b SCHED_BATCH
   -f SCHED_FIFO 
   -o SCHED_OTHER
   -r SCHED_RR 

Изменение параметров для уже запущенного процесса производится при помощи опции "-p". 
Например, изменение параметров процесса с PID 123:
   taskset -c 2-3 -p 123
   chrt -f 1 -p 123
 
13.03.2008 , Источник: http://www.redhatmagazine.com/2008/...
Ключи: schedule, nice, cpu, realtime, proccess / Лицензия: CC-BY
Раздел:    Корень / Администратору / Система / Linux специфика / Оптимизация и тюнинг в Linux

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, weec (??), 00:04, 14/03/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    как такое замутить в FreeBSD?
     
     
  • 2.3, grayich (??), 03:48, 14/03/2008 [^] [^^] [^^^] [ответить]  
  • +/
    man rtprio  для приоритета
     
     
  • 3.9, Аноним (-), 00:52, 17/03/2008 [^] [^^] [^^^] [ответить]  
  • +/
    неа, man cpuset

    DESCRIPTION
         The cpuset command can be used to assign processor sets to processes, run
         commands constrained to a given set or list of processors, and query
         information about processor binding, sets, and available processors in
         the system.

     

  • 1.2, eee (??), 00:27, 14/03/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Может такое подойдет для serial портов? Информация теряется, нехватает реал-тайма.
    Я уже rtlinux хотел ставить.

     
  • 1.4, i (??), 08:54, 14/03/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    у меня от этих манипуляций некоторые процессы перешли в состояние uninterrapt sleep :(
     
  • 1.5, pavlinux (ok), 13:35, 14/03/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    #!/bin/bash

    #########

    DEV_IRQ='ps -eL | grep IRQ | awk '{printf $1" "$2" "}''

    for i in $DEV_IRQ
       do
         chrt -r -p 99 $i;
    done

    ##########

    SOFT_IRQ='ps -eL | grep softirq | awk '{printf $1" "$2" "}''

    for i in $SOFT_IRQ
       do
         chrt -r -p 99 $i
    done

    ##########

    NET_SOFT_IRQ='ps -A | grep softirq-net | awk '{print $1}''

    for i in $NET_SOFT_IRQ
       do
         chrt -f -p 99 $i
    done

    ########

    unset CPU_1_CORE_1 CPU_1_CORE_2 CPU_2_CORE_1 CPU_2_CORE_2


    PROC=/proc/irq

    CPU_1_CORE_1=1
    CPU_1_CORE_2=2
    CPU_2_CORE_1=3
    CPU_2_CORE_2=4

    VIDEO='find $PROC -name nvidia | cut -b 11-13';
    ETH0='find $PROC  -name eth0 | cut -b 11-13';
    SCSI='find $PROC -name aic79xx | cut -b 11-13';
    ATA='find $PROC -name libata | cut -b 11-13';
    AUDIO='find $PROC -name "NVidia CK804" | cut -b 11-13';

    echo $CPU_1_CORE_1 > /proc/irq/$VIDEO/smp_affinity;
    echo $CPU_1_CORE_2 > /proc/irq/$ETH0/smp_affinity;
    echo $CPU_1_CORE_1 > /proc/irq/$SCSI/smp_affinity;
    echo $CPU_2_CORE_1 > /proc/irq/$AUDIO/smp_affinity;

    for i in $ATA
       do
         echo $CPU_2_CORE_2 > /proc/irq/$i/smp_affinity;
    done

     
     
  • 2.6, pavlinux (ok), 13:52, 14/03/2008 [^] [^^] [^^^] [ответить]  
  • +/
    1. Установить патчик http://www.kernel.org/pub/linux/kernel/projects/rt/patch-2.6.24.3-rt3.bz2
    2. Смотреть мануал на своб материнку, чипсет, и т.п. на предмет кто на каком CPU работает.
    (этот пример для вот этой матери - http://tyan.com/product_board_detail.aspx?pid=151)
    3. User-space приложения лучше не chrt_аймить, ну если надо, то не более -f  -p 2 'pidof foo', смотреть на nice level, демоны не связанные с железом тоже не надо, artsd - можно.



     
  • 2.7, pavlinux (ok), 13:54, 14/03/2008 [^] [^^] [^^^] [ответить]  
  • +/
    Чуть не забыл, утиль irq-balance тоже не забываем.
     
  • 2.10, Rush (??), 08:59, 02/03/2010 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >CPU_1_CORE_1=1
    >CPU_1_CORE_2=2
    >CPU_2_CORE_1=3
    >CPU_2_CORE_2=4

    Я, конечно, дико извиняюсь, но ИМХО должно быть что то вроде
    CPU_1_CORE_1=1
    CPU_1_CORE_2=2
    CPU_2_CORE_1=4
    CPU_2_CORE_2=8

    Соответственно, чтобы привязать прерывания, например, к 1-му процессору (невзирая на ядро)
    CPU_1=3
    и, соответственно
    CPU2=12

    Я ещё раз прошу прощения, информация чисто только что практически выдумана мной, ибо тысячу лет назад, на заре появления SMP я видел код планировщика, который стопудов по маске смотрел, а не по порядковому номеру. Возможно сейчас всё изменилось (но вряд ли).

     
     
  • 3.11, pavlinux (ok), 14:09, 02/03/2010 [^] [^^] [^^^] [ответить]  
  • +/
    >Я, конечно, дико извиняюсь, но ИМХО должно быть что то вроде
    >CPU_1_CORE_1=1
    >CPU_1_CORE_2=2
    >CPU_2_CORE_1=4
    >CPU_2_CORE_2=8
    >
    >Соответственно, чтобы привязать прерывания, например, к 1-му процессору (невзирая на ядро)
    >CPU_1=3
    >и, соответственно
    >CPU2=12

    Я взирал на ядра :)

    У меня например, на 2-х процессорной матери стоят двух ядерные процы...

    2 сетевушки, EHCI_USB и OHCI_USB, 1 сетевуха конектится на 1 проц, 2 на второй,
    тоже самое  с USB, так почему бы не разогнать прерывания от USB и Ethernet по разным
    ядрам...

    CPU_1_CORE_1 = eth0
    CPU_1_CORE_2 = uhci_usb
    CPU_2_CORE_1 = eth1
    CPU_2_CORE_2 = ehci_usb

    P.S. Клаву и часы лучше оставить на 0 ядре

     
     
  • 4.12, Rush (??), 15:46, 02/03/2010 [^] [^^] [^^^] [ответить]  
  • +/
    Вообще наши админы тоже затрахали с этими процессорами и ядрами - ну какая разница сколько там микросхем стоит  - ведь, когда объём памяти спрашивают, имеют ввиду совсем не количество планок :) Главное - ядра(чистыйизумруд) !

    >CPU_1_CORE_1=1
    >CPU_1_CORE_2=2
    >CPU_2_CORE_1=3
    >CPU_2_CORE_2=4
    >Я взирал на ядра :)

    Ядра(чистыйизумруд), и это бесспорно, но я имел ввиду ошибку в скрипте: не 1,2,3,4 а 1,2,4,8 ибо это маска, а не номер процессора/ядра :)

    П.С.: читать "изумруд" как "кремний" :)

     
     
  • 5.13, pavlinux (ok), 17:56, 02/03/2010 [^] [^^] [^^^] [ответить]  
  • +/
    >[оверквотинг удален]
    >ядра(чистыйизумруд) !
    >
    >>CPU_1_CORE_1=1
    >>CPU_1_CORE_2=2
    >>CPU_2_CORE_1=3
    >>CPU_2_CORE_2=4
    >>Я взирал на ядра :)
    >
    >Ядра(чистыйизумруд), и это бесспорно, но я имел ввиду ошибку в скрипте: не
    >1,2,3,4 а 1,2,4,8 ибо это маска, а не номер процессора/ядра :)

    А,... ну да, я их вечно пустаю с утилью taskset

     

  • 1.14, Иван (??), 11:05, 10/09/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Спасибо
    Теперь понятно как в Linux привязать процесс к конкретному CPU
    Но мне еще важно чтобы этот процесс использовал это CPU монопольно то есть чтобы все остальные процессы использовали другие CPU.
    Не подскажете как это сделать ?
     


     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру