所以我有一个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
答案 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的负载均衡功能。