Kernel process migration

Jirka Kosina jikos na jikos.cz
Čtvrtek Duben 21 15:46:45 CEST 2005


On Thu, 21 Apr 2005, Ing. Pavel PaJaSoft Janoušek wrote:

> > Nevim jak moc podrobne je Vas dotaz zamyslen :) Velmi zhruba
> > receno dela
> > to, ze pokud se rozhodne, ze jedno CPU je vytezovano neumerne mnoho,
> > zatimco jine se flaka, udela vse potrebne k presunu procesu
> > na jine CPU
> > (na takove, ktere dovoluje afinita).
> 	Dovolil bych si navázat, lze už konečně Linuxu nějak vysvětlit, že
> dotyčný proces se má na určitém procesoru "zamknout" a ne se každou chvilku
> přemigrovávat jen z toho důvodu, aby se jeden procesor nenudil a druhý se
> potil?

man 2 sched_setaffinity

Existuji urcite nejake jiz hotove tooly, ktermi muzete proces s danou 
afinitou spoustet, ci upravovat jiz bezicim procesum jejich afinitu 
(bitovou masku, specifikujici na jakych procesorech mohou bezet).

Ja pouzivam tohle:

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <linux/unistd.h>

#define __NR_sched_set_affinity 226
_syscall3 (int, sched_set_affinity, pid_t, pid, unsigned int, mask_len, 
unsigned long *, mask)

#define __NR_sched_get_affinity 227
_syscall3 (int, sched_get_affinity, pid_t, pid, unsigned int *, mask_len, 
unsigned long *, mask)

int main (int argc, char **argv)
{
	int pid, ret;
	unsigned int mask_len;
	unsigned long mask, new_mask;

	if (argc != 3) {
		printf("usage: chaff <pid> <hex_mask>\n");
		exit(-1);
	}
	pid = atol(argv[1]);
	sscanf(argv[2], "%lx", &new_mask);

printf("pid: %d. new_mask: (%s) %08lx.\n", pid, argv[2], new_mask);

	ret = sched_get_affinity(pid, &mask_len, &mask);
	if (ret) {
		printf("could not get pid %d's affinity.\n", pid);
		return -1;
	}
	printf("pid %d's old affinity: %08lx.", pid, mask);

	ret = sched_set_affinity(pid, sizeof(new_mask), &new_mask);
	if (ret) {
		printf("could not set pid %d's affinity.\n", pid);
		return -1;
	}
	ret = sched_get_affinity(pid, &mask_len, &mask);
	if (ret) {
		printf("sched_get_affinity returned %d, exiting.\n", ret);
		return -1;
	}
	printf("pid %d's new affinity: %08lx.", pid, mask);
	return 0;
}

> 	Po uvedené funkcionalitě jsem pátral já i mí kolegové (naposled loni
> v 2. polovině roku) 

To jste hledali s kolegy nejak prachmizerne, afinita pro procesy ve 2.6 
kernelu je jiz pomerne dlouho (ve 2.4 byla jen pro interrupt handlery).

-- 
JiKos.


Další informace o konferenci Linux