Archive for the ‘php技术’ Category

 
Dec
06
Posted (xurenlu) in php性能, php技术 on 12月-6-2007

近来由于业务量急剧增长,业务种类越来越多,RPC混乱问题就凸现出来.
具体表现是:
a1,a2,a3,a4 为一组服务器,为用户提供A服务.
b1,b2,b3为一组服务器,为用户提供B服务.
c1,c2,c3为一组服务器,为用户提供C服务.
最初各服务器各自服务是不太相关的.随着业务拓展,用户提出新的需求,我们需要
在A服务中调用B组服务器的API接口.
….
最后我们发现这样一个现象:
用户请求a1 提供服务.a1发现他需要知道另一些数据,于是调用b2的rpc服务.但是b2
上这个数据又需要c3的RPC.结果c3又需要a2来提供一些数据….
我们的远程调用调来调去,最后把自己调晕了.

于是我开始考虑一种解决方案。
首先当然是:对远程调用加以控制和规范,避免不必要的远程调用。
接着我注意到,我们利用CURL来通过http通道进行远程调用其实是没必要的。我可以在做远程调用时,走FastCGI协议。

说干就干:
第一步:建立一个fastCGI:spawn-php

  1. #!/bin/bash
  2.  
  3. ## ABSOLUTE path to the spawn-fcgi binary
  4. SPAWNFCGI="/home/y/opt/lighttpd/bin/spawn-fcgi"
  5.  
  6. ## ABSOLUTE path to the PHP binary
  7. FCGIPROGRAM="/home/y/opt/php/bin/php-cgi"
  8.  
  9. ## TCP port to which to bind on localhost
  10. FCGIPORT="1026"
  11.  
  12. ## number of PHP children to spawn
  13. PHP_FCGI_CHILDREN=10
  14.  
  15. ## maximum number of requests a single PHP process can serve before it is restarted
  16. PHP_FCGI_MAX_REQUESTS=1000
  17.  
  18. ## IP addresses from which PHP should access server connections
  19. FCGI_WEB_SERVER_ADDRS="127.0.0.1,192.168.2.10"
  20.  
  21. # allowed environment variables, separated by spaces
  22. ALLOWED_ENV="ORACLE_HOME PATH USER"
  23.  
  24. ## if this script is run as root, switch to the following user
  25. USERID=y
  26. GROUPID=y
  27.  
  28. ################## no config below this line
  29.  
  30. if test x$PHP_FCGI_CHILDREN = x; then
  31. PHP_FCGI_CHILDREN=5
  32. fi
  33.  
  34. export PHP_FCGI_MAX_REQUESTS
  35. export FCGI_WEB_SERVER_ADDRS
  36.  
  37. ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_MAX_REQUESTS FCGI_WEB_SERVER_ADDRS"
  38.  
  39. if test x$UID = x0; then
  40. EX="$SPAWNFCGI -p $FCGIPORT -f $FCGIPROGRAM -u $USERID -g $GROUPID -C $PHP_FCGI_CHILDREN"
  41. else
  42. EX="$SPAWNFCGI -p $FCGIPORT -f $FCGIPROGRAM -C $PHP_FCGI_CHILDREN"
  43. fi
  44.  
  45. # copy the allowed environment variables
  46. E=
  47.  
  48. for i in $ALLOWED_ENV; do
  49. E="$E $i=${!i}"
  50. done
  51.  
  52. # clean the environment and set up a new one
  53. env - $E $EX

2.接着我们建立这样的文件:http.txt

  1. for($i=0;$i<100;$i++)
  2. {
  3. echo rand();
  4. echo '....Scene of shooting at Nebraska shopping centre
  5. Eight killed in Nebraska shooting
  6. A gunman opens fire in a shopping centre in the US state of Nebraska, killing at least eight people.
  7. Scene of shooting at Nebraska shopping centre
  8. Eight killed in Nebraska shooting
  9. A gunman opens fire in a shopping centre in the US state of Nebraska, killing at least eight people.
  10. Scene of shooting at Nebraska shopping centre
  11. Eight killed in Nebraska shooting
  12. A gunman opens fire in a shopping centre in the US state of Nebraska, killing at least eight people.
  13. Scene of shooting at Nebraska shopping centre
  14. Eight killed in Nebraska shooting
  15. A gunman opens fire in a shopping centre in the US state of Nebraska, killing at least eight people.
  16. ';
  17. }
  18. print "done!";

这个做为是远程接口。
3.下面比较CURL和fastCGI两种访问remote API的方式:
A:走FastCGI:

  1. include "./mod_fcgi.php";
  2. $fcgi=new mod_fcgi();
  3. $args="127.0.0.1:1026";
  4. $filename="/home/y/www/qps/http.php";
  5. $fcgi->parser_open($args,$filename,$rq_err,$cgi_headers);
  6. print($fcgi->parsed_output);
  7. echo "\n=============\n";

B:走CURL通道:

  1. include "./curl.php";
  2. $curl=& new CURL();
  3. echo $curl->get("http://localhost/qps/http.php");
  4. echo "\n=============\n";

4我们比较FCGI方式和CURL方式的差异:
FCGI方式进行远程调用的QPS:

  1. Total transferred:      249306 bytes
  2. HTML transferred:       244410 bytes
  3. Requests per second:    275.77 [#/sec] (mean)
  4. Time per request:       3.626 [ms] (mean)
  5. Time per request:       3.626 [ms] (mean, across all concurrent requests)
  6. Transfer rate:          2233.76 [Kbytes/sec] received

HTTP通道进行远程调用的QPS:

  1. Total transferred:      2244515 bytes
  2. HTML transferred:       2240015 bytes
  3. Requests per second:    204.18 [#/sec] (mean)
  4. Time per request:       4.898 [ms] (mean)
  5. Time per request:       4.898 [ms] (mean, across all concurrent requests)
  6. Transfer rate:          14911.66 [Kbytes/sec] received

经过多次比较,确认用fastCGI通道时,效率比http方式要高。
但是….这个差别并不大,而且,使用lighttpd的spawn-cgi来充当fastcgi的守护进程,还不是特别稳定。
另外,经过我的测试,只有当远程调用的结果有较多的输出时,FastCGI协议与HTTP协议相比才有优势。在通过网络传输的数据不多的情况下(就是http.php几乎没有输出的情况下),用CURL来调远端调用,反而比FastCGI方式慢(显而易见,mod_fcgi是自行封装的用PHP的socket函数来进行网络操作的class,而Curl是一个编译了的php扩展).
因此,我忙活了半天,最后得出的结论是,目前还不能在公司大规模加以运用。
但是对于小型企业,创业型公司来说,这种效率对比还是很有用的,可以加以挖掘。


Tag:
相关文章




     
    Aug
    21
    Posted (xurenlu) in php性能, php技术 on 08月-21-2007

    我的师兄,从某种程度上说也是我php方面的师父,和他的同事做了测评,分别是针对php4,php5的性能对比和function,class的性能对比的。
    这里是师兄的对比结果
    师兄的同事做的测评
    但是我不认为用ab来做出的测试是合理的.理由:用ab来测试时,结果好像总似是在跳舞一样.做为证据,我将我的notebook依文本方式重启,用ab来测lighttpd的表现.
    具体环境:
    Haier H40S Notebook
    RAM:1.5G
    CPU:CY 1.6GHz
    硬盘:60G,(具体型号什么的不清楚,列个60G表示不是SCSI硬盘)
    OS:Fedora Core 7.0(Moonshine)
    web server:lighttpd 1.4.15
    测试工具:ab
    X环境:未运行X server
    命令:ab -n 10000 -c 50 http://localhost:8181/
    第一份结果:

    1. This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
    2. Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    3. Copyright 2006 The Apache Software Foundation, http://www.apache.org/

    Benchmarking localhost (be patient)

    Server Software: lighttpd/1.4.15
    Server Hostname: localhost
    Server Port: 8181

    Document Path: /
    Document Length: 345 bytes

    Concurrency Level: 50
    Time taken for tests: 1.786830 seconds
    Complete requests: 10000
    Failed requests: 0
    Write errors: 0
    Non-2xx responses: 10000
    Total transferred: 4980000 bytes
    HTML transferred: 3450000 bytes
    Requests per second: 5596.50 [#/sec] (mean)
    Time per request: 8.934 [ms] (mean)
    Time per request: 0.179 [ms] (mean, across all concurrent requests)
    Transfer rate: 2721.58 [Kbytes/sec] received

    Connection Times (ms)
    min mean[+/-sd] median max
    Connect: 0 3 2.6 4 8
    Processing: 1 4 0.7 5 6
    Waiting: 0 1 1.7 2 5
    Total: 5 8 2.2 8 13
    WARNING: The median and mean for the processing time are not within a normal deviation
    These results are probably not that reliable.

    Percentage of the requests served within a certain time (ms)
    50% 8
    66% 10
    75% 10
    80% 11
    90% 11
    95% 12
    98% 12
    99% 12
    100% 13 (longest request)

    这里的结果是Requests per second: 5596.50 [#/sec] (mean)(插一句,lighttpd的性能真是好,用apache从来没上过3000)
    第二份ab -n 10000 -c 50的结果:

    1. This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
    2. Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    3. Copyright 2006 The Apache Software Foundation, http://www.apache.org/

    Benchmarking localhost (be patient)

    Server Software: lighttpd/1.4.15
    Server Hostname: localhost
    Server Port: 8181

    Document Path: /
    Document Length: 345 bytes

    Concurrency Level: 50
    Time taken for tests: 1.313719 seconds
    Complete requests: 10000
    Failed requests: 0
    Write errors: 0
    Non-2xx responses: 10011
    Total transferred: 4985478 bytes
    HTML transferred: 3453795 bytes
    Requests per second: 7611.98 [#/sec] (mean)
    Time per request: 6.569 [ms] (mean)
    Time per request: 0.131 [ms] (mean, across all concurrent requests)
    Transfer rate: 3705.51 [Kbytes/sec] received

    Connection Times (ms)
    min mean[+/-sd] median max
    Connect: 0 1 1.0 1 5
    Processing: 1 5 2.0 5 32
    Waiting: 0 3 1.8 3 30
    Total: 1 6 2.1 6 35

    Percentage of the requests served within a certain time (ms)
    50% 6
    66% 6
    75% 6
    80% 6
    90% 7
    95% 8
    98% 10
    99% 11
    100% 35 (longest request)

    结果表明RPS是Requests per second: 7611.98 [#/sec] (mean).
    第三份结果:

    1. This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
    2. Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    3. Copyright 2006 The Apache Software Foundation, http://www.apache.org/

    Benchmarking localhost (be patient)

    Server Software: lighttpd/1.4.15
    Server Hostname: localhost
    Server Port: 8181

    Document Path: /
    Document Length: 345 bytes

    Concurrency Level: 50
    Time taken for tests: 1.300247 seconds
    Complete requests: 10000
    Failed requests: 0
    Write errors: 0
    Non-2xx responses: 10009
    Total transferred: 4984482 bytes
    HTML transferred: 3453105 bytes
    Requests per second: 7690.85 [#/sec] (mean)
    Time per request: 6.501 [ms] (mean)
    Time per request: 0.130 [ms] (mean, across all concurrent requests)
    Transfer rate: 3743.14 [Kbytes/sec] received

    Connection Times (ms)
    min mean[+/-sd] median max
    Connect: 0 1 1.0 1 5
    Processing: 1 4 1.4 5 11
    Waiting: 0 2 1.1 3 8
    Total: 1 6 1.2 6 14

    Percentage of the requests served within a certain time (ms)
    50% 6
    66% 6
    75% 6
    80% 6
    90% 7
    95% 9
    98% 10
    99% 11
    100% 14 (longest request)

    RPS结果是Requests per second: 7690.85 [#/sec] (mean).
    第四份结果是:

    1. This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
    2. Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    3. Copyright 2006 The Apache Software Foundation, http://www.apache.org/

    Benchmarking localhost (be patient)

    Server Software: lighttpd/1.4.15
    Server Hostname: localhost
    Server Port: 8181

    Document Path: /
    Document Length: 345 bytes

    Concurrency Level: 50
    Time taken for tests: 1.315784 seconds
    Complete requests: 10000
    Failed requests: 0
    Write errors: 0
    Non-2xx responses: 10033
    Total transferred: 4996434 bytes
    HTML transferred: 3461385 bytes
    Requests per second: 7600.03 [#/sec] (mean)
    Time per request: 6.579 [ms] (mean)
    Time per request: 0.132 [ms] (mean, across all concurrent requests)
    Transfer rate: 3708.06 [Kbytes/sec] received

    Connection Times (ms)
    min mean[+/-sd] median max
    Connect: 0 1 1.2 1 8
    Processing: 1 4 1.4 5 11
    Waiting: 0 2 1.1 3 8
    Total: 1 6 1.4 6 15

    Percentage of the requests served within a certain time (ms)
    50% 6
    66% 6
    75% 6
    80% 6
    90% 7
    95% 9
    98% 11
    99% 12
    100% 15 (longest request)

    结果是Requests per second: 7600.03 [#/sec] (mean).
    第五份结果是:

    1. This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
    2. Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    3. Copyright 2006 The Apache Software Foundation, http://www.apache.org/

    Benchmarking localhost (be patient)

    Server Software: lighttpd/1.4.15
    Server Hostname: localhost
    Server Port: 8181

    Document Path: /
    Document Length: 345 bytes

    Concurrency Level: 50
    Time taken for tests: 1.812989 seconds
    Complete requests: 10000
    Failed requests: 0
    Write errors: 0
    Non-2xx responses: 10000
    Total transferred: 4980000 bytes
    HTML transferred: 3450000 bytes
    Requests per second: 5515.75 [#/sec] (mean)
    Time per request: 9.065 [ms] (mean)
    Time per request: 0.181 [ms] (mean, across all concurrent requests)
    Transfer rate: 2682.31 [Kbytes/sec] received

    Connection Times (ms)
    min mean[+/-sd] median max
    Connect: 0 3 2.7 4 9
    Processing: 1 4 0.8 5 6
    Waiting: 0 1 1.7 2 5
    Total: 5 8 2.3 9 13
    WARNING: The median and mean for the processing time are not within a normal deviation
    These results are probably not that reliable.

    Percentage of the requests served within a certain time (ms)
    50% 9
    66% 10
    75% 10
    80% 11
    90% 12
    95% 12
    98% 12
    99% 12
    100% 13 (longest request)

    RPS结果是Requests per second: 5515.75 [#/sec] (mean);

    可以看到,同是ab -n 10000 -c 50 http://localhost:8181/,结果大不一样,不仅分为7600RPS和5500RPS两档,而各档中具体数据也不一样.这个结果可以理解,OS中总是会有各种各样的消息要处理,影响具体数据结果也很正常.
    因此,谢华亮(sir?mm?)的测试用ab的结果来进行php4,php5的性能比较是不太对的.至少目前看来,我没有从他的文章中看到他进行了多次ab测评后取结果的平均值.但是他列出来这样一个结果:

    1. 版本 函数测试 不实例化类 实例化类 类的继承
    2. PHP 4.4.2 1047.23/rps 1034.98/rps 1006.14/rps 992.95/rps
    3. PHP 5.2.1 1176.06/rps 1197.17/rps 1187.93/rps 1128.54/rps

    这大致可以说明,php5.2确实是比php4.4.2要快.但是从1197.17>1176.06得出php5的类跑得比functiong还快,我不这么认为.只是21个request的差别,太小了,ab测试的随便一个风吹草吹就行了(而且说class比function要快,严重地伤害了我的感情,哈哈)…
    嗯,先整这么多.有空好好研究一下,如何对web程序进行性能测评.
    另外,有空见到这两位兄台,好好争论一番.


    Tag:
    相关文章