加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

优化手记 – 提升API访问成功率

(2011-11-04 09:22:56)
标签:

提升

api

访问成功率

杂谈

                作者:王劲松

API接口的访问成功率99.58%,延时超过1秒算失败,要求访问成功率提高到99.9%以上

系统环境:linux  +  apache

 

当接到 任务就 比较头痛,优化本来就不好搞,解决就更难了,但也只能继续,在其位,谋其事,我要对工资负责。退缩不是我的作风,I can do it。往好的方向想,其实能力就是这么提高的,这就是炼狱,没有痛苦的过程,得到的果实大都是酸的。哈哈

 

just bite it

 

我是这么想的,成功率能到99.58%,说明没什么大问题,但是小问题究竟出在那里呢??

1、查看服务器负载,压力测试,CPU ,内存占用

都没有问题,那是为什么呢,难道硬盘坏了

。。。。

2、实际环境复杂,难道的瞬间峰值高了?

难测呀,线上机,每天访问量 百万 级别的,搞不好影响很严重,99.58%也不是什么大问题。但是这种问题线下是测不出来的,不信你试试。

于是在一台机器上,把程序小小的改动了一下,超时了 输出个  top,哈哈,我多聪明,想这下应该ok了吧。然后高兴的下班回家,想明天结果就出来了。

3、内部调用接口测试,memcache ,引用检查

让人郁闷的就是结果没出来,出来的话就不用继续了哎。 memcache 默认超时是1秒,一看是外网ip,难道这里的问题,我ping了一下这个ip,好多毫秒呢,应该就是他了,把外网ip改成了内网ip,响应时间少了很多倍哦;鉴于上边的经验,优化要做细的,再看了内部接口的调用。用的get_contents_timeout,呵呵,代码如下:

function get_contents_timeout($url,$timeout=0.5){

                $opts = array(

                                'http'=>array(

                                        'method'=>"GET",

                                        'timeout'=>$timeout

                                        )

                             );

                $context = stream_context_create($opts);

                return @file_get_contents($url,false,$context);

        }

不过显然是封装好的,0.5  +  memcache 的默认1秒,显然是超了,呵呵,于是乎我就把memcache的超时改成了 0.5 ,嘿嘿。 0.5+0.5 = 1 哦,这下好了;再看了下调用,include_once等,哇塞,很多没用的类都给 new 了,当然费时间了,于是乎把没用的 del 了,这下清爽多了。优化玩了,做了个ab测试,结果是显著的 以前 34 requests per sencond,经过我的认真的优化,到了712 requests per sencond 哈哈,我那个高兴呀。我就把他传上去了,跟领导也说了,优化玩了,应该没问题了,成功率应该能到99.9%了。

ab如下:

ab -c 100 -n 10 -t 10 "$url"

4、内部接口速度,本地请求速度,本地到请求ip的网络状况分析

上边的优化效果那么好,还是没有解决问题,无奈呀,本次测试 curl 如下:

curl -o /dev/null -s -w "%{time_connect}:%{time_starttransfer}:%{time_total}\n" "$url"

测试出问题的时候,内部接口的速度,本地请求的速度,本地到请求ip的速度,同时测试,同时哦,这个问题很关键,5分钟请求一次。结果分析了一下,有几个有问题的,但是不好判断呀,一天才2-3个,这个太偶然了哈。这个时候我都想放弃了,不行呀,水平有限呀,还是搞不定呀。

5、服务器数据对比,日志分析,程序分段计时

数据对比没有发现什么,几台服务器都差不多

grep is_do 111024.intra_access_log |awk '{if($12>1000000) {print $12;}}'| sort -nr | more

日志分析发现了一些问题,有规律的,证明问题还是存在的,只是隐身呢

$time_start = $this->microtime_float();          /////////////////////////

$tmp = get_contents_timeout($url);

$time_end = $this->microtime_float();   //////////////////

$time = $time_end - $time_start;

if($time > 1){

       $this->write_time($time.'--1--'.date('Y-m-d H:i:s'));

}

 

function microtime_float()

        {

                list($usec, $sec) = explode(" ", microtime());

                return ((float)$usec + (float)$sec);

        }

 

$tmp = get_contents_timeout($url);

分段计时,发现问题了,真的发现问题了,这个怎么会超时呢!@#%……&*()——

 

但是确实是他超时了,域名用的是透明代理+vip,费解呀

 

 

小结:日志分析很重要,要是早sort出问题,可能信心会好点地;瓶颈问题,1秒能执行70requests700requests是一样一样的,现在每秒的并发还不超过30呢,所以这个不能解决问题的;还有一句话要记住,``一切皆有可能``

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有