Я хочу ограничить использование ЦП приложения 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%?
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.