LINUX.ORG.RU

Приоритет и диспетчеризация


0

0

Хотелось бы максимально ускорить работу своих процессов. Решил это
сделать за счет повышения приоритета и изменение диспетчеризации на 
FIFO, чтоб мой процесс занимал процессор сколько ему надо :)
Возникли вопросы:
1. Какие еще есть методы увеличения скорости, кроме  оптимизации кода (-О2(3)...), алгоритмов, использования памяти ?
2. Поднимаю приоритет при помощи setpriopity(PRIO_PROCESS,0,-10), но
поднять можно тлько от root'a, а запускать хочу от юзера. Достаточно
ли просто сменить владельца процесса на root и установить SUID ?
3. Как изменить диспетчеризацию в Linux'e ? Можно ли из процесса или 
только в ядре ?

man sched_setscheduler()

>1. Какие еще есть методы увеличения скорости,

перемещение кода в пространство ядра по аналогии с khttpd && tux

cvv ★★★★★
()
Ответ на: комментарий от cvv

Добрый день. Извините за дремучесть.

>перемещение кода в пространство ядра по аналогии с 
>khttpd && tux

я не знаком с "khttpd && tux" не подскжите кратенько,
что значит "перемещение кода в пространство ядра" - оформить код в виде модуля ядра или прикрутить куда-то
в ядре ?

anonymous
()
Ответ на: комментарий от anonymous

>я не знаком с "khttpd && tux" не подскжите кратенько,

ну ты навкерное знаеш о существовании апача.

так вот для случаев когда время реакции системы является критическим параметром придумали "http-акселераторы" - некое подобие урезанного апача но обычно оформленное в виде модуля ядра.

ты видел мож быть в выводе ps ax или top процессы в квадратных скобках?? это именно они - процессы пространства ядра.

порыщ в гугле, там есть и теория и примеры

cvv ★★★★★
()
Ответ на: комментарий от cvv

А как посмотреть какое шедулирование ? вот только приоритет могу пока
посмотреть ps -le.

senjy
() автор топика

> 2. Поднимаю приоритет при помощи setpriopity(PRIO_PROCESS,0,-10), но
> поднять можно тлько от root'a,

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

также есть RLIMIT_RTPRIO, это вообще real-time sceduling
позволяет.

перенесение кода в ядро поможет только в том случае, если
процесс вынужден много каких-то сисколов, или много копировать
from/to user/kernel.

разве что имеет смысл иногда вынести какой-то код в обработчик
прерывания для особо быстрой реакции.

тот же khttpd не имеет смысла с появлением sys_sendfile, его
и убрали давно.

idle ★★★★★
()

вводная часть : подобные вопросы принято сопровождать описанием конфигурации машины (аппаратуры), системы (ядра) и Вашего процесса.. Без этой информации - мы все тут делаем телепатические усилия :)

> ...чтоб мой процесс занимал процессор сколько ему надо :)

а он у Вас умудряется занимать меньше ? Как Вы достигли такого результата ?? Вы наверное хотели чтобы при работе Вашей программы было idle ~0%.. такой идеал бывает только для расчётных задач помещающихся в ОП целиком вместе с данными. Все прочие так или иначе задействуют ввод/вывод, соотв. появляются задержки. Практически наверняка Ваша программа и сама занимается каким-нить обменом данными с прочими, задействует таймеры и прочее и прочее.. То есть у Вашего процесса точно найдётся повод постоять-потормозить :)

> 1. Какие еще есть методы увеличения скорости, кроме оптимизации кода (-О2(3)...), алгоритмов, использования памяти ?

если Ваш процесс не Вы делали, и оптимизации он ну никак не поддаётся, то методы -- административные :) оптимизация системы под имеющееся железо, исключение всего лишнего из системы..можно поиграться - попробовать разные real-time/low-latency патчи для ядра, с целью уменьшить время отклика системы и сделать нагрузку более равномерной.

> 2. Поднимаю приоритет при помощи setpriopity(PRIO_PROCESS,0,-10), но поднять можно тлько от root'a, а запускать хочу от юзера. Достаточно ли просто сменить владельца процесса на root и установить SUID ?

Мсье боится эксперементировать ?

> 3. Как изменить диспетчеризацию в Linux'e ? Можно ли из процесса или только в ядре ?

а вот это уже лишнее..игра с приоритетами стоит свеч, только это многозадачное приложение и у Вас есть чёткие правила назначения приоритетов для каждой подзадачи. К примеру тюнинг приоритетов для Oracle имеет смысл, а для mysql вряд-ли :)

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

> конфигурации машины (аппаратуры)
x86
> системы (ядра)
Gentoo 2005 (2.6.14-gentoo-r5)
> и Вашего процесса
Сервер для работы с PCI-устройством и его клиенты

> а он у Вас умудряется занимать меньше ? Как Вы достигли такого 
> результата ?? Вашей программы было idle ~0%.

Ха... Тут нужно разделять время, которое процесс занимает процессор - 
Тпр и общее время выполнения процесса - Тисп. При RR, дефолтном 
приоритете и загруженности может быть Тисп >> Тпр,
а нужно чтоб Тисп -> Тпр, по-вашему idle -> 0%.

> Мсье боится эксперементировать ?

Лучше товарищ :)

senjy
() автор топика
Ответ на: комментарий от idle

> также есть RLIMIT_RTPRIO, это вообще real-time sceduling
> позволяет.

А как использовать это RLIMIT_RTPRIO и RLIMIT_NICE ?

getrlimit(RLIMIT_NICE, &rlim) - rlim.rlim_cur и rlim.rlim_max равны 0.
Пробовал им присваивать значения rlim.rlim_cur = 10, а потом
setrlimit(RLIMIT_NICE, &rlim) затем
sched_priotity = 20;
sched_setscheduler() - не меняется приоритет...


Как правильно сделать ?

senjy
() автор топика
Ответ на: комментарий от senjy

>sched_setscheduler() - не меняется приоритет...

приоритет и политика шедулирования весьма неродственные обьекты/понятия

cvv ★★★★★
()
Ответ на: комментарий от cvv

> приоритет и политика шедулирования весьма неродственные 
> обьекты/понятия

Но, эта ф-ция меняет и приоритет:

param.sched_priority = sched_get_priority_max(SHED_FIFO);
sched_setscheduler(0, SCHED_FIFO, &param);

Запустить все это от root'a и наступит счастье :)
Так вот хочется, чтоб и не тока от root'a... И RLIMIT_RTPRIO поюзать
хочется...

senjy
() автор топика
Ответ на: комментарий от senjy

да кстати траблы могут быть в том что ядро может требовать не ефективного а реального рута.

поиграйся в этом направлении

cvv ★★★★★
()
Ответ на: комментарий от cvv

> да кстати траблы могут быть в том что ядро может требовать не 
> ефективного а реального рута.

Да нет же... Я делаю root'a владельцем исполняемого файла, устанавливаю
SUID, и запускаю процесс из под юзера. Все нормально - приоритет
повышается!
Теперь я хочу запускать без всяких SUID чисто от юзера и попробовать
RLIMIT_RTPRIO типа real-time, вот тока не знаю как его использовать ?
setrlimit(RLIMIT_NICE, &rlim) 
param.sched_priority = sched_get_priority_max(SHED_FIFO);
sched_setscheduler(0, SCHED_FIFO, &param);
Запускаю из под чистого юзера, но приоритет не меняется.
Вот и пытаюсь RLIMIT_RTPRIO и RLIMIT_NICE использовать, а вот как не знаю ... :(

senjy
() автор топика
Ответ на: комментарий от senjy

понял.

>а вот как не знаю ... :(

а никак. если внимательно маны читали то там написано "only root".

cvv ★★★★★
()
Ответ на: комментарий от senjy

> > также есть RLIMIT_RTPRIO, это вообще real-time sceduling
> > позволяет.
>
> А как использовать это RLIMIT_RTPRIO и RLIMIT_NICE ?

так же как все остальные rlimit значения, но я не знаю
как это сделать в вашем дистрибутиве. по умолчанию у нас

#define INIT_RLIMITS                                                    \
{                                                                       \
...
        [RLIMIT_NICE]           = { 0, 0 },                             \
        [RLIMIT_RTPRIO]         = { 0, 0 },                             \
...

так что администратор должен их изменить в каком-нибудь
из init скриптов.

idle ★★★★★
()
Ответ на: комментарий от idle

> по умолчанию у нас ...

А где это у вас прописано ? В одном из скриптов /etc/rc.d/init.d ?

Т.е. как я понял, мне нужно в С'ишной проге переиницилизировать,например
[RLIMIT_NICE] = {10, 20} (это инициализация структуры rlimit ??)
запустить эту прогу из скрипта инициализации ??
setrlimit() используется как-нибудь?
И где можно посмотреть пример и почитать как это делается?

senjy
() автор топика
Ответ на: комментарий от senjy

>> по умолчанию у нас ...

>А где это у вас прописано ?

на сколько я понял - в ядре. а приведённый код кусок сырцов ядра

настраивать можно например через ulimit(ulimit.sh) или pam

cvv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.