MySQL和PHP很好但是web服务很慢

时间:2017-09-29 22:17:38

标签: php mysql rest web-services nginx

所以我有一个REST Web服务,有很多用户(~50k)和很多在线,最近我遇到了一个问题而且无法修复它, 网络服务变得非常慢!

当我检查邮递员1请求需要1-4秒!! 我通过消化慢速日志来检查MySQL,它运行正常(所有请求都在100毫秒或更短时间内完成) 我还用PHP检查了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都很好,但Webservice作为一个整体变得非常慢! 不知道如何识别和解决问题

注意:

6GB内存(MySQL设置为一半,另一半是buff / catch)

6个核心(MySQL用户~100-150%= 1-1.5个核心)

硬盘未满:)

CENTOS 7 - nginx - PLESK - php 7

1 个答案:

答案 0 :(得分:0)

每秒500个请求的持续负载不是轻负载。如果没有,或者只有极少数这些请求超时,您可能已经充分调整了Web服务器配置。为什么?当基于Linux的Web服务器发出listen(2)请求时,它会为传入请求设置几个队列。这些请求等到服务器中的某个工作人员开始使用accept(2)才能开始响应它们。

响应的1.4秒可能主要花费在其中一个侦听队列中。

您可以尝试为重负载调整nginix。您可以通过调整接受的连接数等内容来获得更高的性能。

您应该检查Web服务运行的代码,看它是否包含任何不必要的内容。它是否从文件系统中读取任何文件?你的目标是这样的:一旦你的php代码开始处理请求,它应该能够使用尽可能少的共享资源(MySQL查询,文件读取等)来完成它。如果php实例处理请求必须相互等待很多,那么系统将会变慢。

您的php-to-MySQL连接方案是否使用连接池。确保你使用它。 mysqli_PDO都提供连接池,但有些事情你可以做(​​甚至是错误的)来打败连接池。

在这种情况下,许多人会通过添加更多Web服务器计算机来扩展服务器配置。您可以使用循环DNS,也可以了解nginx的负载均衡功能。