Я думаю, что в Linux нет решения ограничить использование процессора, но есть приемлемый способ ограничить любой процесс определенным использованием процессора: http://ubuntuforums.org/showthread.php?t=992706
В случае, если они удаляют информацию, вот снова
УСТАНОВИТЬ ПАКЕТЫ
Установить пакет cpulimit.
Код:
sudo apt-get install cpulimit
Установить пакет gawk.
Код:
sudo apt-get install gawk
СОЗДАТЬ ДЕМОННЫЙ ФАЙЛ CPULIMIT
Откройте текстовый редактор с правами суперпользователя и сохраните приведенный ниже текст скрипта демона в новый файл /usr/bin/cpulimit_daemon.sh
Код:
#!/bin/bash
# ==============================================================
# CPU limit daemon - set PID's max. percentage CPU consumptions
# ==============================================================
# Variables
CPU_LIMIT=20 # Maximum percentage CPU consumption by each PID
DAEMON_INTERVAL=3 # Daemon check interval in seconds
BLACK_PROCESSES_LIST= # Limit only processes defined in this variable. If variable is empty (default) all violating processes are limited.
WHITE_PROCESSES_LIST= # Limit all processes except processes defined in this variable. If variable is empty (default) all violating processes are limited.
# Check if one of the variables BLACK_PROCESSES_LIST or WHITE_PROCESSES_LIST is defined.
if [[ -n "$BLACK_PROCESSES_LIST" && -n "$WHITE_PROCESSES_LIST" ]] ; then # If both variables are defined then error is produced.
echo "At least one or both of the variables BLACK_PROCESSES_LIST or WHITE_PROCESSES_LIST must be empty."
exit 1
elif [[ -n "$BLACK_PROCESSES_LIST" ]] ; then # If this variable is non-empty then set NEW_PIDS_COMMAND variable to bellow command
NEW_PIDS_COMMAND="top -b -n1 -c | grep -E '$BLACK_PROCESSES_LIST' | gawk '\$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT"
elif [[ -n "$WHITE_PROCESSES_LIST" ]] ; then # If this variable is non-empty then set NEW_PIDS_COMMAND variable to bellow command
NEW_PIDS_COMMAND="top -b -n1 -c | gawk 'NR>6' | grep -E -v '$WHITE_PROCESSES_LIST' | gawk '\$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT"
else
NEW_PIDS_COMMAND="top -b -n1 -c | gawk 'NR>6 && \$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT"
fi
# Search and limit violating PIDs
while sleep $DAEMON_INTERVAL
do
NEW_PIDS=$(eval "$NEW_PIDS_COMMAND") # Violating PIDs
LIMITED_PIDS=$(ps -eo args | gawk '$1=="cpulimit" {print $3}') # Already limited PIDs
QUEUE_PIDS=$(comm -23 <(echo "$NEW_PIDS" | sort -u) <(echo "$LIMITED_PIDS" | sort -u) | grep -v '^$') # PIDs in queue
for i in $QUEUE_PIDS
do
cpulimit -p $i -l $CPU_LIMIT -z & # Limit new violating processes
done
done
- ИЗМЕНИТЬ ПЕРЕМЕННЫЕ ДЛЯ ВАШЕЙ СРЕДЫ ТРЕБУЕТСЯ
CPU_LIMIT
Измените эту переменную в приведенном выше сценарии, если вы хотите, чтобы потребление ЦП для каждого процесса не превышало 20%. Пожалуйста, прочитайте главу «При использовании компьютера SMP» ниже, если у вас есть компьютер SMP (более 1 ЦП или ЦП с более чем 1 ядром).
DAEMON_INTERVAL
Измените эту переменную в приведенном выше скрипте, если вы хотите проводить более / менее регулярную проверку Интервал указывается в секундах, а по умолчанию установлено значение 3 секунды.
BLACK_PROCESS_LIST и WHITE_PROCESSES_LIST
Переменная BLACK_PROCESSES_LIST ограничивает только указанные процессы. Если переменная пуста (по умолчанию), все нарушающие процессы ограничены.
Переменная WHITE_PROCESSES_LIST ограничивает все процессы, кроме процессов, определенных в этой переменной. Если переменная пуста (по умолчанию), все нарушающие процессы ограничены.
Одна или обе переменные BLACK_PROCESSES_LIST и WHITE_PROCESSES_LIST должны быть пустыми - не логично, что обе переменные определены.
Вы можете указать несколько процессов в одной из этих двух переменных, используя символы разделителя "|" (без двойных кавычек). Пример: если вы хотите cpulimit для всех процессов кроме процессов mysql, firefox и gedit, установите переменную: WHITE_PROCESSES_LIST = "mysql | firefox | gedit"
ПРОЦЕДУРА АВТОМАТИЧЕСКОГО ЗАПУСКА ДЕМОНА В ЗАГРУЗКУ
Установка прав доступа для пользователя root:
Код:
sudo chmod 755 /usr/bin/cpulimit_daemon.sh
Открыть текстовый редактор с привилегиями root и сохранить приведенный ниже скрипт в новый файл /etc/init.d/cpulimit
Код:
#!/bin/sh
#
# Script to start CPU limit daemon
#
set -e
case "$1" in
start)
if [ $(ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print $1}' | wc -l) -eq 0 ]; then
nohup /usr/bin/cpulimit_daemon.sh >/dev/null 2>&1 &
ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print}' | wc -l | gawk '{ if ($1 == 1) print " * cpulimit daemon started successfully"; else print " * cpulimit daemon can not be started" }'
else
echo " * cpulimit daemon can't be started, because it is already running"
fi
;;
stop)
CPULIMIT_DAEMON=$(ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print $1}' | wc -l)
CPULIMIT_INSTANCE=$(ps -eo pid,args | gawk '$2=="cpulimit" {print $1}' | wc -l)
CPULIMIT_ALL=$((CPULIMIT_DAEMON + CPULIMIT_INSTANCE))
if [ $CPULIMIT_ALL -gt 0 ]; then
if [ $CPULIMIT_DAEMON -gt 0 ]; then
ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print $1}' | xargs kill -9 # kill cpulimit daemon
fi
if [ $CPULIMIT_INSTANCE -gt 0 ]; then
ps -eo pid,args | gawk '$2=="cpulimit" {print $1}' | xargs kill -9 # release cpulimited process to normal priority
fi
ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print}' | wc -l | gawk '{ if ($1 == 1) print " * cpulimit daemon can not be stopped"; else print " * cpulimit daemon stopped successfully" }'
else
echo " * cpulimit daemon can't be stopped, because it is not running"
fi
;;
restart)
$0 stop
sleep 3
$0 start
;;
status)
ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print}' | wc -l | gawk '{ if ($1 == 1) print " * cpulimit daemon is running"; else print " * cpulimit daemon is not running" }'
;;
esac
exit 0
- Смена владельца файла на root:
Код:
sudo chown root:root /etc/init.d/cpulimit
- Изменение прав доступа:
Код:
sudo chmod 755 /etc/init.d/cpulimit
Добавить скрипт в каталоги процедур загрузки:
Код:
sudo update-rc.d cpulimit по умолчанию
Перезагрузитесь, чтобы проверить, запускает ли скрипт демон cpulimit во время загрузки:
Код:
перезагрузка sudo
РУЧНАЯ ПРОВЕРКА, ОСТАНОВКА, ЗАПУСК И ПЕРЕЗАПУСК DAEMON
Примечание. Демон и служба в этом руководстве имеют одинаковое значение.
Примечание: Для пользователей, использующих Ubuntu 8.10 (например, Ubuntu 8.04 LTS) вместо служебной команды, используйте синтаксис "sudo /etc/init.d/cpulimit status / start / stop / restart" или установите пакет sysvconfig с помощью команды: sudo apt-get установить sysvconfig
Проверьте, запущена ли служба cpulimit
Команда проверки возвращает: «демон cpulimit работает», если служба запущена, или «демон cpulimit не работает», если служба не запущена.
Код:
sudo service cpulimit status
Запуск службы cpulimit
Вы можете вручную запустить демон cpulimit, который начнет пропускать потребление ресурсов процессора.
Код:
sudo service cpulimit start
Стоп cpulimit сервис
Команда Stop останавливает демон cpulimit (таким образом, новый процесс не будет ограничен), а также устанавливает для всех существующих ограниченных процессов полный доступ к ЦП, как это было до запуска cpulimit.
Код:
sudo service cpulimit stop
Перезапустите службу cpulimit.Если вы измените некоторые параметры переменных в /usr/bin/cpulimit_daemon.sh, например CPU_LIMIT, DAEMON_INTERVAL, BLACK_PROCESSES_LIST или WHITE_PROCESSES_LIST, то после изменения параметров вы должны перезапустить службу.
Код:
sudo service cpulimit restart
- ПРОВЕРЬТЕ ПОТРЕБЛЕНИЕ ЦП С ИЛИ БЕЗ CPULIMIT DAEMON
без демона
1. остановите демон cpulimit (остановка службы sudo cpulimit)
2. выполнять ресурсоемкие задачи в фоновом режиме
3. выполнить команду: top и проверить столбец% CPU
Результат% CPU, вероятно, составляет более 20% для каждого процесса.
с включенным демоном
1. запустить демон cpulimit (запуск службы sudo cpulimit)
2. выполнять те же задачи, интенсивно использующие процессор в фоновом режиме
3. выполнить команду: top и проверить столбец% CPU
Результат% CPU должен составлять максимум 20% для каждого процесса.
Примечание: не забывайте, что в начале% CPU может быть больше 20%, потому что демон должен отлавливать нарушающий процесс с интервалом в 3 секунды (установлен в скрипте по умолчанию)
- ЕСЛИ ИСПОЛЬЗУЕТ КОМПЬЮТЕР SMP
Я тестировал этот код на компьютере с двухъядерным процессором Intel, который ведет себя как компьютер SMP. Не забывайте, что команда top, а также cpulimit по умолчанию работают в режиме Irix, где 20% означает 20% одного процессора. Если имеется два ЦП (или двухъядерный), то общий% ЦП может составить 200%. В верхней команде режим Irix можно отключить командой I (нажатие + i при запуске верхней команды) и включить режим Solaris, где общее количество ЦП делится на количество ЦП, поэтому% ЦП может быть не более 100 % на любом количестве процессорного компьютера. Пожалуйста, прочитайте больше информации о верхней команде на главной странице руководства (поиск для команды I). Пожалуйста, прочитайте больше о том, как cpulimit работает на компьютере SMP, на официальной странице cpulimit.
Но как демон cpulimit работает на компьютере SMP? Всегда в режиме Irix. Поэтому, если вы хотите потратить 20% мощности ЦП на двухпроцессорном компьютере, 40% следует использовать для переменной CPU_LIMIT в сценарии демона cpulimit.
- УДАЛЕНИЕ ПРОГРАММЫ CPULIMIT DAEMON И CPULIMIT
Если вы хотите избавиться от демона cpulimit, вы можете очистить свою систему, удалив демон cpulimit и удалив программу cpulimit.
Стоп демон cpulimit
Код:
служба sudo cpulimit stop # Остановить демон cpulimit и все процессы cpulimit
Удаление демона из процедуры загрузки
Код:
sudo update-rc.d -f cpulimit remove # Удалить символические ссылки
Удалить процедуру загрузки
Код:
sudo rm /etc/init.d/cpulimit # Удалить сценарий загрузки cpulimit
Удалить демон cpulimit
Код:
sudo rm /usr/bin/cpulimit_daemon.sh # Удалить скрипт демона cpulimit
Удалить программу cpulimit
Код:
sudo apt-get удалить cpulimit
Удалить программу gawk
Если вам не нужна эта программа для любого другого скрипта, вы можете удалить ее.
Код:
sudo apt-get remove gawk
ПРИМЕЧАНИЕ ОБ АВТОРАХ
Я только что написал демон для cpulimit (скрипты bash выше). Я не автор проекта cpulimit. Если вам нужна дополнительная информация о программе cpulimit, пожалуйста, прочитайте официальную веб-страницу cpulimit: http://cpulimit.sourceforge.net/.
С уважением,
Abcuser