Хотелось бы максимально ускорить работу своих процессов. Решил это
сделать за счет повышения приоритета и изменение диспетчеризации на
FIFO, чтоб мой процесс занимал процессор сколько ему надо :)
Возникли вопросы:
1. Какие еще есть методы увеличения скорости, кроме оптимизации кода (-О2(3)...), алгоритмов, использования памяти ?
2. Поднимаю приоритет при помощи setpriopity(PRIO_PROCESS,0,-10), но
поднять можно тлько от root'a, а запускать хочу от юзера. Достаточно
ли просто сменить владельца процесса на root и установить SUID ?
3. Как изменить диспетчеризацию в Linux'e ? Можно ли из процесса или
только в ядре ?
Добрый день. Извините за дремучесть.
>перемещение кода в пространство ядра по аналогии с
>khttpd && tux
я не знаком с "khttpd && tux" не подскжите кратенько,
что значит "перемещение кода в пространство ядра" - оформить код в виде модуля ядра или прикрутить куда-то
в ядре ?
>я не знаком с "khttpd && tux" не подскжите кратенько,
ну ты навкерное знаеш о существовании апача.
так вот для случаев когда время реакции системы является критическим параметром придумали "http-акселераторы" - некое подобие урезанного апача но обычно оформленное в виде модуля ядра.
ты видел мож быть в выводе ps ax или top процессы в квадратных скобках?? это именно они - процессы пространства ядра.
> 2. Поднимаю приоритет при помощи setpriopity(PRIO_PROCESS,0,-10), но
> поднять можно тлько от root'a,
в новых есть RLIMIT_NICE. так что обычный пользователь
может поднять приоритет вплоть до этого значения.
также есть RLIMIT_RTPRIO, это вообще real-time sceduling
позволяет.
перенесение кода в ядро поможет только в том случае, если
процесс вынужден много каких-то сисколов, или много копировать
from/to user/kernel.
разве что имеет смысл иногда вынести какой-то код в обработчик
прерывания для особо быстрой реакции.
тот же khttpd не имеет смысла с появлением sys_sendfile, его
и убрали давно.
вводная часть : подобные вопросы принято сопровождать описанием конфигурации машины (аппаратуры), системы (ядра) и Вашего процесса..
Без этой информации - мы все тут делаем телепатические усилия :)
> ...чтоб мой процесс занимал процессор сколько ему надо :)
а он у Вас умудряется занимать меньше ? Как Вы достигли такого результата ?? Вы наверное хотели чтобы при работе Вашей программы было idle ~0%.. такой идеал бывает только для расчётных задач помещающихся в ОП целиком вместе с данными. Все прочие так или иначе задействуют ввод/вывод, соотв. появляются задержки. Практически наверняка Ваша программа и сама занимается каким-нить обменом данными с прочими, задействует таймеры и прочее и прочее.. То есть у Вашего процесса точно найдётся повод постоять-потормозить :)
> 1. Какие еще есть методы увеличения скорости, кроме оптимизации кода (-О2(3)...), алгоритмов, использования памяти ?
если Ваш процесс не Вы делали, и оптимизации он ну никак не поддаётся, то методы --
административные :) оптимизация системы под имеющееся железо, исключение всего лишнего из системы..можно поиграться - попробовать разные real-time/low-latency патчи для ядра, с целью уменьшить время отклика системы и сделать нагрузку более равномерной.
> 2. Поднимаю приоритет при помощи setpriopity(PRIO_PROCESS,0,-10), но
поднять можно тлько от root'a, а запускать хочу от юзера. Достаточно
ли просто сменить владельца процесса на root и установить SUID ?
Мсье боится эксперементировать ?
> 3. Как изменить диспетчеризацию в Linux'e ? Можно ли из процесса или
только в ядре ?
а вот это уже лишнее..игра с приоритетами стоит свеч, только это многозадачное приложение и у Вас есть чёткие правила назначения приоритетов для каждой подзадачи. К примеру тюнинг приоритетов для Oracle имеет смысл, а для mysql вряд-ли :)
> конфигурации машины (аппаратуры)
x86
> системы (ядра)
Gentoo 2005 (2.6.14-gentoo-r5)
> и Вашего процесса
Сервер для работы с PCI-устройством и его клиенты
> а он у Вас умудряется занимать меньше ? Как Вы достигли такого
> результата ?? Вашей программы было idle ~0%.
Ха... Тут нужно разделять время, которое процесс занимает процессор -
Тпр и общее время выполнения процесса - Тисп. При RR, дефолтном
приоритете и загруженности может быть Тисп >> Тпр,
а нужно чтоб Тисп -> Тпр, по-вашему idle -> 0%.
> Мсье боится эксперементировать ?
Лучше товарищ :)
> также есть 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() - не меняется приоритет...
Как правильно сделать ?
> приоритет и политика шедулирования весьма неродственные
> обьекты/понятия
Но, эта ф-ция меняет и приоритет:
param.sched_priority = sched_get_priority_max(SHED_FIFO);
sched_setscheduler(0, SCHED_FIFO, ¶m);
Запустить все это от root'a и наступит счастье :)
Так вот хочется, чтоб и не тока от root'a... И RLIMIT_RTPRIO поюзать
хочется...
> да кстати траблы могут быть в том что ядро может требовать не
> ефективного а реального рута.
Да нет же... Я делаю 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, ¶m);
Запускаю из под чистого юзера, но приоритет не меняется.
Вот и пытаюсь RLIMIT_RTPRIO и RLIMIT_NICE использовать, а вот как не знаю ... :(
> > также есть RLIMIT_RTPRIO, это вообще real-time sceduling
> > позволяет.
>
> А как использовать это RLIMIT_RTPRIO и RLIMIT_NICE ?
так же как все остальные rlimit значения, но я не знаю
как это сделать в вашем дистрибутиве. по умолчанию у нас
#define INIT_RLIMITS \
{ \
...
[RLIMIT_NICE] = { 0, 0 }, \
[RLIMIT_RTPRIO] = { 0, 0 }, \
...
так что администратор должен их изменить в каком-нибудь
из init скриптов.
> по умолчанию у нас ...
А где это у вас прописано ? В одном из скриптов /etc/rc.d/init.d ?
Т.е. как я понял, мне нужно в С'ишной проге переиницилизировать,например
[RLIMIT_NICE] = {10, 20} (это инициализация структуры rlimit ??)
запустить эту прогу из скрипта инициализации ??
setrlimit() используется как-нибудь?
И где можно посмотреть пример и почитать как это делается?