Linuxには、CPU使用率を制限する解決策はないと思いますが、プロセスを特定のCPU使用率に制限する許容可能な方法があります:http://ubuntuforums.org/showthread.php?t = 992706
彼らが情報を削除した場合に備えて、ここに再びあります
パッケージをインストールする
cpulimitパッケージをインストールします。コード:
sudo apt-get install cpulimit
gawkパッケージをインストールします。コード:
sudo apt-get install gawk
CPULIMITデーモンファイルを作成する
root権限でテキストエディタを開き、次のデーモンスクリプトテキストを新しいファイル/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すべてのプロセスのCPU消費を20%以外のパーセンテージに省略したい場合は、上記のスクリプトでこの変数を変更してください。SMPコンピュータ(1CPU以上または1コア以上のCPU)をお持ちの場合は、以下の「SMPコンピュータを使用する場合」の章をお読みください。
DAEMON_INTERVAL定期的なチェックを増やしたり減らしたりしたい場合は、上記のスクリプトでこの変数を変更してください。間隔は秒単位で、デフォルトは3秒に設定されています。
BLACK_PROCESS_LISTおよびWHITE_PROCESSES_LIST変数BLACK_PROCESSES_LISTは、指定されたプロセスのみを制限します。変数が空の場合(デフォルト)、違反しているすべてのプロセスが制限されます。
変数WHITE_PROCESSES_LISTは、この変数で定義されたプロセスを除くすべてのプロセスを制限します。変数が空の場合(デフォルト)、違反しているすべてのプロセスが制限されます。
変数BLACK_PROCESSES_LISTとWHITE_PROCESSES_LISTの一方または両方を空にする必要があります。両方の変数が定義されていることは論理的ではありません。
区切り文字「|」を使用して、この2つの変数のいずれかで複数のプロセスを指定できます。(二重引用符なし)。サンプル:mysql、firefox、geditプロセス以外のすべてのプロセスをcpulimitする場合は、変数を設定します: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
- ファイルの所有者をルートに変更します。
コード:
sudo chown root:root /etc/init.d/cpulimit
- 権限の変更:
コード:
sudo chmod 755 /etc/init.d/cpulimit
起動手順ディレクトリにスクリプトを追加します。コード:
sudoupdate-rc.dcpulimitのデフォルト
再起動して、スクリプトが起動時にcpulimitデーモンを起動するかどうかを確認します。コード:
sudoリブート
デーモンを手動で確認、停止、開始、および再起動します
注:このチュートリアルのデーモンとサービスは同じ意味です。
注:サービスコマンドの代わりにUbuntu 8.10より前(Ubuntu 8.04 LTSなど)を使用しているユーザーの場合は、「sudo /etc/init.d/cpulimit status / start / stop / restart」構文を使用するか、コマンドsudoapt-getを使用してsysvconfigパッケージをインストールします。 sysvconfigをインストールします
cpulimitサービスが実行されているかどうかを確認します。Checkコマンドは、サービスが実行されている場合は「cpulimitデーモンが実行されています」、サービスが実行されていない場合は「cpulimitデーモンが実行されていません」を返します。コード:
sudo service cpulimit status
cpulimitサービスの開始CPU消費を省略し始めるcpulimitデーモンを手動で開始できます。コード:
sudo service cpulimit start
Stop cpulimit service Stopコマンドは、cpulimitデーモンを停止し(したがって、新しいプロセスが制限されることはありません)、cpulimitが実行されていない前と同じように、既存のすべての制限されたプロセスがCPUに完全にアクセスできるように設定します。コード:
sudo service cpulimit stop
cpulimitサービスを再起動する/usr/bin/cpulimit_daemon.shのCPU_LIMIT、DAEMON_INTERVAL、BLACK_PROCESSES_LIST、WHITE_PROCESSES_LISTなどの変数設定を変更した場合は、設定を変更した後、サービスを再起動する必要があります。コード:
sudo service cpulimit restart
- CPU制限デーモンがある場合とない場合のCPU消費量を確認します
デーモンなし1.cpulimitデーモンを停止します(sudo service cpulimit stop)2.バックグラウンドでCPU集中型タスクを実行します3.コマンドを実行します:topおよび%CPU列を確認します%CPUの結果はおそらく各プロセスで20%以上です。
デーモンをオンにした状態1.cpulimitデーモンを開始します(sudo service cpulimit start)2.バックグラウンドで同じCPU集中タスクを実行します3.コマンドを実行します:topおよび%CPU列を確認します%CPUの結果は各プロセスで最大20%である必要があります。注:デーモンは3秒間隔で違反プロセスをキャッチする必要があるため、最初は%CPUが20%を超える可能性があることを忘れないでください(デフォルトではスクリプトで設定されています)
- SMPコンピューターを使用する場合
このコードをIntelデュアルコアCPUコンピューターでテストしました。これはSMPコンピューターのように動作します。topコマンドとcpulimitは、デフォルトでIrixモードで動作することを忘れないでください。20%は1つのCPUの20%を意味します。2つのCPU(またはデュアルコア)がある場合、合計%CPUは200%になる可能性があります。topコマンドでは、コマンドI(topコマンドの実行中に+ iを押す)でIrixモードをオフにし、Solarisモードをオンにすることができます。このモードでは、CPUの合計量をCPUの数で割ったため、%CPUは100を超えることはできません。任意の数のCPUコンピューターで%。トップマンページでトップコマンドの詳細をお読みください(Iコマンドを検索してください)。cpulimitの公式ページで、cpulimitがSMPコンピューターでどのように動作しているかについてもお読みください。
しかし、cpulimitデーモンはSMPコンピューターでどのように動作しますか?常にIrixモードです。したがって、CPUパワーの20%を2 CPUコンピューターに費やしたい場合は、cpulimitデーモンスクリプトのCPU_LIMIT変数に40%を使用する必要があります。
- CPULIMITデーモンとCPULIMITプログラムをアンインストールします
cpulimitデーモンを削除したい場合は、cpulimitデーモンを削除してcpulimitプログラムをアンインストールすることにより、システムをクリーンアップできます。
cpulimitデーモンを停止しますコード:
sudo service cpulimit stop#cpulimitデーモンとすべてのcpulimitedプロセスを停止します
起動手順からデーモンを削除しますコード:
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 remove cpulimit
gawkプログラムのアンインストール他のスクリプトでこのプログラムが必要ない場合は、リモートで実行できます。コード:
sudo apt-get remove gawk
著者についての注意
cpulimit用のデーモン(上記のbashスクリプト)を作成しました。私はcpulimitプロジェクトの作者ではありません。cpulimitプログラムの詳細については、cpulimitの公式Webページ(http://cpulimit.sourceforge.net/ )を参照してください。
よろしく、Abcuser