LINUX.ORG.RU

высвободить ядра CPU для исполнения на них узкого круга задач

 


0

3

скажи форум существует ли возможность высвободить ядра CPU для того чтобы можно было бы научить пару функций ядра имеющих высокий приоритет работать только на них?


Ответ на: комментарий от Irma

А смысл? Планировщик все равно распихает их по ядрам лучше, чем ты.

А вот хрен! Как раз сейчас сделал эмулятор (пока железо не подошло) одной штуки с модулем ядра. Там принимается IOCTL-запрос, кладет его в очередь и запускает нить обработчика, выставив семафор. Нить обработчика разгребает очередь и выполненные запросы кидает в обработчик результатов, сигналя ему его семафором. Нить результатов вызывает колбек из запроса и отпускает, ioctl-вызов, опять выставив семафор.

Так вот, я думал там будет затык с копированием буферов из userland в kernel, а вышло, что почти все время запроса съедается на переключении тредов. Итого 3шт нитей переключаются за 1mS = 1000uS примерно, а полезной работы на 10uS делается. В системе 229 tasks и 1152 threads.

bugs-bunny
()

А вот же, на конкретном ядре запускается. У себя и нашел.

typedef int (plat_threadfn)(void*);
// https://github.com/muratdemirtas/Linux-Kernel-Examples/blob/master/kernel-threads.c#L155
static inline int plat_create_thread_do( struct task_struct **task, plat_threadfn proc, void *arg )
{
	/*struct sched_param task_sched_params =
	{
			.sched_priority = MAX_RT_PRIO
	};*/
	int			cpu = get_cpu();

	msgprint("++plat_create_thread_do on CPU #%d\n",cpu);
	if(!task || !proc)
	{
		msgprint("invalid parameters\n");
		return -EINVAL;
	}

	*task = kthread_create( proc, arg, "none" );
	if(!*task)
	{
		msgprint("kthread_create error\n");
		return -EINVAL;
	}

	msgprint("kthread_bind\n");
	kthread_bind( *task, cpu );

	// sched_setscheduler( *task, SCHED_FIFO, &task_sched_params);

	msgprint("wake_up_process\n");
	wake_up_process( *task );

	msgprint("--plat_create_thread_do\n");
	return 0;
}
#define plat_create_thread(thread,attr,proc,arg)   plat_create_thread_do(thread,proc,arg) // (?)

bugs-bunny
()
Ответ на: комментарий от lovesan

для всяких таких вещей нужны RTOS, чем линупс не является

Наверное да, но посмотрите например на идею DPDK в сетевых драйверах. Там на каждый пакет не вызывается IRQ, а только на их кучку по таймеру или превышении threshold-а, а далее поллингом, что оказывается быстрее «правильной» синхронизации на всяких мутексах и семафорах. +Кернел буферы не копируются, а маппируются в юзерспейс. А весь сетевой стек заменяет либа, слинкованная с приложением. И все это для сетевух, работающих на 10Gb/40Gb, вроде уже есть и 800Gb в планах. Например драйвер ixgbe от intel. И это не для ширпотреба, а для систем работающих в датацентрах. И c DPDK это уже как бы и не совсем Linux ядро и приложение.

Да, и в таких рещениях часть функций файрволов например перекладывается на карту. Как дропнуть, форварднуть пакеты с одного интерфейса на другой, зарулить на встроенный криптоускоритель для IPSec пакетов. В разы разгружает драйвер.

bugs-bunny
()
Последнее исправление: bugs-bunny (всего исправлений: 2)

Мы у себя так делаем (Хуанг в кожанке присоветовал)

«isolcpus=1-2» - в параметры ядра. «taskset –cpu-list 1 » - в строку запуска апликухи.

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

affinity это про указание на прикрепление процесса к определенному ядру, а isolcpu полностью изолирует данное ядро от планировщика и других процессов для запуска задачи в отдельной среде, как и просит TC

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

Совершенно верно. Вначале изолировать от планировщика с помощью параметра ядра isolcpu, а потом прибить гвоздями поток к ядру CPU с помощью sched_setaffinity изнутри программы или с помощью taskset извне.

blex ★★
()
Ответ на: комментарий от bugs-bunny

Итого 3шт нитей переключаются за 1mS = 1000uS примерно, а полезной работы на 10uS делается. В системе 229 tasks и 1152 threads.

Я лошара. Модуль и тест запустил в VMWare-машине - побоялся уронить свою. На отдельном стенде вызов ioctl занял 15uS, а не 1500uS. Система в системе хз как работает, но видимо сильно иначе.

bugs-bunny
()