Determinar el procesador particular en el que se ejecuta un proceso

10

Tengo acceso a un nodo de 8 núcleos de un clúster de Linux. Cuando inicie sesión en el nodo, puedo ver una lista de procesadores que utilizan este comando:

more /proc/cpuinfo

En mi nodo de 8 núcleos, los procesadores están numerados del 0 al 7. Cada procesador es una CPU Intel Xeon (E5430 @ 2.66GHz).

Ahora supongamos que llamo al programa foocon algunos argumentos args:

foo args

El programa footarda mucho tiempo en ejecutarse (horas o días, por ejemplo). Habiendo llamado foo, ¿es posible determinar el procesador particular (es decir, 0 a 7) en el que se fooestá ejecutando? El topprograma me muestra la identificación del proceso e información similar, pero no veo el número del procesador . ¿Esta información está disponible?

Andrés
fuente
1
A menos que haya hecho algo específico, el proceso no permanecerá en la misma CPU todo el tiempo. ¿Por qué necesitas esa información?
Mat
@ Mat Gracias por tu tiempo. Esta es una pregunta separada, pero en última instancia me gustaría ver si puedo asignar dos llamadas fooa dos procesadores diferentes. Cuando llamo foouna vez, se ejecuta con %CPUmuy cerca del 100% (según top). Pero cuando llamo foopor segunda vez, ambos fooprocesos se ejecutan de manera tal que %CPUpara ambos procesos suman menos del 100% (generalmente alrededor del 45% para cada fooproceso). Para mí, esto sugiere que las dos llamadas a foose ejecutan en el mismo procesador (a pesar de que hay ocho procesadores disponibles); Me gustaría verificar que este sea el caso.
Andrew
1
El término se llama afinidad de procesador
slm
1
El programador permite que las cosas se ejecuten en múltiples (diferentes) procesadores ... SIN EMBARGO, su programa debe construirse como un programa de subprocesos múltiples para aprovechar el uso del procesamiento múltiple simultáneo en un programa o tarea específica. Dependiendo de quién programa la aplicación, los programas de Java intentan hacer esto.
mdpc

Respuestas:

11

pspuede darle esa información si solicita la psrcolumna (o usa la -Fbandera que la incluye).

Ex:

$ ps -F $$
UID        PID  PPID  C    SZ   RSS PSR STIME TTY      STAT   TIME CMD
me        6415  6413  0  5210  2624   2 18:52 pts/0    SN     0:00 -su

O:

$ ps -o pid,psr,comm -p $$
  PID PSR COMMAND
 6415   0 bash

Mi shell se estaba ejecutando en la CPU 2 cuando ejecuté el primer comando, en la CPU 0 cuando ejecuté el segundo. Tenga en cuenta que los procesos pueden cambiar las CPU muy, muy rápidamente, por lo que la información que realmente ve es, en esencia, obsoleta.

Más información en las respuestas de esta pregunta de Superusuario:

Linux: comando para saber el número de procesador en el que se carga un proceso?

Estera
fuente
4

Con topfrom procps(generalmente el valor predeterminado en las distribuciones de Linux actualmente), toppresione f, navegue P = Last User CPU (SMP)y presione Spacepara seleccionar (también puede mover el campo, por ejemplo, antes del COMMANDcampo con la Righttecla y luego subir y bajar). qpara volver a la pantalla principal (donde verá que su proceso se mueve de procesador a procesador a menos que lo haya configurado explícitamente para quedarse con uno). Puede presionar Wpara guardar eso como predeterminado.

Presione ?para obtener ayuda.

Stéphane Chazelas
fuente
4

El comando tasksetes lo que estás buscando:

conjunto de tareas: recuperar o establecer la afinidad de CPU de un proceso

Ejemplo

$ taskset -p 12345
pid 12345's current affinity mask: f

Una máscara de fmedios para todos los procesadores, 0x00000001sería solo el procesador 0.

$ taskset -c -p 24389 
pid 24389's current affinity list: 0-3

Muestra las CPU en formato de lista. Tengo 4 núcleos en mi computadora portátil en este ejemplo.

Ver la página del manual tiene más detalles .

slm
fuente
1

También puede obtener esta información directamente de /proc/[pid]/stat. Es el campo 39 delimitado por espacios (desde Linux 2.2.8).

Por ejemplo, para mostrar en qué procesador de CPU se está ejecutando el shell actual (en este caso):

cat  /proc/$$/stat | cut -d' ' -f39
drgnfr
fuente