【发布时间】:2013-01-20 22:48:30
【问题描述】:
我有一个我无法处理的奇怪问题。我不知道该怎么办,我已经将php.ini设置为以下内容:
max_execution_time = 120
memory_limit = 1024M
output_buffering = on
compression is turned off
网络服务器闲置率约为 95%,可用内存为 6GB。
我还调整了 apache MPM:
mpm_prefork_module:
StartServers 500
MinSpareServers 500
MaxSpareServers 1000
MaxClients 5500
MaxRequestsPerChild 0
但这一切都无济于事(我也尝试了不同的值)。
我需要每分钟处理大约 3000 个传入的 API 请求。我需要为每个返回大约 50KB。
服务器可以处理该数量的传入请求。我测试了它。它只是不能把所有的数据都扔掉。有一种节流。但是在测试带宽时,我得到了完整的 100MBit。
这是我的问题:
当我通过 apache2 下载静态二进制文件时,我的速度为 12000 KiloByte/sec,所以这几乎是整个 100MBit 连接。
我创建了一个 php 文件来执行所有 API 的工作,但不返回结果。它只是返回一些特定大小的随机数据。现在,我正在从不同的服务器加载具有多个线程(当时为 1000 个)的文件/数据。
现在我检查了服务器每分钟处理多少个请求。我计算了每秒的传输速率。
0 byte = about 5000
1000 byte = about 3000 = 50 Kilobyte/sec
10000 byte = about 1600 = 266 Kilobyte/sec
50000 byte = about 430 = 358 Kilobyte/sec
100000 byte = about 337 = 561 Kilobyte/sec
500000 byte = about 69 = 567 Kilobyte/sec
这表明在不返回数据时,服务器可以处理所需数量的请求(它每分钟可以处理 5000 个,而不是我需要的 3000 个)。当我返回我需要的 50KB 时,我每分钟只收到 430 个请求。我返回随机数据还是真实数据都没有关系,使用真实的 PHP 文件或者只是一个返回一些随机 50KB 数据的虚拟数据。这没有任何区别。
如何解决 php 节流问题?
以下是一些会导致相同限制问题的源代码:
<?
$chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
for ($i = 0; $i < 50000; $i++)
{
echo $chars[rand(0, strlen($chars))];
}
?>
【问题讨论】:
-
您是否将 Apache 中的一个文件 (~12M) 的下载与 PHP 中的大量小文件 (50K) 的下载进行比较?如果是这样,您应该尝试从 Apache 下载大量小文件的测试,否则您将同时更改两个变量,因此测试不公平。我应该认为对 50K 文件的数百/数千个请求的吞吐量比对大文件的请求要低得多,因为连接有自己的时间开销。
-
是的,单个文件的下载测试只是为了测试服务器的带宽。为了测试并发连接的数量,我做了另一个测试。
-
@Chris 如果您正在测试静态与动态传输,那么测试是不公平的。在动态传输测试期间您的 CPU 使用率是多少?
-
我有大约 95% 的空闲和 6GB 的可用内存。我的服务器很无聊,但它不会使用内存或 CPU 量来做某事。