我正在運行 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