Как установить ограничение процессора для данного процесса навсегда. Cpulimit и приятно не работают


12

Есть много похожих вопросов, но ни один из них не помогает мне решить мою проблему.

У меня есть Ubuntu 11.10 на сервере (это настольная версия). У меня есть работающий сайт на нем. Есть один процесс, который очень важен, но не должен запускаться с высоким приоритетом. Я хочу навсегда ограничить использование процессора для процесса , а не для пользователя. Этот процесс запускается функцией exec (это функция php, а не системный процесс).

Итак, я вижу 2 варианта: 1. Добавлять какое-то ограничение при каждом выполнении функции. 2. Ограничить использование процессора навсегда для этого процесса.

Я пытался использовать «хороший» и cpulimit, но, похоже, ничего не работает. Ницца не имеет никакого эффекта, и cpulimit (с -e) говорит: «целевой процесс не найден».

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


Можете ли вы рассказать нам, что вы пытались. cgroups может сделать это для вас.
— Пантера

Что касается конфигурации, вы можете запустить ее, cgsnapshot -sчтобы получить информацию, не записывая файл конфигурации вручную, последний из которых не рекомендуется.
— Mingliang Liu

Хотите ли вы на самом деле задушить процесс, т.е. убедиться, что он никогда не превышает установленное количество времени?
— Кен Шарп

Я использовал этот метод, и он работал для меня .. ubuntuforums.org/showthread.php?t=992706
— Мустафа Салман

Ответы:


19

При отсутствии запрошенных реквизитов ...

Вот как я использую cgroups на Ubuntu.

В этом посте вам нужно будет изменить переменную «$ USER» на пользователя, выполняющего процесс

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

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

пример

бодхи @ ufbt: ~ $ cgexec -g процессор: бодхи спать 100 &

[1] 1499

bodhi @ ufbt: ~ $ cat / sys / fs / cgroup / cpu / bodhi / tasks

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 Когда я тестировал это решение, работали только 2 процесса - apache и процесс, который должен быть ограничен. Когда не было установлено соединение Apache или было только одно соединение с Apache, этот ограниченный процесс занимал 100% процессорного времени. Он стал ограниченным только после нескольких подключений к apache (я сделал это, многократно обновляя веб-сайт из веб-браузера). Так что, возможно, это был случай, когда другой процесс не выполнялся.
— Рафал
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.