特定のプロセスのCPU制限を永続的に設定する方法。Cpulimitとniceは動作しません


12

同様の質問はたくさんありますが、どれも私の問題を解決するのに役立ちません。

私はサーバー上にubuntu 11.10を持っています(デスクトップ版です)。実行中のWebサイトがあります。非常に重要なプロセスが1つありますが、高い優先度で実行する必要はありません。ユーザーではなく、プロセスの CPU使用を永久に制限したい。このプロセスはexec関数によって実行されます(システムプロセスではなく、php関数です)。

そのため、2つのオプションがあります。1.関数が実行されるたびに何らかの制限を追加します。2.このプロセスのCPU使用を永久に制限します。

「nice」とcpulimitを使用しようとしましたが、何も機能しないようです。効果がないため、cpulimit(-eを使用)は「ターゲットプロセスが見つかりません」と表示します。

私は非常に初心者なので、ほとんど何も知らないと仮定してください。


試したことを教えてください。cgroupsがこれを行うことができます。
パンサー

構成に関してはcgsnapshot -s、構成ファイルを手動で書き込むことなく情報を取得するためにを実行できますが、後者は推奨されません。
明亮Li 14

プロセスを実際に調整しますか?つまり、設定された時間を超えないようにしますか?
ケンシャープ

私はこの方法を使用し、それが...私のために働いたubuntuforums.org/showthread.php?t=992706
ムスタファ・サルマン

回答:


19

要求された詳細がない場合...

以下は、ubuntuでcgroupを使用する方法です。

この投稿を通して、変数「$ USER」をプロセスを実行しているユーザーに変更する必要があります

メモリに関する情報を追加しました。それがFAQになります。必要ない場合は使用しないでください。

1)インストール cgroup-bin

sudo apt-get install cgroup-bin

2)再起動します。cgroupsは現在、/sys/fs/cgroup

3)ユーザー(プロセスの所有者)のcgroupを作成します

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

4)ユーザーはリソースを管理できます。デフォルトでは、ユーザーは1024 cpuユニット(共有)を取得するため、約10%cpuに制限するために、メモリはバイト単位で...

# 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> &

構成

cgroupsがあなたのために働いていると仮定します;)

編集/etc/cgconfig.conf、カスタムcgroupに追加

# Graphical
gksudo gedit /etc/cgconfig.conf

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

cgroupに追加します。再度、$ 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 cpu:bodhi sleep 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は完了しました。動作していますが、プロセスが制限されているという情報を追加する必要があるのは、他のプロセスがCPU /メモリを必要とする場合のみです。それは明らかではありません-そして、それを理解するのに時間がかかります(私は初心者です)。「構成」は再起動後も設定を保存することを正しく理解していますか?
ラファル

1
ソートしてくれてうれしい。学習曲線が少しあります=)はい、構成は起動後も設定を維持することです。
パンサー

コマンドラインからcgroupを使用すると、正常に動作します。しかし、phpのexec関数から同じコマンドを実行すると:(<?php exec( "cgexec -g cpu:GroupHere NameOfProcess InputFile OutputFile");動作しません。コマンドラインからの違いは、 。?。私はそれらのファイルへの長いパスを使用してPHPでからだ問題になることが、私は両方のケースで同じユーザーを使用しているものすべてのアイデアフォルダ
ラファウ

1
@Rafal:最初のコメントは正しくありません。他のプロセスが多くのメモリを使用していない場合でも、メモリを制限する必要があります。
フリム

1
@Flimmこのソリューションをテストしていたとき、2つのプロセスのみが実行されていました-制限されるべきApacheとプロセス。Apache接続が確立されていないか、Apacheへの接続が1つしかない場合、その制限されたプロセスはCPUの100%を使用しました。Apacheへの複数の接続が確立されると制限されました(WebブラウザからWebサイトを何度も更新してこれを行いました)。したがって、他のプロセスが実行されていない場合があります。
ラファル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.