所以我有一个 REST Web 服务,有很多用户(~50k)和很多在线用户,最近我遇到了一个问题并且无法修复它, 网络服务变得非常慢!
当我与 postman 核实时,1 个请求需要 1-4 秒! 我用消化慢日志检查了 MySQL,它工作正常(所有请求都在 100 毫秒或更短的时间内完成) 我还检查了 PHP:
$time = microtime(TRUE);
$mem = memory_get_usage();
//code here
print_r(array(
'memory' => (memory_get_usage() - $mem) / (1024 * 1024),
'seconds' => microtime(TRUE) - $time
));
而且它真的很快,所以在我看来 PHP 和 DB 都很好,但整个 Web 服务变得非常慢! 不知道如何识别和解决问题
注释:
6GB 内存(MySQL 占用了我设置的一半,另一半是 buff/catch)
6 核(MySQL 用户 ~100-150% = 1-1.5 核)
硬盘未满:)
CENTOS 7 - nginx - PLESK - php 7
最佳答案
每秒 500 个请求的持续负载并不是轻负载。如果这些请求没有或只有极少数超时,则您可能已经充分调整了 Web 服务器配置。为什么?当基于 Linux 的 Web 服务器发出 listen(2) 时request 它为传入请求设置了几个队列。这些请求会等待,直到服务器中的某些工作人员开始使用 accept(2)
以便开始回应他们。
1.4 秒的响应时间可能主要花在其中一个监听队列上。
您可以尝试调整 nginx 以应对重负载。通过调整它接受的连接数量等内容,您也许可以从中获得更多性能。
您应该检查 Web 服务运行的代码,看看它是否包含任何不必要的内容。它是否从文件系统读取任何文件?您的目标是这样的:一旦您的 php 代码开始处理请求,它应该能够使用尽可能少的共享资源(MySQL 查询、文件读取等)来完成它。如果处理请求的 php 实例必须彼此等待很长时间,您的系统将会变慢。
您的 php-to-MySQL 连接方案是否使用连接池。确保你使用它。 mysqli_
和 PDO
都提供连接池,但是您可以采取一些措施(即使是错误的)来击败连接池。
在这种情况下,许多人会通过添加更多 Web 服务器计算机来扩展服务器配置。您可以使用循环 DNS,也可以了解 nginx 的负载均衡功能。
关于php - MySQL 和 PHP 很好,但 Web 服务很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46497613/