cgroups, не работающий правильно с многоядерным приложением DPDK

Я хочу ограничить использование ЦП приложения DPDK для тестирования. После некоторого быстрого поиска я нашел, что Контрольные группы (cgroups) могли бы удовлетворить моим потребностям. Таким образом, сначала я установил cgroup-bin.

sudo apt-get install cgroup-bin

И затем я создал подсистему путем создания каталога под /sys/fs/cgroup/cpu.

mkdir -v /sys/fs/cgroup/cpu/dpdk

И затем я пишу свои ограничения на использование ЦП к cpu.cfs_period_us и cpu.cfs_quota_us. Например, я хочу ограничить использование ЦП своего приложения DPDK в 30%.

cd /sys/fs/cgroup/cpu/dpdk
echo 1000000 > cpu.cfs_period_us
echo 300000 > cpu.cfs_quota_us

Этот подход работает при запущении приложений DPDK, который использует только одно ядро. Например, основные направляют заявление приложения в examples/skeleton

cd /home/wang/dpdk-17.02/examples/skeleton
make
./build/basicfwd -c 1 -n 2
pgrep basicfwd > /sys/fs/cgroup/cpu/dpdk/tasks

Я вижу в top то, что использование ЦП basicfwd на самом деле в 30%.

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                  
3346 root      20   0 4222472   3100   2780 R  30.0  0.0   0:56.35 basicfwd 

Однако, когда я запускаю приложение DPDK, которое использует больше чем одно ядро. Результат является немного странным. Например, я хочу работать, L3 направляют заявление приложения в examples/l3fwd.

cd /home/wang/dpdk-17.02/examples/l3fwd
make
./build/l3fwd -l 1,2 -n 2 -- -p 0x3 -P --config="(0,0,1),(1,0,2)" --parse-ptype
pgrep l3fwd > /sys/fs/cgroup/cpu/dpdk/tasks

Когда я открываюсь top, Я вижу что использование ЦП l3fwd в 130%, а не 30%, который является тем, что я ожидал.

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                  
3404 root      20   0 4305752   5092   2728 R 130.3  0.0   0:25.98 l3fwd  

Кажется, что ограничения вводятся только на одно ядро. Однако на этой странице это говорит, что квота и параметры периода работают на основе ЦП

CPU cfs_quota_us

указывает общее количество времени в микросекундах (µs, представленный здесь как "мы"), за которым все задачи в cgroup могут работать в течение одного периода (как определено CPU cfs_period_us). Как только задачи в cgroup израсходовали все время указанный квотой, их регулируют для остатка времени, указанного периодом, и не позволили работать до следующего периода. Если задачи в cgroup должны смочь получить доступ к единственному ЦП в течение 0,2 секунд из каждой 1 секунды, CPU cfs_quota_us набора к 200 000 и CPU cfs_period_us к 1000000. Обратите внимание, что квота и параметры периода работают на основе ЦП. Позволить процессу полностью использовать два центральных процессора, например, CPU cfs_quota_us набора к 200 000 и CPU cfs_period_us к 100 000.

Что я пропускаю здесь? Что я должен сделать для ограничения использования ЦП многоядерного приложения DPDK к менее чем 100%?

1
задан 28 February 2017 в 07:31

1 ответ

TL; DR:

  • использовать for i in $(pgrep -w l3fwd); do echo $i > tasks; done

Подробнее:

Я думаю в Вашем случае, pgrep для управления задачами для присвоения нужно некоторое улучшение для работы с несколькими идентификаторами, о которых сообщают.

Если это возвращается, вещь PID работает просто великолепно, но если это возвращается больше, интерфейс cgroup на самом деле сообщает

pgrep: write error: Invalid argument

Возможно, Вы только упростили свой отчет, но проверьте это все дважды, задачи находятся в cgroups файле задачи и используют цикл (или любое другое обходное решение).

$ stress-ng -c 4
$ for i in $(pgrep stress); do echo $i > /sys/fs/cgroup/cpu/dpdk/tasks; done
$ cat tasks 
28543
28544
[...]

Теперь для Вашего случая, в частности, l3fwd имеет один процесс, но три потока. Так pgrep только сообщит основной pid, другие (основные циклы) неограниченны. Вы видите, когда Вы создаете и тестируете его через ps axlf по сравнению с ps -eLf и pgrep вывод.

. /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

Таким образом, необходимо взять pgrep -w и объедините его с вышеупомянутым.

for i in $(pgrep -w l3fwd); do echo $i > tasks; done

И e вуаля, от:

  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

кому:

  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 

Все еще посмотрите, что мой первоначальный комментарий, кроме для экспериментов для не ограничения потребления ресурсов ЦП DPDK - затем вместо этого просто не используют DPDK.

1
ответ дан 7 December 2019 в 15:39

Другие вопросы по тегам:

Похожие вопросы: