Determinando o processador específico no qual um processo está sendo executado

10

Eu tenho acesso a um nó de 8 núcleos de um cluster Linux. Quando conectado ao nó, posso ver uma lista de processadores usando este comando:

more /proc/cpuinfo

No meu nó de 8 núcleos, os processadores são numerados de 0 a 7. Cada processador é uma CPU Intel Xeon (E5430 a 2.66GHz).

Agora, suponha que eu chame o programa foocom alguns argumentos args:

foo args

O programa foodemora muito para ser executado (horas ou dias, por exemplo). Tendo chamado foo, é possível determinar o processador específico (ou seja, 0 a 7) no qual fooestá sendo executado? O topprograma mostra o ID do processo e informações semelhantes, mas não vejo o número do processador . Essas informações estão disponíveis?

Andrew
fonte
1
A menos que você tenha feito algo específico, o processo não permanecerá na mesma CPU o tempo todo. Por que você precisa dessa informação?
Mat
@ Mat Obrigado pelo seu tempo. Essa é uma pergunta separada, mas, em última análise, gostaria de ver se posso atribuir duas chamadas fooa dois processadores diferentes. Quando ligo foouma vez, ele roda com %CPUmuito perto de 100% (de acordo com top). Mas quando ligo foopela segunda vez, ambos os fooprocessos são executados de forma que o valor %CPUde ambos os processos chegue a menos de 100% (geralmente cerca de 45% para cada fooprocesso). Para mim, isso sugere que as duas chamadas fooestão em execução no mesmo processador (mesmo que haja oito processadores disponíveis); Eu gostaria de verificar se é esse o caso.
21813 Andrew Andrew
1
O termo é chamado de afinidade do processador
slm
1
O agendador permite que as coisas sejam executadas em vários processadores (diferentes). Dependendo de quem programa o aplicativo, os programas java tentam fazer isso.
Mdpc

Respostas:

11

pspode fornecer essas informações se você solicitar a psrcoluna (ou usar o -Fsinalizador que a inclui).

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

Ou:

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

Meu shell estava executando na CPU 2 quando executei o primeiro comando, na CPU 0 quando executei o segundo. Lembre-se de que os processos podem alterar as CPUs muito, muito rapidamente, para que as informações que você realmente vê já estejam obsoletas.

Mais algumas informações nas respostas desta pergunta do superusuário:

Linux: comando para saber o número do processador no qual um processo é carregado?

Esteira
fonte
4

Com o topfrom procps(geralmente o padrão nas distribuições Linux atualmente), toppressione f, navegue P = Last User CPU (SMP)e pressione Spacepara selecionar (você também pode mover o campo, por exemplo, antes do COMMANDcampo com a Righttecla e, em seguida, mover para cima e para baixo). qpara retornar à tela principal (onde você verá seu processo passar de processador para processador, a menos que você o tenha configurado explicitamente para ficar com um). Você pode pressionar Wpara salvar isso como padrão.

Pressione ?para obter ajuda.

Stéphane Chazelas
fonte
4

O comando taskseté o que você está procurando:

conjunto de tarefas - recuperar ou definir a afinidade da CPU de um processo

Exemplo

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

Uma máscara de ftodos os processadores significa 0x00000001apenas o processador 0.

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

Mostra as CPUs no formato de lista. Eu tenho 4 núcleos no meu laptop neste exemplo.

Veja a página de manual com mais detalhes .

slm
fonte
1

Você também pode obter essas informações diretamente em /proc/[pid]/stat. É o 39º campo delimitado por espaço (desde o Linux 2.2.8).

Por exemplo, para exibir em qual processador CPU o shell atual está sendo executado (nesta instância):

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