Определение конкретного процессора, на котором запущен процесс

10

У меня есть доступ к 8-ядерному узлу кластера Linux. При входе на узел я вижу список процессоров, использующих эту команду:

more /proc/cpuinfo

В моем 8-ядерном узле процессоры пронумерованы от 0 до 7. Каждый процессор - это процессор Intel Xeon (E5430 @ 2,66 ГГц).

Теперь предположим, что я вызываю программу fooс некоторыми аргументами args:

foo args

Выполнение программы fooзанимает много времени (например, часы или дни). Позвонив foo, можно ли определить конкретный процессор (т. Е. От 0 до 7), на котором fooработает? В topпрограмме показывает мне идентификатор процесса и подобную информацию, но я не вижу процессор номер . Доступна ли такая информация?

Эндрю
источник
1
Если вы не сделали что-то конкретное, процесс не будет постоянно работать на одном и том же процессоре. Зачем вам эта информация?
Мат
@ Мат Спасибо за ваше время. Это отдельный вопрос, но в конечном итоге я хотел бы посмотреть, смогу ли я назначить два вызова fooдвум разным процессорам. Когда я звоню fooодин раз, он работает %CPUочень близко к 100% (согласно top). Но когда я вызываю fooвторой раз, оба fooпроцесса запускаются так, что %CPUдля обоих процессов сумма составляет менее 100% (обычно около 45% для каждого fooпроцесса). Для меня это говорит о том, что два вызова fooвыполняются на одном процессоре (хотя доступно восемь процессоров); Я хотел бы убедиться, что это так.
Андрей
1
Термин называется сродством к процессору
slm
1
Планировщик позволяет запускать вещи на нескольких (разных) процессорах ... ОДНАКО ваша программа должна быть построена как многопоточная программа, чтобы использовать преимущества одновременной множественной обработки для конкретной программы или задачи. В зависимости от того, кто программирует приложение, Java-программы пытаются это сделать.
MDPC

Ответы:

11

psможет дать вам эту информацию, если вы попросите psrколонку (или используйте -Fфлаг, который включает ее).

Пример:

$ 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

Или:

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

Моя оболочка работала на CPU 2, когда я запускал первую команду, на CPU 0, когда я запускал вторую. Помните, что процессы могут очень и очень быстро менять ЦП, поэтому информация, которую вы на самом деле видите, по сути уже устарела.

Дополнительная информация в ответах на этот вопрос Супер-пользователя:

Linux: команда, чтобы узнать номер процессора, в который загружен процесс?

Мат
источник
4

С помощью topfrom procps(обычно по умолчанию в дистрибутивах Linux в настоящее время) topнажмите in , fперейдите к P = Last User CPU (SMP)и нажмите, Spaceчтобы выбрать (вы также можете переместить поле, например, перед COMMANDполем с помощью Rightклавиши, а затем перемещаться вверх и вниз). qвернуться к главному экрану (где вы увидите, как ваш процесс переходит от процессора к процессору, если вы явно не настроили его для работы с ним). Вы можете нажать, Wчтобы сохранить это как значение по умолчанию.

Нажмите ?для помощи.

Стефан Шазелас
источник
4

Команда taskset- это то, что вы ищете:

taskset - получить или установить привязку процессора к процессу

пример

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

Маска fозначает все процессоры, 0x00000001будет просто процессор 0.

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

Показывает процессор в формате списка. В этом примере у меня на ноутбуке 4 ядра.

Смотрите man-страницу более подробно .

SLM
источник
1

Вы также можете получить эту информацию непосредственно из /proc/[pid]/stat. Это 39-е поле, разделенное пробелами (начиная с Linux 2.2.8).

Например, для отображения процессора процессора, на котором работает текущая оболочка (в данном случае):

cat  /proc/$$/stat | cut -d' ' -f39
drgnfr
источник