如何将整个用户(而不仅仅是进程)的 CPU 使用率限制在 10% 以下?

如何将整个用户(而不仅仅是进程)的 CPU 使用率限制在 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 脚本,或以拥有该文件的用户身份运行它们。如果您使用suPHPas 处理程序,则 PHP 进程将由拥有该文件的帐户执行。

如果脚本由所有者执行,您可以通过将其添加到文件来限制帐户的 CPU 使用率/etc/security/limits.conf。虽然您不能使用它来精确限制 CPU 百分比,但您可以修改它们的“nice”值,以便它们的进程的优先级低于服务器上的其他进程。这样,其他进程就不必等待太久。

我自己从未使用过这个(我运行的是 CloudLinux),但我相信以下条目应该帮助解决问题:

username    hard    priority    30

这会将用户执行的进程的最大优先级设置为 30。据我所知,更高的优先级实际上意味着其他进程(优先级较低)获得更多的 CPU 时间。

在我运行 cPanel 的服务器上,大多数进程的优先级为 20,因此按照上述逻辑,将该用户的优先级设置为 30 应该允许其他进程在这些进程之前执行。

答案2

你有没有尝试过Cgroups


  • 安装服务sudo yum install libcgroup并启动它sudo service cgconfig start
  • 之后运行以下命令查看 cgroups 的子系统配置: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 秒可以访问单个 CPU 0.1 秒(10%),则将 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/%u”。

由 Digital Ocean 提供的教程。

对照组简介。

答案3

您可以尝试设置 /etc/security/limits.conf,以便调整用户可以使用的 CPU 时间和内存量。有关详细信息,请参阅https://linux.die.net/man/5/limits.conf

相关内容