![Debian 10 上的 Laravel/PHP 进程仅使用两个 CPU 线程中的一个](https://linux22.com/image/764838/Debian%2010%20%E4%B8%8A%E7%9A%84%20Laravel%2FPHP%20%E8%BF%9B%E7%A8%8B%E4%BB%85%E4%BD%BF%E7%94%A8%E4%B8%A4%E4%B8%AA%20CPU%20%E7%BA%BF%E7%A8%8B%E4%B8%AD%E7%9A%84%E4%B8%80%E4%B8%AA.png)
我在 Google VM 上运行 Debian 10 Buster 服务器,该服务器装有 PHP 7.3 Apache2 和 MySQL 8。在服务器上,我运行 Laravel 8 作为两个客户端的 API。我最近将 VM 升级到 n2-standard-2(2 个 vCPU,8 GB 内存),想检查我的服务器可以处理的吞吐量。
我的问题是,我的服务器从未使用 100% 的 CPU,实际上它最多只使用了 50%。一开始,我以为是因为它只使用了一个核心,但如果我在服务器上对路由进行压力测试时在服务器上运行 top,我可以看到两个核心都被使用了,但最多只使用了 50%,如图所示。这里的问题是什么?有没有办法可以充分利用这两个核心?我似乎有足够的可用内存,磁盘 I/O 从未出现过很高的峰值。
Laravel 在端口 9595 上的反向代理上运行,PID 19541 是 PHP artisan serve 命令的 PPID。我的 Laravel 应用程序上没有队列,但据我所知,它只对较长且更耗 CPU 的任务非常有用,但事实并非如此?(测试正在运行一些相当简单的 POST 请求,从 MySQL 读取)。
编辑:经过进一步调查,我发现了以下情况:我有 1 个 CPU 核心和 2 个线程。我可以对两个线程进行 100% 的压力测试。这是因为我的 php7.3 mod 只使用一个线程,所以我永远无法通过传入的 https 请求达到 100%。如果我在 Apache 中更改 MaxRequestWorkers,则不会产生任何影响。我最好的猜测是 php 只使用一个线程。我不明白的是为什么 Apache 不自动使用两个核心,因为 Apache 应该能够做到这一点?
答案1
经过大量测试,我发现了瓶颈:我通过反向代理在 PHP artisan 上为 Laravel 提供服务,当请求达到一定水平时,artisan 会拒绝请求。我通过 Apache 为 Laravel 提供服务来避免这个问题。瓶颈消失了,现在我可以根据自己的意愿使用 100% 的 CPU 能力。