TL; DR:
- use
for i in $(pgrep -w l3fwd); do echo $i > tasks; done
Detalhes:
Eu acho que no seu caso, o pgrep para atribuição de tarefa precisa de alguma melhoria para trabalhar com vários IDs sendo relatados.
Se ele retorna um PID, as coisas funcionam bem, mas se ele retornar mais, a interface do cgroup realmente reporta
pgrep: write error: Invalid argument
Talvez você tenha apenas simplificado seu relatório, mas verifique se todas as tarefas estão no arquivo de tarefas cgroups e use um loop (ou qualquer outra alternativa).
$ stress-ng -c 4
$ for i in $(pgrep stress); do echo $i > /sys/fs/cgroup/cpu/dpdk/tasks; done
$ cat tasks
28543
28544
[...]
Agora, para o seu caso em particular, o l3fwd tem um processo, mas três threads.
Então, pgrep
só informará o pid principal, os outros (loops principais) serão irrestritos.
Você pode ver quando criar e testar por meio de ps axlf
vs ps -eLf
e a pgrep
output.
. /usr/share/dpdk/dpdk-sdk-env.sh
mkdir -p l3fwd
make -C /usr/share/dpdk/examples/l3fwd "O=$(pwd)/l3fwd/"
# config /etc/dpdk/dpdk.conf and /etc/dpdk/interfaces
service dpdk restart
$(pwd)/l3fwd/l3fwd -l 1,2 --socket-mem 512 -- -p 0x3 -P --config="(0,0,1),(1,0,2)" --parse-ptype
Então você precisa pegar pgrep -w
e combiná-lo com o acima.
for i in $(pgrep -w l3fwd); do echo $i > tasks; done
E voila, de:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
29849 root 20 0 703052 4184 3336 R 200,7 0,0 0:17.36 l3fwd
para
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
29849 root 20 0 703052 4184 3336 R 29,8 0,0 0:34.11 l3fwd
Ainda assim, por favor, veja meu comentário inicial, exceto para experiências, por favor, para não limitar o consumo de CPU do DPDK - então, em vez disso, não use DPDK.