LINUX.ORG.RU

управление cgroups в release notify agent

 ,


1

2

Здравствуйте у меня вопрос, при использовании cgroups возможно добавлять свой release notify agent (простой баш скрипт), вопрос, существуют ли ограничения на возможности этого скрипта. Т.к. я заметил, что я не могу перенести процесс (и прочие процессы отфоркивающиеся от него) в не root цгруппу в любом контроллере. При этом не ясно почему, поскольку данный процесс в ps выглядит как обычный, у него не realtime scheduler (т.к. у меня в ядре нет поддержки cgroups для realtime процессов). Сам же lock на цгруппы снимается при запуске скрипта, и потом выставляется назад.

Есть ли у кого-нибудь идеи как отлаживать данную ситуацию.

Я конечно могу обойти этот вопрос, но это портебует наличия userspace демона, что хотелось бы обойти.

★★★★★

Ответ на: комментарий от ttnl

есть конкретные замечания - пиши конеректные, лучше сразу с сообщением по теме, спасибо.

qnikst ★★★★★
() автор топика
Ответ на: комментарий от qnikst

Я бы, может быть, и ответил, но зачем помогать, когда ты сам себе не хочешь помочь.

В следующий раз излагай свой вопрос компактно и связно.

ttnl ★★★★★
()
Ответ на: комментарий от ttnl

Если можешь помочь, то всё же помоги, т.к. я не вижу, что в моём сообщении неясно.

qnikst ★★★★★
() автор топика
Ответ на: комментарий от ttnl

вот урощенная версия вопроса:

можно ли процесс запускаемый ядром при смерти всех процессов в cgroup и его дочерние процессы переместить в другую подгруппу, если да - то как, если нет - то почему?

qnikst ★★★★★
() автор топика

не могу перенести процесс (и прочие процессы отфоркивающиеся от него) в не root цгруппу в любом контроллере

Выдаёт ошибку? Какую? Если руками из консольки попытаться сделать то же самое то рботает?

Вообще, эти performance counters сущий кошмар, в случае проблем зачастую проще в сырцах поковыряться.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Выдаёт ошибку? Какую? Если руками из консольки попытаться сделать то же самое то рботает?

echo: invalid argument. Из консольки работает, но это другой случай.

Вообще, эти performance counters сущий кошмар, в случае проблем зачастую проще в сырцах поковыряться.

у меня нету опыта ковыряния в ядрокоде.

qnikst ★★★★★
() автор топика
Ответ на: комментарий от qnikst

invalid argument

Ух, всё что угодно может означать. В первую очередь я бы проверил что такие pid-ы существуют и что существует cgroup.

Из консольки работает, но это другой случай.

Не понимаю, почему другой?

у меня нету опыта ковыряния в ядрокоде.

у меня его тоже не было, пришлось осваивать :(.

Я бы с тобой поковырялся над проблемой, но дел много, увы.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Ух, всё что угодно может означать. В первую очередь я бы проверил что такие pid-ы существуют и что существует cgroup.

точно существует и то и другое

Не понимаю, почему другой?

консолька это usermode процесс, а вызов release agent это процесс ядра запускаемый usermode_helper.

у меня его тоже не было, пришлось осваивать :(.

ну мне пока это не сильно обязательно, так что пока есть желание не влезать.

qnikst ★★★★★
() автор топика
Ответ на: комментарий от true_admin

в общем release notify agent это процесс ядра (kthreadd) для таких процессов невозможно управление их cgroups

	/*
	 * Workqueue threads may acquire PF_NO_SETAFFINITY and become
	 * trapped in a cpuset, or RT worker may be born in a cgroup
	 * with no rt_runtime allocated.  Just say no.
	 */
	if (tsk == kthreadd_task || (tsk->flags & PF_NO_SETAFFINITY)) {
		ret = -EINVAL;
		rcu_read_unlock();
		goto out_unlock_cgroup;
	}

«сбежать» из процесса ядра в пространство пользователя (userspace), насколько мне известно невозможно, таким образом описанная мной задача не решается в том виде, в котором я её пытался решить.

на #kernelnewbies мой вопрос всё ещё не отвечен, но думаю тут уже все ясно.

qnikst ★★★★★
() автор топика
Ответ на: комментарий от qnikst

Ммм, ты уверен что такое вообще возможно — вызвать userspace программу как поток ядра?

Я вот в cgroup_release_agent вижу call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC); . Судя по всему, оно должно быть в userspace.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

нет, не покажу (искаль долго), но по всем симптомам это так.

ну или как снова до этого доберусь.

qnikst ★★★★★
() автор топика
Последнее исправление: qnikst (всего исправлений: 1)
Ответ на: комментарий от true_admin
ps -FcM
LABEL                           UID        PID  PPID CLS PRI    SZ   RSS PSR STIME TTY      STAT   TIME CMD
-                               root     23583   522 TS   19  5065  1656   1 12:51 ?        S      0:00 /bin/sh /lib64/rc/sh/cgroup-release-agent.sh /service1


USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   4224   620 ?        Ss   Jul21   0:04 init [3]  
root         2  0.0  0.0      0     0 ?        S    Jul21   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    Jul21   0:00 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S<   Jul21   0:00 [kworker/0:0H]
root         7  0.0  0.0      0     0 ?        S<   Jul21   0:00 [kworker/u:0H]
root         8  0.0  0.0      0     0 ?        S    Jul21   0:00 [migration/0]
root         9  0.0  0.0      0     0 ?        S    Jul21   0:00 [migration/1]
root        11  0.0  0.0      0     0 ?        S<   Jul21   0:00 [kworker/1:0H]
root        12  0.0  0.0      0     0 ?        S    Jul21   0:00 [ksoftirqd/1]
root        13  0.0  0.0      0     0 ?        S    Jul21   0:00 [migration/2]
root        15  0.0  0.0      0     0 ?        S<   Jul21   0:00 [kworker/2:0H]
root        16  0.0  0.0      0     0 ?        S    Jul21   0:00 [ksoftirqd/2]
root        17  0.0  0.0      0     0 ?        S    Jul21   0:00 [migration/3]
root        19  0.0  0.0      0     0 ?        S<   Jul21   0:00 [kworker/3:0H]
root        20  0.0  0.0      0     0 ?        S    Jul21   0:00 [ksoftirqd/3]
root        21  0.0  0.0      0     0 ?        S<   Jul21   0:00 [cpuset]
root        22  0.0  0.0      0     0 ?        S<   Jul21   0:00 [khelper]
root        23  0.0  0.0      0     0 ?        S    Jul21   0:00 [kdevtmpfs]
root        24  0.0  0.0      0     0 ?        S<   Jul21   0:00 [netns]
root       138  0.0  0.0      0     0 ?        S    Jul21   0:00 [bdi-default]
root       140  0.0  0.0      0     0 ?        S<   Jul21   0:00 [kblockd]
root       272  0.0  0.0      0     0 ?        S<   Jul21   0:00 [ata_sff]
root       280  0.0  0.0      0     0 ?        S<   Jul21   0:00 [md]
root       397  0.0  0.0      0     0 ?        S    Jul21   0:06 [kswapd0]
root       398  0.0  0.0      0     0 ?        S    Jul21   0:00 [fsnotify_mark]
root       399  0.0  0.0      0     0 ?        S<   Jul21   0:00 [xfsalloc]
root       400  0.0  0.0      0     0 ?        S<   Jul21   0:00 [xfs_mru_cache]
root       401  0.0  0.0      0     0 ?        S<   Jul21   0:00 [xfslogd]
root       402  0.0  0.0      0     0 ?        S<   Jul21   0:00 [crypto]
root       501  0.0  0.0      0     0 ?        S    Jul21   0:00 [scsi_eh_0]
root       504  0.0  0.0      0     0 ?        S    Jul21   0:00 [scsi_eh_1]
root       507  0.0  0.0      0     0 ?        S    Jul21   0:00 [scsi_eh_2]
root       510  0.0  0.0      0     0 ?        S    Jul21   0:00 [scsi_eh_3]
root       513  0.0  0.0      0     0 ?        S    Jul21   0:00 [scsi_eh_4]
root       516  0.0  0.0      0     0 ?        S    Jul21   0:00 [scsi_eh_5]
root       521  0.0  0.0      0     0 ?        S    Jul21   0:00 [kworker/u:4]
root       522  0.0  0.0      0     0 ?        S    Jul21   0:03 [kworker/u:5]
root       537  0.0  0.0      0     0 ?        S<   Jul21   0:00 [kpsmoused]
root       555  0.0  0.0      0     0 ?        S<   Jul21   0:00 [deferwq]
root       564  0.0  0.0      0     0 ?        S<   Jul21   0:08 [kworker/0:1H]
root      1107  0.0  0.0      0     0 ?        S<   Jul21   0:00 [kdmflush]
root      1113  0.0  0.0      0     0 ?        S<   Jul21   0:00 [kdmflush]
root      1119  0.0  0.0      0     0 ?        S<   Jul21   0:00 [kdmflush]
root      1127  0.0  0.0      0     0 ?        S<   Jul21   0:00 [kdmflush]
root      1133  0.0  0.0      0     0 ?        S<   Jul21   0:00 [kdmflush]
root      1139  0.0  0.0      0     0 ?        S<   Jul21   0:00 [kdmflush]
root      1147  0.0  0.0      0     0 ?        S<   Jul21   0:00 [kdmflush]
root      1153  0.0  0.0      0     0 ?        S<   Jul21   0:00 [kdmflush]
root      1159  0.0  0.0      0     0 ?        S<   Jul21   0:00 [kdmflush]
root      1168  0.0  0.0      0     0 ?        S<   Jul21   0:00 [kdmflush]
root      1176  0.0  0.0      0     0 ?        S<   Jul21   0:00 [kdmflush]
root      1182  0.0  0.0      0     0 ?        S<   Jul21   0:00 [kdmflush]
root      1190  0.0  0.0      0     0 ?        S<   Jul21   0:00 [kdmflush]
root      1210  0.0  0.0      0     0 ?        S<   Jul21   0:00 [kworker/1:1H]
root      1260  0.0  0.0      0     0 ?        S<   Jul21   0:00 [reiserfs]
root      1287  0.0  0.0      0     0 ?        S<   Jul21   0:00 [kworker/2:1H]
root      1698  0.0  0.0  31312  1140 ?        Ss   Jul21   0:00 /sbin/udevd --daemon
root      1733  0.0  0.0      0     0 ?        S    Jul21   0:00 [khubd]
root      1741  0.0  0.0      0     0 ?        S<   Jul21   0:00 [cfg80211]
root      1744  0.0  0.0      0     0 ?        S<   Jul21   0:00 [kworker/3:1H]
root      1745  0.0  0.0      0     0 ?        S<   Jul21   0:00 [kvm-irqfd-clean]
root      1747  0.0  0.0      0     0 ?        S<   Jul21   0:00 [ktpacpid]
root      1753  0.0  0.0      0     0 ?        S<   Jul21   0:00 [hd-audio0]
root      1979  0.0  0.0      0     0 ?        S    Jul21   0:07 [flush-253:1]
message+  2494  0.0  0.0  19572   244 ?        Ss   Jul21   0:00 /usr/bin/dbus-daemon --system
root      2682  0.0  0.0   8612   124 ?        Ss   Jul21   0:00 dhcpcd -m 4 br0
root      2755  0.0  0.0  24832  1140 ?        Ss   Jul21   0:12 /usr/sbin/ntpd -p /var/run/ntpd.pid
root      2787  0.0  0.0  58464   800 tty1     Ss   Jul21   0:00 /bin/login --       
root      2788  0.0  0.0  14220   768 tty2     Ss+  Jul21   0:00 /sbin/agetty 38400 tty2 linux
root      2789  0.0  0.0  14220   772 tty3     Ss+  Jul21   0:00 /sbin/agetty 38400 tty3 linux
root      2790  0.0  0.0  14220   768 tty4     Ss+  Jul21   0:00 /sbin/agetty 38400 tty4 linux
root      2791  0.0  0.0  14220   772 tty5     Ss+  Jul21   0:00 /sbin/agetty 38400 tty5 linux
root      2792  0.0  0.0  14220   772 tty6     Ss+  Jul21   0:00 /sbin/agetty 38400 tty6 linux
qnikst    2794  0.0  0.0  21996  1656 tty1     S    Jul21   0:00 -bash
qnikst    2798  0.0  0.0  16008   568 tty1     S+   Jul21   0:00 xinit xmonad
root      2799  0.6  1.0 206588 43200 tty7     Ssl+ Jul21  27:02 X :0
qnikst    2805  0.0  0.0  13436  1376 tty1     S    Jul21   0:00 sh /home/qnikst/.xinitrc xmonad
qnikst    2806  0.0  0.0  13436  1404 tty1     S    Jul21   0:00 /bin/bash /home/qnikst/bin/run-xmonad
qnikst    2809  0.0  2.4 346652 97572 tty1     S    Jul21   2:13 urxvtd -q -o -f
qnikst    2811  0.0  0.0  22124  2136 pts/0    Ss+  Jul21   0:00 bash
qnikst    2819  0.0  0.0  24436   248 tty1     S    Jul21   0:00 dbus-launch --sh-syntax --exit-with-session
qnikst    2820  0.0  0.0  19688   532 ?        Ss   Jul21   0:00 /usr/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
qnikst    2823  0.2  0.2  60476 10312 tty1     S    Jul21  12:50 /home/qnikst/.xmonad/xmonad-x86_64-linux
qnikst    2828  0.0  0.0  14632     0 ?        Ss   Jul21   0:00 ssh-agent
qnikst    2829  0.0  0.0  15040   208 ?        Ss   Jul21   0:07 gpg-agent --daemon
qnikst    2841  0.0  0.0  13436  1196 ?        S    Jul21   0:00 /bin/bash
qnikst    2844  2.9  1.8 430720 74060 ?        SLl  Jul21 125:46 skype
qnikst    2911  0.0  0.0  21996  1628 pts/1    Ss   Jul21   0:00 bash
qnikst    2915  0.0  0.4 323116 19100 pts/1    Sl+  Jul21   1:31 ekg2
qnikst    2941  0.0  0.0 187528  1184 ?        Sl   Jul21   0:00 /usr/libexec/at-spi-bus-launcher
qnikst    3445  0.0  0.0  21996  1628 pts/4    Ss   Jul21   0:00 bash
root      3449  0.0  0.0  45652   904 pts/4    S    Jul21   0:00 su
root      3451  0.0  0.0  22256  2256 pts/4    S+   Jul21   0:00 bash
qnikst    7384  0.0  0.0  22120  2288 pts/6    Ss   Jul23   0:00 bash
qnikst    9996  0.0  0.0  21996  2112 pts/8    Ss   Jul23   0:00 bash
root     10002  0.0  0.0  45652  1252 pts/8    S    Jul23   0:00 su
root     10009  0.0  0.0  22124  2300 pts/8    S+   Jul23   0:00 bash
qnikst   12266  0.0  0.0  22116  2440 pts/3    Ss+  Jul23   0:00 bash
qnikst   12938  0.0  0.0  22456  2744 pts/2    Ss   Jul22   0:00 bash
qnikst   13286  0.0  0.0  49248  1532 ?        S    Jul22   0:00 /usr/libexec/gconfd-2
root     17718  0.0  0.0      0     0 ?        S    11:33   0:00 [kworker/3:2]
root     18251  0.0  0.0      0     0 ?        S    11:41   0:00 [kworker/0:1]
root     19033  0.0  0.0      0     0 ?        S    11:53   0:00 [kworker/0:0]
root     19218  0.0  0.0      0     0 ?        S    11:56   0:00 [kworker/1:1]
root     20570  0.0  0.0      0     0 ?        S    12:18   0:00 [kworker/2:2]
root     21155  0.0  0.0      0     0 ?        S    12:26   0:00 [flush-253:0]
root     21592  0.0  0.0      0     0 ?        S    12:30   0:00 [kworker/3:0]
root     22249  0.0  0.0      0     0 ?        S    12:36   0:00 [kworker/1:2]
qnikst   22465  0.0  0.1  51848  6948 pts/6    S+   12:39   0:00 vi kernel/cgroup.c
root     22570  0.0  0.0      0     0 ?        S    12:41   0:00 [kworker/0:3]
root     22605  0.0  0.0      0     0 ?        S    12:41   0:00 [kworker/2:1]
root     22938  0.0  0.0      0     0 ?        S    12:46   0:00 [kworker/2:0]
root     22940  0.0  0.0      0     0 ?        S    12:46   0:00 [kworker/2:3]
root     22975  0.0  0.0      0     0 ?        S    12:47   0:00 [kworker/1:0]
root     23071  0.0  0.0      0     0 ?        S    12:48   0:00 [kworker/3:1]
root     23079  0.0  0.0      0     0 ?        S    12:48   0:00 [kworker/0:2]
root     23204  0.0  0.0      0     0 ?        S    12:50   0:00 [flush-253:6]
root     23574  0.0  0.0      0     0 ?        S    12:51   0:00 [flush-253:3]
root     23583  0.0  0.0  20260  1656 ?        S    12:51   0:00 /bin/sh /lib64/rc/sh/cgroup-release-agent.sh /service1
root     23585  0.0  0.0  17524  1204 ?        R    12:51   0:00 ps awwux 23583
qnikst   29600  0.0  0.0  13436  1196 ?        S    Jul22   0:00 /bin/bash
qnikst   29608  7.2 30.2 2096408 1193392 ?     Sl   Jul22 194:29 firefox
qnikst   29767  0.1  0.1 263420  4108 ?        Sl   Jul22   2:41 /usr/lib64/firefox/plugin-container /opt/google/talkplugin/libnpgoogletalk.so -greomni /usr/lib64/firefox/omni.ja -appomni /usr/lib64/firefox/browser/omni.ja -appdir /usr/lib64/firefox/browser 29608 plugin
qnikst   29770  0.0  0.0 467260  3764 ?        Sl   Jul22   0:47 /opt/google/talkplugin/GoogleTalkPlugin
qnikst   30486  2.3  5.7 837336 228096 ?       SLl  Jul22  62:37 /usr/lib64/firefox/plugin-container /opt/Adobe/flash-player/flash-plugin/libflashplayer.so -greomni /usr/lib64/firefox/omni.ja -appomni /usr/lib64/firefox/browser/omni.ja -appdir /usr/lib64/firefox/browser 29608 plugin
qnikst   31250  0.0  0.1  51368  4028 pts/2    S+   Jul23   0:00 vi cgroups
qnikst   32427  0.0  0.0  22212  2232 pts/5    Ss   Jul22   0:02 bash
qnikst   32494  0.0  0.0  14632   524 ?        Ss   Jul22   0:00 ssh-agent
qnikst ★★★★★
() автор топика
Последнее исправление: qnikst (всего исправлений: 2)
Ответ на: комментарий от qnikst

Кстати, а что твой скрипт делает? Судя по https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt notify on release запускается когда не остаётся никаких процессов в текущей группе и когда удаляются все дочерние группы.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

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

qnikst ★★★★★
() автор топика
Ответ на: комментарий от true_admin

зачем, если я из говна и палок^W^W^W openrc и пары скриптов соберу вещь не хуже. Тем более почти всё и так работает. Тем более в системд этих палок и клея не меньше, чем я использую.

qnikst ★★★★★
() автор топика
Последнее исправление: qnikst (всего исправлений: 2)
Ответ на: комментарий от qnikst

Хм, а разве он не умеет из коробки мониторинг и cgroup?

true_admin ★★★★★
()
Ответ на: комментарий от qnikst

По всей видимости причина в следующем.

Запуск usermode_helper происходит из рабочей очереди. У рабочей очереди стоит флаг PF_NO_SETAFFINITY, поскольку он всегда есть у рабочих очередей.

Далее, после kthread_create, helper его наследует, т.к. при fork()->copy_process() в функции copy_flags() PF_NO_SETAFFINITY не очищается:

static void copy_flags(unsigned long clone_flags, struct task_struct *p)
{
        unsigned long new_flags = p->flags;

        new_flags &= ~(PF_SUPERPRIV | PF_WQ_WORKER);
        new_flags |= PF_FORKNOEXEC;
        p->flags = new_flags;
}

Запускается ядерный процесс call_helper(), он делает do_exec. exec этот флаг тоже не трогает, поэтому твой скрипт тоже обладает флагом PF_NO_SETAFFINITY.

Когда ты пытаешься поменять cgroup, то это не получается, поскольку в attach_task_by_pid() стоит проверка:

if (tsk == kthreadd_task || (tsk->flags & PF_NO_SETAFFINITY)) {
                ret = -EINVAL;
                rcu_read_unlock();
                goto out_unlock_cgroup;
        }

-EINVAL берется отсюда.

ttnl ★★★★★
()
Последнее исправление: ttnl (всего исправлений: 1)
Ответ на: комментарий от true_admin

А можно посмореть код скрипта?

Его указывают при монтировании или записывают после в файл release_agent. Пользовательский выбор.

Спроси у TC, что он там напрограммировал.

ttnl ★★★★★
()
Ответ на: комментарий от ttnl

У меня есть подозрение что это не запрет на манипуляции с cgroup, это запрет добавления в cgroup тасков у которых есть этот флаг. Но сходу из сырцов я этого не понял.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

я же писал, что это запрет на перенос «подобных» тасков в другие цгруппы. Ну или должен был это написать.

qnikst ★★★★★
() автор топика
Ответ на: комментарий от ttnl

=) можно ли:

а). просмотреть установлен ли флаг PF_NO_SETAFFINITY из userspace процесса

б). можно ли изменить данный флаг из userspace процесса?

qnikst ★★★★★
() автор топика
Ответ на: комментарий от ttnl

спасибо. Значит информация, которую я нашёл, подтверждается. B спасибо за разъяснение с PF_NO_SETAFFINITY, а то я к неправильному выводу о причине невозможности перемещения процесса пришёл.

qnikst ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.