2009-12-17 3 views
1

В ядре Linux 2.6.28-11 я использую setpriority для смещения количества процессорных времени, получаемых различными пользовательскими процессами. Пользователь 1 должен получить удвоенную мощность процессора для пользователя 2. Используя Linux-приоритет Linux, я назначил пользователю 2 более низкий приоритет (выше с точки зрения хороших значений). Когда я запускаю ту же самую программу через оболочку с компьютером под нагрузкой, выполнение пользователя 2 занимает вдвое больше времени, чем пользователь 1. Однако, если я запускаю программу как root, а затем использую setuid, seteuid, setgid, setegid и setgroups, чтобы стать пользователем 2 (компьютер снова загружается с той же самой программой, которая выполняется пользователем 1 таким же образом) , программы выполняют одинаковое количество времени для выполнения; Процесс пользователя 2 не планировался меньше, чем пользователь 1. Как я могу обойти это? Нужно ли мне устанавливать что-либо еще для планировщика, чтобы понять, что этот процесс теперь является частью другого пользователя?Групповое планирование Linux для пользователя, не применяемого к методу setuid-ed

Выполняемая программа находится в Python.

ответ

2

Правильно, это спроектированное поведение, даже если это не то, что вы хотите. Вы можете обновить свой собственный приоритет соответствует тому, что вы должны были унаследованы, если вы начали нормально:

/* C */ 
#include <sys/resource.h> 
int proc_prio = getpriority(PRIO_PROCESS, getpid()), 
    pgrp_prio = getpriority(PRIO_PGRP, getpgrp()), 
    user_prio = getpriority(PRIO_USER, getuid()); 
setpriority(PRIO_PROCESS, getpid(), 
    proc_prio < pgrp_prio ? pgrp_prio < user_prio ? user_prio 
                : pgrp_prio 
          : proc_prio < user_prio ? user_prio 
                : proc_prio); 

# Python 
import ctypes 
import os 
PRIO_PROCESS, PRIO_PGRP, PRIO_USER = 0, 1, 2 
libc = ctypes.CDLL('libc.so.6') 
libc.setpriority(PRIO_PROCESS, os.getpid(), 
    max(libc.getpriority(PRIO_PROCESS, os.getpid()), 
     libc.getpriority(PRIO_PGRP, os.getpgrp()), 
     libc.getpriority(PRIO_USER, os.getuid()))) 

Или, конечно, вы могли установить приоритет другого процесса, с соответствующими правами.

+0

Спасибо за разъяснение. У вас есть хороший материал для чтения, в котором рассказывается о том, как Linux обрабатывает и приоритизирует приоритеты? Учитывая ваше решение выше, что действительно работает, кажется, что невозможно гарантировать, что все процессы пользователя 1 будут использовать только x% от процессора, если у них есть какие-либо процессы, которые происходят из корневого процесса с вилкой, который был setuid- редактор Это правда? – BrainCore

+1

не имеют каких-либо хороших материалов для чтения, но единственное, что проверено 'setuid', это« я root »и имеет ли целевой идентификатор UID меньше, чем' RLIMIT_NPROC'? ». Другие ограничения и приоритет ресурсов не проверяются и не затрагиваются. * (на самом деле проверка «если не запрещена LSM, у меня есть« CAP_SETUID », и если я фактически изменяю реальный UID, у мишеней меньше процессов« RLIMIT_NPROC », или это указанный UID равен текущему реальному UID или сохранен UID? ») – ephemient

+0

В какой-то степени вы можете смотреть соединитель netlink для событий« PROC_EVENT_UID », чтобы применить эти исправления, но я думаю, что вы действительно хотите, чтобы на основе UID были созданы cpusets и планирование на основе групп. – ephemient