Fixar processo em um núcleo de processador

Talvez você nunca tenha precisado.
Mas como fixar um processo de algum aplicativo a um determinado processador, ou núcleo de processador em um determinado hardware?

Sim há uma luz no fim do túnel, e o Linux traz aplicativos nativos para faze-lo.

Estou a mencionar o pacote util-linux (debian-like) ou util-linux-ng (redhat-like), são os responsáveis pela maioria dos binários de controle sistema operacional, e já são nativos nas distribuições mais conhecidas, debian, Centos, Fedora, ubuntu, e por aí a fora.

Se por ventura não houver um destes dois pacotes em teu sistema operacional, proceda conforme abaixo:
Debian-like: $ sudo aptitude install schedutils
Redhat-like: $ sudo yum install util-linux-ng
O comando gerenciar em qual cpu rodará o processo, é o taskset, que possue a seguinte sintaxe:
taskset [options] [mask | list ] [pid | command [arg]...]; sendo:
taskset [mask] [command] [arguments]; ou
taskset [list] [command]; ou
taskset -p [pid]; ou
taskset -p [mask] [pid]
As opções(options) são:
-p, --pid; identificador do processo
-c, --cpu-list; array de cpu
-h, --help
-v, --version
As mascaras (mask), são as representações hexadecimais dos processadores físicos, por ser complexo e sujeita a falhas não irei trata-las, mas segue uma representação de exemplo:
0x00000001 processador #0
0x00000003 processador #0 e #1
0xFFFFFFFF todos os processadores (#0 até #31)
A lista (list), é a representação da cpu por sua posição. Tomemos por base um processador Intel Xeon CPU E5310 @ 1.60GHz; cache 4096 KB; 64b. Este processador possui 8 núcleos, e a sua representação será respectivamente:
#0, #1, #2, #3, #4, #5, #6 e #7
O pid ou comando, referem-se ao aplicativo que deseja-se fixar a respectiva CPU, o pid pode ser localizado com o comando ps, ou em vez de utilizar-se do pid execute o aplicativo diretamente com o taskset. Para fixar o processo proceda da seguinte forma:
$ taskset -c 0-2 -p 1507
$ taskset -c 0,1,2 /etc/init.d/ssh start
'-c 0-2' é a lista de CPU 0, 1 e 2;
'1507' é o pid do ssh;
'-c 0,12' é a lista de CPU 0, 1 e 2;
'/etc/init.d/ssh start' é o comando privilegiado;
E uma aplicação Zope/Plone ficaria assim:
$ taskset -c 0 $ZOPE_INSTANCE/bin/zopectl start
Referências: man taskset taskset --help

Comentários