php curl localhost在发出并发请求时速度较慢

php curl localhost在发出并发请求时速度较慢,php,linux,curl,concurrency,localhost,Php,Linux,Curl,Concurrency,Localhost,我有一个有趣的问题,我不确定根本原因是什么。我有一个服务器和两个虚拟主机a和B,端口分别在80和81上运行。我在一个平台上编写了一个简单的PHP代码,如下所示: <?php echo "from A server\n"; 但以并发级别1发出1000个请求的速度非常快: $ ab -n 1000 -c 1 http://192.168.10.173/b.php This is ApacheBench, Version 2.3 <$Revision: 1706008 $> Co

我有一个有趣的问题,我不确定根本原因是什么。我有一个服务器和两个虚拟主机a和B,端口分别在80和81上运行。我在一个平台上编写了一个简单的PHP代码,如下所示:

<?php

echo "from A server\n";
但以并发级别1发出1000个请求的速度非常快:

$ ab -n 1000 -c 1 http://192.168.10.173/b.php
This is ApacheBench, Version 2.3 <$Revision: 1706008 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.10.173 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        nginx/1.10.0
Server Hostname:        192.168.10.173
Server Port:            80

Document Path:          /b.php
Document Length:        26 bytes

Concurrency Level:      1
Time taken for tests:   1.659 seconds
Complete requests:      1000
Failed requests:        0
Total transferred:      172000 bytes
HTML transferred:       26000 bytes
Requests per second:    602.86 [#/sec] (mean)
Time per request:       1.659 [ms] (mean)
Time per request:       1.659 [ms] (mean, across all concurrent requests)
Transfer rate:          101.26 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       1
Processing:     1    1  10.3      1     201
Waiting:        1    1  10.3      1     201
Total:          1    2  10.3      1     201

Percentage of the requests served within a certain time (ms)
  50%      1
  66%      1
  75%      1
  80%      1
  90%      1
  95%      1
  98%      1
  99%      2
 100%    201 (longest request)
但为什么在不使用localhost作为代理时,名称解析在并发级别5失败


虚拟主机设置非常简单和干净,几乎所有内容都是默认配置。我不在此服务器上使用iptables,也不配置任何特殊的内容

server {
    listen 81 default_server;
    listen [::]:81 default_server;

    root /var/www/html;

    index index.html index.htm index.nginx-debian.html;

    server_name _;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }
}

找到有趣的东西!如果你在第一次测试之后在大约3秒内进行另一次ab测试。第二次ab测试非常快

不使用本地主机作为代理

ab -n 10 -c 5 http://192.168.10.173/b.php <-- This takes 2.8 seconds to finish.
ab -n 10 -c 5 http://192.168.10.173/b.php <-- This takes 0.008 seconds only.
ab -n 10 -c 5 http://192.168.10.173/b.php <-- This takes 0.006 seconds.
ab -n 10 -c 5 http://192.168.10.173/b.php <-- This takes 0.006 seconds.

ab-n10-c5http://192.168.10.173/b.php 好吧,经过这么多天的努力解决这个问题,我终于找到了原因。这不是名字解析。我真不敢相信要花这么多天才能找到根本原因,那就是php fpm的
www.conf
pm.start\u服务器的数量。最初,我将pm.start_服务器的数量设置为3,这就是为什么在并发级别为3之后,ab对本地主机的测试总是变得更糟糕的原因。虽然PHPCLI没有限制php进程数量的问题,因此PHPCLI总是表现出色。将pm.start_servers
增加到5后,ab测试结果与php cli一样快。如果这就是php fpm速度慢的原因,那么您还应该考虑更改
pm.min\u spare\u服务器
pm.max\u spare\u服务器
pm.max\u子服务器
以及任何相关的服务器的数量。

如果使用不同的并发级别(如2)或URL fopen()(如file\u get\u contents),这会发生根本性的变化吗(")?@BJBlack at concurrcy=2,3,4,5,时间分别为0.018s、0.87s、1.75s和2.42s。我怀疑这与低级别的linux行为有关。@cwhsu在这种情况下,您可能希望将linux作为tag@Goose好的,完成了!我仍然对这个问题感到困惑。检查会话自动启动之类的东西。如果你有默认的fil基于e的会话,则不可能为并发请求提供服务,因为“活动”脚本会锁定会话文件,从而阻止任何其他并行请求。
<?php

require 'vendor/autoload.php';

use GuzzleHttp\Client;

$opt = 1;
$url = 'http://localhost:81/a.php';

switch ($opt) {
    case 1:
        // create curl resource
        $ch = curl_init();

        // set url
        curl_setopt($ch, CURLOPT_URL, $url);

        //return the transfer as a string
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        curl_setopt($ch, CURLOPT_PROXY, 'localhost');

        // $output contains the output string
        $output = curl_exec($ch);

        curl_close($ch);

        echo $output;
        break;
    case 2:
        $client = new Client();
        $response = $client->request('GET', $url, ['proxy' => 'localhost']);
        echo $response->getBody();
        break;
    case 3:
        echo file_get_contents($url);
        break;
    default:
        echo "no opt";
}

echo "app server:\n";
ab -n 1000 -c 500 http://192.168.10.173/b.php
This is ApacheBench, Version 2.3 <$Revision: 1528965 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.10.173 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        nginx/1.10.0
Server Hostname:        192.168.10.173
Server Port:            80

Document Path:          /b.php
Document Length:        182 bytes

Concurrency Level:      500
Time taken for tests:   0.251 seconds
Complete requests:      1000
Failed requests:        184
   (Connect: 0, Receive: 0, Length: 184, Exceptions: 0)
Non-2xx responses:      816
Total transferred:      308960 bytes
HTML transferred:       150720 bytes
Requests per second:    3985.59 [#/sec] (mean)
Time per request:       125.452 [ms] (mean)
Time per request:       0.251 [ms] (mean, across all concurrent requests)
Transfer rate:          1202.53 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    6   4.9      5      14
Processing:     9   38  42.8     22     212
Waiting:        8   38  42.9     22     212
Total:         11   44  44.4     31     214

Percentage of the requests served within a certain time (ms)
  50%     31
  66%     37
  75%     37
  80%     38
  90%    122
  95%    135
  98%    207
  99%    211
 100%    214 (longest request)
server {
    listen 81 default_server;
    listen [::]:81 default_server;

    root /var/www/html;

    index index.html index.htm index.nginx-debian.html;

    server_name _;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }
}
ab -n 10 -c 5 http://192.168.10.173/b.php <-- This takes 2.8 seconds to finish.
ab -n 10 -c 5 http://192.168.10.173/b.php <-- This takes 0.008 seconds only.
ab -n 10 -c 5 http://192.168.10.173/b.php <-- This takes 0.006 seconds.
ab -n 10 -c 5 http://192.168.10.173/b.php <-- This takes 0.006 seconds.