web-dev-qa-db-ja.com

プロセス全体ではなく、ユーザー全体をCPUの10%未満に制限するにはどうすればよいですか?

Centos、cpanel/whmを実行していて、cpulimitがインストールされています。

私が抱えている問題は、ユーザーの1人が極端な量のCPUを使用していることです。 100%以上一貫していて、サーバーの速度が低下しています。

さらに問題は、彼らは友達で悪意がないので、私は彼らを一時停止したくないということです。

さらに問題は、このプロセスは1秒ごとに変化するため、プロセスで制限できないことです。それは毎回異なるプロセスです。

以下を試しましたが動作しません。

cpulimit -l 10 -e /home/[username]/public_html/theirwebsite.org/index.php

私はただ戻ってきます、

No process found
No process found
No process found
No process found
No process found
No process found

その極端なCPU使用率を使用しているものは2つあります。

まず、その場所にあるファイルindex.phpです。その他は[php]であり、WHMで意味するものは何でも。しかし、主にindex.phpが問題です。

その場所にあるindex.phpファイルを制限できれば、この問題の緩和に役立つ可能性があります。

ちなみに、-Pフラグを試しましたが、ドキュメントとは異なり、オプションとして使用できません。

cpulimit -l 10 -P /home/[username]/public_html/theirwebsite.org/index.php

戻り値

cpulimit: invalid option -- 'P'
Usage: cpulimit [OPTIONS...] TARGET
   OPTIONS
      -l, --limit=N          percentage of cpu allowed from 0 to 1600 (required)
      -v, --verbose          show control statistics
      -z, --lazy             exit if there is no target process, or if it dies
      -i, --include-children limit also the children processes
      -h, --help             display this help and exit
   TARGET must be exactly one of these:
      -p, --pid=N            pid of the process (implies -z)
      -e, --exe=FILE         name of the executable program file or path name
      COMMAND [ARGS]         run this command and limit it (implies -z)

だから私は-eフラグでそれをしなければならないようです。

ただし、ユーザーアカウント全体を制限するのが理想的です。

そして、はい、私はcloudlinuxについて知っていますが、今はできません。それができるまでは、サーバーの再起動を必要としない何かを手動で実行するのに助けが必要です。

10
user7783780

プロセス(PID)を使用して友達を制限することはできませんが、Apacheは受信するすべてのリクエストに対して新しいプロセス(ワーカー)を生成し、毎回新しいPIDを割り当てます。

PHPハンドラーをWHM -> MultiPHP Manager -> PHP Handlersで設定したハンドラーに応じて、ApacheはPHPスクリプト自体を実行するか、またはスクリプトを所有するユーザーとして実行しますsuPHPをハンドラーとして使用する場合、PHPプロセスはファイルを所有するアカウントと同じように実行されます。

スクリプトが所有者によって実行される場合、/etc/security/limits.confファイルに追加することで、CPUの使用をアカウントに制限できます。これを使用してCPUパーセンテージを正確に制限することはできませんが、「Nice」の値を変更して、サーバー上の他のプロセスよりもプロセスの優先順位を低くすることができます。そのため、他のプロセスはそれほど長く待つ必要はありません。

私はこれを自分で使用したことがありませんが(CloudLinuxを実行しています)、次のエントリshouldが問題の解決に役立つと思います。

username    hard    priority    30

これは、ユーザーが実行するプロセスの最大優先度を30に設定します。私が理解していることから、より高い優先度は、実際には(より低い優先度を持つ)他のプロセスがより多くのCPU時間を取得することを意味します。

CPanelを実行している私のサーバーでは、ほとんどのプロセスの優先度は20なので、上記のロジックに従って、そのユーザーの優先度を30に設定すると、他のプロセスがこれらのプロセスの前に実行できるようになります。

1
cascer1

Cgroups を試しましたか?


  • サービスSudo yum install libcgroupをインストールしてSudo service cgconfig startを開始します。
  • その後、Sudo ls /cgroupを実行してcgroupのサブシステム構成を表示します

limitcpuという名前のcgroupを作成します。 groupで始まる行はcgroupを作成し、サブシステムパラメータを設定します。

/etc/cgconfig.confの例:

group limitcpu{

        cpu {
                cpu.shares = 200;
                # cpu.cfs_period_us
                # cpu.cfs_quota_us
        }
        memory {

        }
}

CPU制限には、露骨なCPU使用量を制限するために使用できる 調整可能なパラメーター がいくつかあります

cgroup内のタスクが1秒ごとに0.1(10%)秒間単一のCPUにアクセスできる必要がある場合、cpu.cfs_quota_usを100000に設定し、cpu.cfs_period_usを1000000に設定します


Cgredは、(cgrulesengdサービスを開始する)サービスであり、/ etc/cgrules.confファイルで設定されたパラメーターに従ってタスクをcgroupに移動します。 /etc/cgrules.confファイルのエントリは、次の2つの形式のいずれかになります。

user subsystems control_group
user:command subsystems control_group

ここで、userには、「@」文字を前に付けたユーザー名またはグループ名を使用します。 subsystemsをコンマ区切りのサブシステム名のリストで置き換え、control_groupはcgroupへのパスを表し、commandはプロセス名またはプロセスの完全なコマンドパスを表します。

Etc/cgrules.confの例:

*:firefox      cpu,memory      browsers/
@admin:memhog  memory          limitmem/
cpuhog         cpu             limitcpu/
  • ユーザーが実行するfirefoxプロセスは自動的にブラウザーに追加されcgroup、CPUおよびメモリサブシステムに制限されます。

  • memhogグループのすべてのユーザーが実行するadminプロセスは、cgroup limitmemに追加され、メモリサブシステムに制限されます。

    -ユーザーcpuhogがcgroup 'limitcpu'に追加され、cpuサブシステムで制限されます。


事前のユースケースでは、代わりにテンプレートを利用してみることができます。

たとえば、/ etc/cgconfig.confで次のテンプレートを指定します。

template users/%g/%u {
                     cpuacct{
                     }
                     cpu {
                        cpu.shares = "1000";
                     }
          }

次に、/ etc/cgrules.confエントリの3行目でusers /%g /%uテンプレートを使用します。これは次のようになります。

peter:ftp       cpu     users/%g/%u

上記で使用されている%g and %u変数は、ftpプロセスの所有者に応じて、グループ名とユーザー名に自動的に置き換えられます。

プロセスがadminstaffグループのpeterに属している場合、上記のパスはusers/adminstaff/peterに変換されます。

次にcgredサービスはこのディレクトリを検索し、存在しない場合は、cgredがディレクトリを作成し、プロセスをusers/adminstaff/peter/tasksに割り当てます。

テンプレートルールは設定ファイル内のテンプレートの定義にのみ適用されるため、「グループユーザー/ adminstaff/peter」が/etc/cgconfig.confで定義されていても無視され、「テンプレートユーザー/%g /%」が優先されます。 u」。

デジタルオーシャンによるチュートリアル。

コントロールグループの概要。

7
Carrein

おそらく/etc/security/limits.confをセットアップして、ユーザーが消費できるCPU時間とメモリの量を調整できるはずです。詳細は https://linux.die.net/man/5/limits.conf を参照してください

0
sebastienvg