Как установить ограничение процессора для данного процесса навсегда. 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.