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

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

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

私が抱えている問題は、ユーザーの 1 人が CPU を極端に多く使用していることです。常に 100% を超えており、サーバーの速度が低下しています。

さらに問題なのは、彼らは友人であり悪意がないので、アカウントを停止したくないということです。

さらに問題なのは、プロセスが毎秒変化するため、プロセスによって制限できないことです。毎回異なるプロセスになります。

以下のことを試しましたが、うまくいきませんでした。

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 については知っていますが、今はそれができません。それができるようになるまでは、サーバーの再起動を必要としない方法で手動で行うための支援が必要です。

答え1

プロセス (PID) を使用してフレンドを制限することはできないというのは正しいです。Apache は受信するリクエストごとに新しいプロセス (ワーカー) を生成し、そのたびに新しい PID を割り当てます。

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

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

私はこれを自分で使ったことはありませんが(私はCloudLinuxを使っています)、次のエントリはすべき問題の解決に役立ちます:

username    hard    priority    30

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

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

答え2

やってみましたCグループ?


  • サービスをインストールしsudo yum install libcgroupて起動しますsudo service cgconfig start
  • その後、cgroupのサブシステム構成を表示するには、次のコマンドを実行します。sudo ls /cgroup

という名前の cgroup を作成しますlimitcpu。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 は、/etc/cgrules.conf ファイルに設定されたパラメータに従ってタスクを cgroup に移動するサービスです (cgrulesengd サービスを起動します)。/etc/cgrules.conf ファイル内のエントリは、次の 2 つの形式のいずれかになります。

user subsystems control_group
user:command subsystems control_group

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

etc/cgrules.conf の例:

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

  • memhogグループ内の誰かが実行したプロセスはadmincgroup に追加されlimitmem、メモリ サブシステム内で制限されます。

    - ユーザーはcpuhogcgroup '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 サービスはこのディレクトリを検索し、存在しない場合はディレクトリを作成し、プロセスを users/adminstaff/peter/tasks に割り当てます。

テンプレート ルールは構成ファイル内のテンプレートの定義にのみ適用されることに注意してください。そのため、/etc/cgconfig.conf で「group users/adminstaff/peter」が定義されている場合でも、これは無視され、「template users/%g/%u」が優先されます。

Digital Ocean によるチュートリアル。

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

答え3

おそらく、/etc/security/limits.conf を設定して、ユーザーが消費できる CPU 時間とメモリの量を調整できるはずです。詳細については、参考:

関連情報