Як встановити ліміт CPU для даного процесу постійно. Приємно і приємно не працюють


12

Є багато подібних питань, але жодне з них не допомагає мені в моїй проблемі.

У мене на сервері є ubuntu 11.10 (це настільна версія). У мене працює веб-сайт. Є дуже важливий процес, але його не потрібно виконувати з високим пріоритетом. Я хочу назавжди обмежити використання процесора для процесу , а не для користувача. Цей процес працює за допомогою функції exec (це функція php, а не системний процес).

Тому я бачу 2 варіанти: 1. Додайте якийсь обмеження щоразу, коли виконується функція. 2. Постійно обмежте використання процесора для цього процесу.

Я намагався використовувати "приємно" та cpulimit, але нічого, здається, не працює. Nice не має жодного ефекту, і cpulimit (з -e) каже: "не знайдено жодного цільового процесу".

Я досить початківець, тому, будь ласка, припустіть, що я майже нічого не знаю.


Скажіть, будь ласка, що ви спробували. cgroups можуть зробити це за вас.
Пантера

Щодо конфігурації, ви можете запустити cgsnapshot -sдля отримання інформації, не записуючи файл конфігурації вручну, останній з яких не рекомендується.
Мінгліян Лю

Ви хочете насправді придушити процес, тобто переконайтесь, що він ніколи не перевищує встановлену кількість часу?
Кен Шарп

Я використовував цей метод, і він працював на мене .. ubuntuforums.org/showthread.php?t=992706
Мустафа Салман

Відповіді:


19

За відсутності запитуваних деталей ...

Ось як я використовую групи в ubuntu.

Протягом цієї публікації вам потрібно буде змінити змінну "$ USER" на користувача, який виконує процес

Я додав інформацію для пам'яті, а також, що це буде FAQ, якщо вона вам не потрібна, не використовуйте її.

1) Встановити cgroup-bin

sudo apt-get install cgroup-bin

2) Перезавантажте. Зараз група cgroups знаходиться за адресою/sys/fs/cgroup

3) Створіть групу для свого користувача (власника процесу)

# Change $USER to the system user running your process.
sudo cgcreate -a $USER -g memory,cpu:$USER

4) Ваш користувач може керувати ними ресурсами. За замовчуванням користувачі отримують 1024 процесорних одиниць (акцій), тому для обмеження приблизно 10% процесора пам'ять знаходиться в байтах ...

# About 10 % cpu
echo 100 > /cgroup/cpu/$USER/cpu.shares

# 10 Mb
echo 10000000 > /cgroup/memory/$USER/memory.limit_in_bytes

5) Запустіть процес (змініть exec на cgexec)

# -g specifies the control group to run the process in
# Limit cpu
cgexec -g cpu:$USER command <options> &

# Limit cpu and memory
cgexec -g memory,cpu:$USER command <options> &

Конфігурація

Припустимо, що групи працюють для вас;)

Відредагуйте /etc/cgconfig.conf, додайте у свою власну групу

# Graphical
gksudo gedit /etc/cgconfig.conf

# Command line
sudo -e /etc/cgconfig.conf

Додайте у свою групу. Знову змініть $ USER на ім'я користувача, що володіє процесом.

group $USER {
# Specify which users can admin (set limits) the group
perm {    
    admin {
        uid = $USER;
    }
# Specify which users can add tasks to this group
    task {
        uid = $USER;
    }
}
# Set the cpu and memory limits for this group
cpu {
    cpu.shares = 100;
    }
memory {
    memory.limit_in_bytes = 10000000;
    }
}

Ви також можете вказати групи gid=$GROUP, /etc/cgconfig.conf добре коментується.

Тепер знову запустіть ваш процес cgexec -g cpu:$USER command <options>

Ви можете бачити свій процес (за PID) у /sys/fs/cgroup/cpu/$USER/tasks

Приклад

bodhi @ ufbt: ~ $ cgexec -g процесор: сон боді 100 &

[1] 1499 рік

bodhi @ ufbt: ~ $ cat / sys / fs / cgroup / cpu / bodhi / завдання

1499 рік

Для отримання додаткової інформації див: http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/


2
Мені вдалося закінчити частину 1. Це працює, але ви повинні додати інформацію, що процес обмежений лише тоді, коли для іншого процесу потрібен процесор / пам'ять. Це не очевидно - і мені знадобиться багато часу, щоб зрозуміти (як я починаю). Чи правильно я розумію, що "Конфігурація" - це збереження налаштувань навіть після перезавантаження?
Рафал

1
Радий, що ви розібралися. Існує трохи кривої навчання =) Так, конфігурація полягає в тому, щоб зберігати налаштування під час завантаження.
Пантера

Коли я використовую cgroup з командного рядка, він працює добре. Але коли я виконую ту саму команду з функції exec в php: (<? Php exec ("cgexec -g cpu: GroupHere NameOfProcess InputFile OutputFile"), вона не працює. Різниця полягає лише в тому, що в командному рядку я використовую файли, які знаходяться в папку, в яку я перебуваю, і з php я використовую довгий шлях до цих файлів. Будь-яка ідея, що може бути проблемою? Я використовую одного і того ж користувача в обох випадках.
Rafal,

1
@Rafal: Я не вважаю, що ваш перший коментар є правильним, пам'ять має бути обмеженою, навіть якщо жоден інший процес не займає багато пам'яті.
Flimm

1
@Flimm У процесі тестування цього рішення працювали лише два процеси - apache та процес, який слід обмежити. Коли підключення до апачі не було або було лише одне з'єднання з апашем, цей обмежений процес зайняв 100% процесора. Це обмежилося лише після того, як було підключено кілька підключень до apache (я зробив це, багато чого переосвітивши веб-сайт із веб-браузера). Тож, можливо, це було випадком, коли жодного іншого процесу не запущено.
Рафал
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.