如何將整個用戶(而不僅僅是進程)限制在 10% 以下?

如何將整個用戶(而不僅僅是進程)限制在 10% 以下?

我正在運行 centos、cpanel/whm,並且安裝了 cpulimit。

我遇到的問題是我的一位用戶使用了大量的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

ETC

有兩件事正在使用如此極端的 CPU 使用率。

首先是該位置的文件,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 會為它收到的每個請求產生一個新進程(Worker),每次都會分配一個新的 PID。

根據您在 中設定的 PHP 處理程序WHM -> MultiPHP Manager -> PHP Handlers,Apache 將單獨執行 PHP 腳本,或以擁有該檔案的使用者身分執行它們。如果您使用suPHP作為處理程序,PHP 進程將由擁有該檔案的帳戶執行。

如果腳本由擁有者執行,您可以透過將其新增至檔案來限制帳戶的 CPU 使用率/etc/security/limits.conf。雖然您不能使用它來精確限制 cpu 百分比,但您可以修改它們的「nice」值,以便它們的進程比伺服器上的其他進程具有更低的優先權。這樣,其他進程就不必等待那麼長時間。

我自己從未使用過這個(我運行 CloudLinux),但我相信以下條目應該幫助解決問題:

username    hard    priority    30

這將使用者執行的進程的最大優先權設定為30。

在我執行 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 是一項服務(啟動 cgrulesengd 服務),它根據 /etc/cgrules.conf 檔案中設定的參數將任務移至 cgroup 中。 /etc/cgrules.conf 檔案中的條目可以採用以下兩種形式之一:

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 條目第三行中的 users/%g/%u 模板,如下所示:

peter:ftp       cpu     users/%g/%u

上面使用的變數%g and %u會根據 ftp 進程的擁有者自動替換為群組和使用者名稱。

如果該進程屬於 adminstaff 群組的 peter,則上述路徑將轉換為users/adminstaff/peter.

然後cgred服務搜尋該目錄,如果不存在,cgred建立它並將進程指派給users/adminstaff/peter/tasks。

請注意,範本規則僅適用於設定檔中範本的定義,因此即使在/etc/cgconfig.conf 中定義了“group users/adminstaff/peter”,它也會被忽略,而傾向於“template users/% g/%」你」。

數位海洋的教學。

對照組簡介。

答案3

您可以嘗試設定 /etc/security/limits.conf ,您應該可以調整使用者可以消耗多少 cpu 時間和記憶體。詳情請參閱https://linux.die.net/man/5/limits.conf

相關內容