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