При необходимости увеличить производительность определенного процесса в системе,
можно жестко привязать его к определенному 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
URL: http://www.redhatmagazine.com/2008/03/12/tips-and-tricks-how.../
Обсуждается: http://www.opennet.dev/tips/info/1620.shtml
как такое замутить в FreeBSD?
man rtprio для приоритета
неа, man cpusetDESCRIPTION
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.
Может такое подойдет для serial портов? Информация теряется, нехватает реал-тайма.
Я уже rtlinux хотел ставить.
у меня от этих манипуляций некоторые процессы перешли в состояние uninterrapt sleep :(
#!/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/irqCPU_1_CORE_1=1
CPU_1_CORE_2=2
CPU_2_CORE_1=3
CPU_2_CORE_2=4VIDEO=`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
1. Установить патчик http://www.kernel.org/pub/linux/kernel/projects/rt/patch-2.6...
2. Смотреть мануал на своб материнку, чипсет, и т.п. на предмет кто на каком CPU работает.
(этот пример для вот этой матери - http://tyan.com/product_board_detail.aspx?pid=151)
3. User-space приложения лучше не chrt_аймить, ну если надо, то не более -f -p 2 `pidof foo`, смотреть на nice level, демоны не связанные с железом тоже не надо, artsd - можно.
Чуть не забыл, утиль irq-balance тоже не забываем.
>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 я видел код планировщика, который стопудов по маске смотрел, а не по порядковому номеру. Возможно сейчас всё изменилось (но вряд ли).
>Я, конечно, дико извиняюсь, но ИМХО должно быть что то вроде
>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_usbP.S. Клаву и часы лучше оставить на 0 ядре
Вообще наши админы тоже затрахали с этими процессорами и ядрами - ну какая разница сколько там микросхем стоит - ведь, когда объём памяти спрашивают, имеют ввиду совсем не количество планок :) Главное - ядра(чистыйизумруд) !>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 ибо это маска, а не номер процессора/ядра :)
П.С.: читать "изумруд" как "кремний" :)
>[оверквотинг удален]
>ядра(чистыйизумруд) !
>
>>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
Спасибо
Теперь понятно как в Linux привязать процесс к конкретному CPU
Но мне еще важно чтобы этот процесс использовал это CPU монопольно то есть чтобы все остальные процессы использовали другие CPU.
Не подскажете как это сделать ?