Afinidad de procesos

Aldrin Martoq amartoq en dcc.uchile.cl
Mar Mar 25 09:06:15 CLST 2008


Esto es interesante, justo quiero desparramar el render de mi video
entre 2 o mas tarros... estaba pensando en algo similar a Xgrid, pero
desconozco si hay algo parecido en linux. Algun hint ?


2008/3/24 Xavier Andrade <andrade en theory.polytechnique.fr>:
> On Sun, 23 Mar 2008, Aldrin Martoq wrote:
>  > No tengo idea, pero segun lo que _acabo_ de leer:
>  > - instala numactl lo cual resuelve tu consulta:
>  > $ numactl --cpubind=0 --membind=0,1 process
>  > Run process on node 0 with memory allocated on node 0 and 1.
>  > etc...

Sigo hablando sin tener idea, pq no tengo acceso a ese tipo de
maquinas... alguien tiene un NUMA en su casa???
HINT: al parecer si compilas el kernel con numa y tienes mas de un
procesador, puedes simularlo agregando "numa=fake" a tu boot [1].
No tengo como comprobarlo: mi laptop esta por cumplir 3 años y no
tengo mas que un core y no soporta x86_64... alguien me regala el
último macbookpro (MB166LL/A) con 4gb de RAM ??? :)

>  Si, sabiendo donde uno quiere correr es facil. El problema es que no se
>  cual numero de cpu o nodo son los que puedo usar ya que es una maquina
>  compartida con otros programas y probablemente correra varias instancias
>  de mi programa (la maquina que estoy usando para las pruebas tiene 128
>  procesadores).

Hasta donde entiendo, una vez que tu proceso FOO esta corriendo en un
nodo NN, el proceso FOO no va a moverse del nodo NN automáticamente...
sólo se puede hacer manualmente con alguna herramienta user-space (que
aún no encuentro [2]) y que parece requerir "root" o algo asi.

Voy a suponer que no tienes el acceso "root" para mover manualmente tu
proceso a otro nodo; si tienes ese acceso, bastaría con que monitorees
/proc/$(pidof FOO)/numa_maps para ver si el proceso FOO esta
consumiendo RAM de otro nodo... esto por lo que dice el kernel en
mm/mempolicy.c:
        for_each_online_node(n)
                if (md->node[n])
                        seq_printf(m, " N%d=%lu", n, md->node[n]);

Si determinas que la RAM esta muy lejos (otros nodos) de tu proceso,
deberias moverlo, coooooorrecto?

>  Lo unico que puedo asumir es que puedo seguir corriendo en el procesador
>  que ya me asignaron. Entonces o necesito algo que le diga "quedese
>  corriendo el en nodo en que esta" o algo que me diga en que nodo esta
>  corriendo un proceso.
[...]

Hasta donde entiendo, el default es "quedese corriendo en el nodo en
que está" en linux. [2]

La segunda pregunta, en que nodo está corriendo un proceso cualquiera,
aún no la encuentro. Sólo encontré una llamada al sistema: vgetcpu()
[3], la cual debe entregarte el nodo si estás en x86_64 para el
proceso que la pide... No veo equivalente en la libc, parece que
tienes que llamarla "a mano"...


Pero yo veo que la pregunta es más compleja: no es solo que nodo está
con menos carga de CPU, sino que cual nodo tiene mayor RAM libre o lo
suficiente para que corra tu proceso FOO. La idea es que te toque toda
la RAM en tu nodo local, por eso que numa_api habla exclusivamente de
asignación de memoria más que de CPU....

Para saber que nodo tiene mas RAM libre no tengo respuesta... quizas
ver todos los /proc/*/num_maps ??? que info puedes sacar de
/sys/devices/system/node ???  Tienes /proc/*/cpuset ??


[1] Documentation/x86_64/fake-numa-for-cpusets
[2] Documentation/cpusets.txt
[3] arch/x86_64/kernel/vsyscall.c:vgetcpu


BTW, se puede saber características de la máquina? es un opteron, ibm,
sgi; cuanta cpu/ram por nodo ??? por qué mencionaste que vas a correr
varios FOO al mismo tiempo?? Tienes una cuenta para entrar ??? ;)

Slds,
-- 
Aldrin Martoq
NUEVO: Episodio 002 (Lunes 24 Marzo)!
http://aldrinvideopodcast.podshow.com/



Más información sobre la lista de distribución Linux