分类目录归档:WEB服务

fredzneg与你一起对apache,nginx,squid,trafficserver学习相关知识及探讨!

squid与Apache TrafficServer压力测试对比

SQUIDATS (Apache Traffic Server) 压力测试

一.测试环境

1CPU:双核  Intel(R) Core(TM)2 Duo CPU     E7500  @ 2.93GHz

2.内存:2G

3.系统版本:CentOS release 6.2 (2.6.32-220.el6.x86_64)

4.磁盘读写速度:disk reads:  308 MB in  3.01 seconds = 102.28 MB/sec

 

二.软件版本

1SQUID squid-3.0.STABLE18

2ATS   trafficserver-3.3.0-dev.tar.bz2

3Ab :     Version 2.3

 

注:

1.由于压力测试命令SQUID ATS服务在一台机器上,测试得出的数值偏小,测试总连接数都为20000,并发数逐步增加。

2.echo 10 > /proc/sys/net/ipv4/tcp_fin_timeout 减少大量的TIMEOUT回收时间,否则影响测试结果

3.ulimit -SHn 655350 增加文件描述符限制

4.SQUID缓存目录建立在了/dev/shm/cache mount –bind /cache /dev/shm/cache

 

三.测试结果

1.测试分为两种情况:

1)1.6K 在小的图片文件

2)771K aac音频文件

2.       ATS 采用了EPOLL,KQUEUE 的异步IO框架,比较早的select模式在大并发量的情况下优势显著,图中可以看出各项指标均比SQUID 优秀很多。

3.       SQUID在处理小文件时,命中率不是很稳定,而在处理大文件里命中率接近100%

4.       在测试中,ATSSQUID连接处理所需的时间少很多,同时每秒处理请求数翻倍。

5.       在本机与其它机器使用 –header=” Host: www.xxx.com” ,–H “Host: www.xxx.com”,命令测试时,ATSSQUID穿透没有问题,查看日志TCP_HIT,MEM_HIT,均有带www.xxx.com的头信息连接命中。

 1.6K 在小的图片文件



 771K aac音频文件,由于压力测试命令 SQUID ATS服务在一台机器上,测试得出的数值偏小,(测试机同时建立并处理压力测试连接)SQUID并在并发为 2500的时候,没有了处理能力,机器反应缓慢,停止了测试。

PHP的file_get_contents超时502,curl替换性能大幅优化

很多网站做过好多抓取别家网站内容,php上习惯了使用方便快捷的file_get_contents函数,但是总是会遇到获取失败返回502的问题,尽管按照手册中的例子设置了超时,可多数时候不会奏效:

使用 top 命令查看,很多 php-cgi 进程 CPU 使用率接近100%。后来,我通过跟踪发现,这类情况的出现,跟 PHP 的 file_get_contents() 函数有着密切的关系。

 

$config[‘context’] = stream_context_create(array(‘http’ => array(‘method’ => “GET”,
   ’timeout’ => 5//这个超时时间不稳定,经常不奏效
   )
  ));

 

默认值为 0 秒,也就是说,PHP 脚本会一直执行下去。这样,当所有的 php-cgi 进程都卡在 file_get_contents() 函数时,这台 Nginx+PHP 的 WebServer 已经无法再处理新的 PHP 请求了,Nginx 将给用户返回“502 Bad Gateway”。修改该参数,设置一个 PHP 脚本最大执行时间是必要的,但是,治标不治本。例如改成 <value name=”request_terminate_timeout”>30s</value>,如果发生 file_get_contents() 获取网页内容较慢的情况,这就意味着 150 个 php-cgi 进程,每秒钟只能处理 5 个请求,WebServer 同样很难避免“502 Bad Gateway”。
要做到彻底解决,只能让 PHP 程序员们改掉直接使用 file_get_contents(“http://example.com/”) 的习惯,而是稍微修改一下,加个超时时间,用以下方式来实现 HTTP GET 请求。要是觉得麻烦,可以自行将以下代码封装成一个函数。

 

<?php  
$ctx = stream_context_create(array(  
   ‘http’ => array(  
       ‘timeout’ => 1 //设置一个超时时间,单位为秒  
       )  
   )  
);  
file_get_contents(“http://example.com/”, 0, $ctx);  
?>  
首先,使用 top 命令查看 CPU 使用率较高的 php-cgi 进程。
top – 10:34:18 up 724 days, 21:01,  3 users,  load average: 17.86, 11.16, 7.69
Tasks: 561 total,  15 running, 546 sleeping,   0 stopped,   0 zombie
Cpu(s):  5.9%us,  4.2%sy,  0.0%ni, 89.4%id,  0.2%wa,  0.0%hi,  0.2%si,  0.0%st
Mem:   8100996k total,  4320108k used,  3780888k free,   772572k buffers
Swap:  8193108k total,    50776k used,  8142332k free,   412088k cached
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                               
10747 www       18   0  360m  22m  12m R 100.6 0.3    0:02.60 php-cgi                                                                                                              
10709 www       16   0  359m  28m  17m R 96.8  0.4    0:11.34 php-cgi                                                                                                               
10745 www       18   0  360m  24m  14m R 94.8  0.3    0:39.51 php-cgi                                                                                                               
10707 www       18   0  360m  25m  14m S 77.4  0.3    0:33.48 php-cgi                                                                                                               
10782 www       20   0  360m  26m  15m R 75.5  0.3    0:10.93 php-cgi                                                                                                               
10708 www       25   0  360m  22m  12m R 69.7  0.3    0:45.16 php-cgi                                                                                                               
10683 www       25   0  362m  28m  15m R 54.2  0.4    0:32.65 php-cgi                                                                                                               
10711 www       25   0  360m  25m  15m R 52.2  0.3    0:44.25 php-cgi                                                                                                               
10688 www       25   0  359m  25m  15m R 38.7  0.3    0:10.44 php-cgi                                                                                                               
10719 www       25   0  360m  26m  16m R  7.7  0.3    0:40.59 php-cgi
找其中一个 CPU 100% 的 php-cgi 进程的 PID,用以下命令跟踪一下:
strace -p 10747
如果屏幕显示:
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})

这时候,看一下服务器的连接池,会发现一堆类似的错误,让你头疼万分:

file_get_contents(http://***): failed to open stream…Spring上配置和更换DBCP的方法

不得已,安装了curl库,写了一个函数替换:



function curl_file_get_contents($durl){

   $ch = curl_init();

   curl_setopt($ch, CURLOPT_URL, $durl);

   curl_setopt($ch, CURLOPT_TIMEOUT, 5);

   curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);

   curl_setopt($ch, CURLOPT_REFERER,_REFERER_);

   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

   $r = curl_exec($ch);

   curl_close($ch);

   return $r;

 }

如此,除了真正的网络问题外,没再出现任何问题。

这是别人做过的关于curl和file_get_contents的测试:

file_get_contents抓取google.com需用秒数:

2.31319094
        2.30374217
        2.21512604
        3.30553889
       2.30124092

curl使用的时间:

0.68719101
        0.64675593
        0.64326
        0.81983113
        0.63956594

差距很大吧?呵呵,从我使用的经验来说,这两个工具不只是速度有差异,稳定性也相差很大。建议对网络数据抓取稳定性要求比较高的朋友使用上面的curl_file_get_contents函数,不但稳定速度快,还能假冒浏览器欺骗目标地址哦!


emlog用nginx配置的rewrite规则

emlog用nginx配置的rewrite规则,在emlog站点的nginx配置文件里加入:

location / {

        index index.php index.html;

        if (!-e $request_filename)

        {

                rewrite ^/(.+)$ /index.php last;

        }

}

/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf

看看配置是否有错误,如果没有reload一下配置就能生效了。

/etc/init.d/nginx reload