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