isolcpus - ligação não funciona

2

Estou usando o isolcpus para isolar núcleos. Eu gostaria de vincular segmentos específicos para núcleos, mas não está funcionando. Os threads são movidos para diferentes núcleos depois que eu os vinculo.

Os núcleos 13, 14 e 15 estão isolados:

$ cat /proc/cmdline
ro root=/dev/mapper/vg0-root rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=vg0/swaprd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=137M@0M rd_NO_DM  KEYBOARDTYPE=pc KEYTABLE=us rd_LVM_LV=vg0/root rhgb quiet audit=0 intel_idle.max_cstate=0 console=tty0 console=ttyS1,115200 printk.time=1 processor.max_cstate=1 idle=poll biosdevname=0  isolcpus=13-15

top -H -p pgrep -u prusr12 Ser -d 1 mostra isto: 5017 e 5018 deveriam ter sido ligados a 14 e 15 e 5014 e 5016 deveriam ter sido em 13.

PID  USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+   P COMMAND
5017 prusr12   20   0 1312m 1.1g 1.1g R 99.9  0.9   9:53.93  5 Server-3.10.
5018 prusr12   20   0 1312m 1.1g 1.1g R 99.9  0.9  10:08.88  7 Server-3.10.
5014 prusr12   20   0 1312m 1.1g 1.1g S  0.0  0.9   0:00.40  2 Server-3.10.
5016 prusr12   20   0 1312m 1.1g 1.1g S  0.0  0.9   0:01.04  4 Server-3.10.

A linha de comando é esta:

sg devuser "taskset -c 13 /releases/3.10.0/bin/Server-3.10.0 -n X -e DEV -p DEFAULT > /logs/ServerDevPR_DEFAULT.out 2>&1 &"

Existem 4 threads no processo. Eu quero o segmento principal para iniciar em 13, portanto, taskset-c 13. Então, dois segmentos são spawed e vinculá-los a 14 e 15. Eu vejo que os segmentos foram ligados a 14 e 15, mas depois eles foram movidos para outros núcleos . pthread_setaffinity_np () está sendo usado para ligar os threads aos núcleos.

Registre depois que eu ligar os threads para 14 e 15: CpuSet retornado por pthread_getaffinity_np () contido: CPU 14 CpuSet retornado por pthread_getaffinity_np () continha: CPU 15

Detalhes do sistema:

$ uname -a
Linux host123 2.6.32-573.12.1.el6.x86_64 #1 SMP Mon Nov 23 12:55:32 EST 2015 x86_64 x86_64 x86_64 GNU/Linux

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                16
On-line CPU(s) list:   0-15
Thread(s) per core:    1
Core(s) per socket:    8
Socket(s):             2
NUMA node(s):          2
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 63
Stepping:              2
CPU MHz:               3199.847
BogoMIPS:              6399.06
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              20480K
NUMA node0 CPU(s):     0-7
NUMA node1 CPU(s):     8-15

O que poderia dar errado? Obrigado pelo seu tempo.

    
por Prashanth 31.03.2017 / 19:38

1 resposta

0

Desde que trabalhei com isolamento de CPU no passado, criei uma ferramenta para me ajudar, pois descobri da maneira mais difícil que era surpreendentemente complexo fazer a coisa certa. A ferramenta está disponível aqui:

link

É o script partrt que você deve analisar e inspirar-se.

Uma advertência: pode não funcionar bem em conjunto com o systemd fora da caixa, simplesmente não testei isso.

Mas, quanto à sua pergunta específica, meu palpite é que você precisa definir /sys/fs/cgroup/cpuset/cpuset.sched_load_balance para 0 para não permitir o balanceamento de carga do SMP. Agora isso vai desabilitar isso para tudo, o que pode não ser o que você quer.

Minha ferramenta ( partrt ) tenta dividir as CPUs em dois conjuntos: um conjunto com o qual você deseja trabalhar e o outro conjunto que tenta isolar cada CPU dentro do conjunto.

    
por 16.08.2017 / 19:03