A configuração da afinidade do processo em execução com o conjunto de tarefas falha

5

Estou tentando limitar um processo a um determinado número de núcleos de CPU. De acordo com a página man do taskset e esta documentação , o seguinte deve funcionar:

[fedora@dfarrell-opendaylight-cbench-devel ~]$ taskset -pc 0 <PID>
pid 24395's current affinity list: 0-3
pid 24395's new affinity list: 0

Para simplificar, isso não funciona. Colocando o processo sob carga e observando top , ele fica em torno de 350% do uso da CPU (o mesmo que sem o conjunto de tarefas). Deve no máximo 100%.

Eu posso definir corretamente a afinidade via taskset -c 0 <cmd to start process> no tempo de spawn do processo. Usando cpulimit -p <PID> -l 99 também kinda-works . Em ambos os casos, colocar o processo sob a mesma carga resulta em um máximo de 100% do uso da CPU.

O que está errado aqui?

    
por dfarrell07 02.07.2014 / 20:58

4 respostas

5

Eu escrevi um script Python que simplesmente gira alguns tópicos e queima os ciclos da CPU. A ideia é testar o taskset, pois é bem simples.

#!/usr/bin/env python

import threading

def cycle_burner():
    while True:
        meh = 84908230489 % 323422

for i in range(3):
    thread = threading.Thread(target=cycle_burner)
    print "Starting a thread"
    thread.start()

Apenas executar o script Python consome cerca de 150% do uso da CPU.

[~/cbench]$ ./burn_cycles.py
Starting a thread
Starting a thread
Starting a thread

Iniciar meu script Python com o taskset funciona conforme o esperado. A parte superior de observação mostra o processo do Python indexado em 100% de uso.

[~/cbench]$ taskset -c 0 ./burn_cycles.py
Starting a thread
Starting a thread
Starting a thread

Curiosamente, iniciar o script Python e, em seguida, usar imediatamente o conjunto de tarefas para definir a afinidade do processo recém-iniciado limita o processo em 100%. Observe na saída que o planejador do Linux concluiu a execução dos comandos Bash antes de gerar os encadeamentos do Python. Então, o processo Python foi iniciado, então ele foi configurado para rodar na CPU 0, então gerou seus threads, que herdaram a afinidade apropriada.

[~/cbench]$ ./burn_cycles.py &; taskset -pc 0 'pgrep python'
[1] 8561
pid 8561's current affinity list: 0-3
pid 8561's new affinity list: 0
Starting a thread
[~/cbench]$ Starting a thread
Starting a thread

Esse resultado contrasta com esse método, que é exatamente o mesmo, mas permite que os threads do Python gerem antes de definir a afinidade do processo Python. Isso replica os resultados do "conjunto de tarefas não faz nada" que descrevi acima.

[~/cbench]$ ./burn_cycles.py &
[1] 8996
[~/cbench]$ Starting a thread
Starting a thread
Starting a thread
[~/cbench]$ taskset -pc 0 'pgrep python'
pid 8996's current affinity list: 0-3
pid 8996's new affinity list: 0

What's going wrong here?

Aparentemente, os segmentos gerados antes da alteração da afinidade do processo pai não herdam a afinidade de seu pai. Se alguém pudesse editar em um link para a documentação que explica isso, isso seria útil.

    
por 03.07.2014 / 23:12
4

Acho que você precisará chamar o taskset uma vez por thread, ou seja, usar ps -eL em vez de pgrep e canalizar isso para taskset -cp 0

ps -eLo cmd,tid | grep python | perl -pe 's/.* (\d+)$//' | xargs -n 1 taskset -cp 0

Isso chama a tarefa definida para todos os IDs de segmento.

    
por 09.10.2014 / 03:23
3

tente numactl com --physcpubind (ou -C ). A página man diz:

... The policy is set for command and inherited by all of its children.

(nas versões recentes de taskset também há uma opção -a que Sets or retrieves the CPU affinity of all the tasks (threads) for a given PID. , mas não está claro se isso também funciona para processos secundários de uma tarefa iniciada com taskset em oposição a modificar um processo já em execução )

    
por 12.01.2017 / 21:28
1

Eu uso a opção taskset -a com sucesso. Eu tenho um servidor chamado videoconverterd que consome muita CPU; top mostra

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 8991 root      20   0 1299472 346724  47380 S 385.7  4.3  42:41.37 videoconverterd

Depois de executar taskset -apc 0 8991 , a carga da CPU cai para

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 8991 root      20   0 1221832 293344  47380 S  99.7  3.7  49:13.28 videoconverterd

Estou executando o CentOS 7 com taskset versão 2.23.2.

    
por 26.11.2018 / 09:36

Tags