#linux-kernel #ubuntu-16.04 #centos7 #cgroups #cpuset
#linux-ядро #ubuntu-16.04 #centos7 #cgroups #cpuset
Вопрос:
Я пытаюсь использовать ядро cpuset
для изоляции моего процесса. Чтобы получить это, я следую инструкциям (2.1 Basic Usage) из kernel 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
.
Однако, погуглив, я не могу получить правильные ответы.
Как я вставил выше, перед моей операцией я подтвердил, что cpuset
корневой путь включил функцию cpu_exclusive и все процессоры не были исключены другим вспомогательным процессорным набором.
Используя ps -o pid,psr,comm -p $PID
, я могу подтвердить, что процессоры могут быть назначены какому-либо процессу, если мне все равно cpu_exclusive
. Но я также доказал, что если cpu_exclusive
не установлено, те же процессоры также могут быть назначены другим процессам.
Я не знаю, связано ли это с тем, что пропущены некоторые предварительные настройки.
Чего я ожидал, так это «использования cpuset для получения эксклюзивного использования процессоров». Может ли кто-нибудь дать какие-либо подсказки?
Большое спасибо.
Комментарии:
1. Достигли ли вы своей цели (используя cpuset для получения эксклюзивного использования процессоров)? Я провел тот же тест в Ubuntu16.04, я обнаружил, что на ядрах все еще запущены некоторые пользовательские процессы, которые я хочу изолировать. Я уже настроил эти пользовательские процессы на другой процессорный набор. Есть какой-нибудь намек? Спасибо.
Ответ №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
, заключается в том, что у вас включен какой-то другой набор процессоров cgroup, и это конфликтует с вашими операциями echo 1 > my_cpuset/cpuset.cpu_exclusive
пожалуйста, запустите find . -name cpuset.cpus | xargs cat
, чтобы перечислить все целевые процессоры вашей cgroup.
предположим, у вас 12 процессоров, если вы хотите установить cpu_exclusive из my_cpuset
, вам нужно тщательно изменить все остальные группы, чтобы использовать процессоры, например, 0-7, затем установите процессоры из my_cpuset
равными 8-11. После всех этих конфигураций процессоров вы можете установить cpu_exclusive равным 1.
Но, тем не менее, другой процесс все еще может использовать cpu 8-11. Только задачи, принадлежащие другим контрольным группам, не будут использовать cpu 8-11
что касается меня, у меня был запущен какой-то контейнер docker, который не позволяет мне настроить мой процессорный набор cpu_exclusive
что касается документа о ядре, я не думаю, что возможно использовать процессоры исключительно самой cgroup. Один из подходов (я знаю, что этот подход работает на производстве) заключается в том, что мы изолируем процессоры и сами управляем привязкой к процессору / cpuset
Комментарии:
1. Спасибо за ваш ответ. Пожалуйста, простите мою глупость, возможно, моя ситуация не такая, с какой вы столкнулись. Из того, что я указал выше, я просто использую скрипт
find . -name cpuset.cpu_exclusive | xargs cat
, чтобы подтвердить, есть ли какой-либо процесс, который использует исключительно ядра процессора. В нем говорится, что ни один процесс этого не сделал. Итак, мне интересно, есть ли какие-либо ситуации, которые я не учел?2. немного обновите ответ, пожалуйста, запустите
find . -name cpuset.cpus | xargs cat
, чтобы перечислить все целевые процессоры вашей cgroups. если они перекрываются, вы не сможете установить cpu_exclusive.3. Да, отлично, это действительно сработало, как вы советовали. Спасибо, что разрешили мое замешательство. Но все же я думаю, что было бы разумно, чтобы cgpoup модифицировал другие процессорные наборы для меня после того, как я сделаю my_cpusets эксклюзивными. Причина, по которой я так думаю, в том, что я прочитал статью: kubernetes cpu-management , в которой говорилось, что kubelet может заставить указанный модуль принудительно потреблять некоторые ядра. Еще раз спасибо.
4. имхо, я не думаю, что разумно просить cgroup сделать это. если это изменяет конфигурации в родительской / сестринской области, то при постоянных изменениях из-за различных приложений / требований пользователей подмножество cgroup может быть беспорядочным. для этого нам нужно решение, подобное k8s, а cgroup просто сосредоточится на своей собственной функции в ограниченной области.
5. Объяснение вполне разумное, и я должен покопаться в управлении k8s, потому что, похоже, я не понял его полностью. Еще раз спасибо за ваше внимание.