![PHP CPU 使用率限制](https://linux22.com/image/587792/PHP%20CPU%20%E4%BD%BF%E7%94%A8%E7%8E%87%E9%99%90%E5%88%B6.png)
我在网上针对这个问题做了一些研究。我的问题不是如何通过改进算法来降低 CPU 利用率,或者通过使用多任务或限制每个系统用户的 CPU 来提高性能。
我有一个网站,用户登录后会进行一些处理并注销。该网站使用 Linux 服务器、PHP 和 Apache。问题是我无法控制分配给每个用户的 CPU 数量。也就是说,我想保证每个用户至少能获得 5% 的 CPU(假设用户总数少于 20)。我该怎么做?
欢迎任何解决方案(php 代码、apache 服务器设置或任何开箱即用的解决方案)。
非常感谢您阅读本文:)
答案1
如果您使用 PHP 作为 CGI 或 FCGI 应用程序,则可以使用 cpulimit 来限制 PHP 进程的 cputime。
答案2
您应该计算每个脚本占用了多少 CPU,然后将其存储到数据库中,每当用户调用您的 php 脚本时,它都会将其 ID 添加到数据库中以供日后使用。
这是一个简单的例子
$start = microtime(true);
// Your script here
$end = microtime(true);
然后在 php 脚本的开头设置一个 CPU 限制检查器,该脚本会查询数据库以了解当前用户的 CPU 使用情况。如果他们的 CPU 使用率高于或等于允许值,则显示其他内容。
答案3
我认为您的问题的主要问题是它已经解决了。Apache/PHP 旨在为每个请求创建一个单独的进程,并且操作系统会在它们之间分配 CPU 时间。
因此您的设置已经实现了您想要实现的功能。
例如,执行相同工作量的 5 个请求将分别获得 20% 的 CPU,并且完成所需的时间是 1 个请求单独运行所需时间的 5 倍。我认为这正是您所期望的。
一些低级语言可能会破坏这种公平性,但我不认为 PHP 会这样。
不过,很快想到:公平并不高效。假设我的任务需要 1 秒。将资源分配给 5 个任务意味着所有 5 个任务将在 5 秒后同时结束。同时,如果轮流,第一个任务将在 1 秒后结束,第二个任务将在 2 秒后结束……第五个任务将在 5 秒后结束。与“公平”解决方案相比,没有人会输。但有些人会赢,这确实不公平。