Как заставить функцию cpuset.cpu_exclusive cpuset работать правильно
Я пытаюсь использовать ядро cpuset
изолировать мой процесс. Чтобы получить это, я следую инструкциям (2.1 Основное использование) из ядра doc cpusets, однако в моей среде это не сработало.
Я пробовал как на моем сервере centos7, так и на моем рабочем компьютере ubuntu16.04, но ни один из них не работал.
- версия ядра Centos:
[root@node ~]# uname -r
3.10.0-327.el7.x86_64
- Версия ядра Ubuntu:
4.15.0-46-generic
Я попробовал следующее.
root@Latitude:/sys/fs/cgroup/cpuset# pwd
/sys/fs/cgroup/cpuset
root@Latitude:/sys/fs/cgroup/cpuset# cat cpuset.cpus
0-3
root@Latitude:/sys/fs/cgroup/cpuset# cat cpuset.mems
0
root@Latitude:/sys/fs/cgroup/cpuset# cat cpuset.cpu_exclusive
1
root@Latitude:/sys/fs/cgroup/cpuset# cat cpuset.mem_exclusive
1
root@Latitude:/sys/fs/cgroup/cpuset# find . -name cpuset.cpu_excl
usive | xargs cat
0
0
0
0
0
1
root@Latitude:/sys/fs/cgroup/cpuset# mkdir my_cpuset
root@Latitude:/sys/fs/cgroup/cpuset# echo 1 > my_cpuset/cpuset.cpus
root@Latitude:/sys/fs/cgroup/cpuset# echo 0 > my_cpuset/cpuset.mems
root@Latitude:/sys/fs/cgroup/cpuset# echo 1 > my_cpuset/cpuset.cpu_exclusive
bash: echo: write error: Invalid argument
root@Latitude:/sys/fs/cgroup/cpuset#
Он просто напечатал ошибку bash: echo: write error: Invalid argument
, Google это, однако, я не могу получить правильные ответы.
Как я вставил выше, перед моей операцией я подтвердил, что cpuset
корневой путь включил функцию cpu_exclusive, и все процессоры не были исключены другими подчиненными процессорами.
Используя ps -o pid,psr,comm -p $PID
Я могу подтвердить, что процессор может быть назначен на какой-то процесс, если мне все равно cpu_exclusive
, Но я также доказал, что если cpu_exclusive
не установлен, тот же процессор может быть также назначен другим процессам.
Я не знаю, так ли это, потому что некоторые предварительные настройки пропущены.
То, что я ожидал, это "использование cpuset для эксклюзивного использования cpus". Может ли кто-нибудь дать какие-либо подсказки?
Спасибо большое.
1 ответ
Я считаю, что это неправильное понимание флага cpu_exclusive, как я и сделал. Вот документ https://www.kernel.org/doc/Documentation/cgroup-v1/cpusets.txt, цитата:
If a cpuset is cpu or mem exclusive, no other cpuset, other than
a direct ancestor or descendant, may share any of the same CPUs or
Memory Nodes.
так что одна из возможных причин у вас есть bash: echo: write error: Invalid argument
является то, что у вас включен какой-либо другой cpuset cgroup, и это конфликтует с вашими операциями echo 1 > my_cpuset/cpuset.cpu_exclusive
пожалуйста, беги find . -name cpuset.cpus | xargs cat
перечислить все целевые процессоры вашей группы.
Предположим, у вас есть 12 процессоров, если вы хотите установить cpu_exclusive из my_cpuset
Вам необходимо тщательно изменить все остальные группы, чтобы использовать cpus, например. 0-7, затем установите процессор my_cpuset
быть 8-11. После всех этих конфигураций cpus вы можете установить cpu_exclusive равным 1.
Но все же, другой процесс все еще может использовать процессор 8-11. Только задачи, которые принадлежат другим группам, не будут использовать процессор 8-11
для меня у меня был запущен какой-то докер-контейнер, который мешает мне установить мой процессор cpu_exclusive
с ядром doc, я не думаю, что можно использовать cpus исключительно самой cgroup. Один из подходов (я знаю, что этот подход работает в рабочей среде) заключается в том, что мы изолируем процессор и сами управляем сродством / процессором процессора.