优化手记 – 提升API访问成功率
(2011-11-04 09:22:56)
标签:
提升api访问成功率杂谈 |
某API接口的访问成功率99.58%,延时超过1秒算失败,要求访问成功率提高到99.9%以上
系统环境:linux
当接到 任务就 比较头痛,优化本来就不好搞,解决就更难了,但也只能继续,在其位,谋其事,我要对工资负责。退缩不是我的作风,I can do it。往好的方向想,其实能力就是这么提高的,这就是炼狱,没有痛苦的过程,得到的果实大都是酸的。哈哈
just bite it
我是这么想的,成功率能到99.58%,说明没什么大问题,但是小问题究竟出在那里呢??
1、查看服务器负载,压力测试,CPU ,内存占用
都没有问题,那是为什么呢,难道硬盘坏了
。。。。
2、实际环境复杂,难道的瞬间峰值高了?
难测呀,线上机,每天访问量 百万 级别的,搞不好影响很严重,99.58%也不是什么大问题。但是这种问题线下是测不出来的,不信你试试。
于是在一台机器上,把程序小小的改动了一下,超时了
输出个
3、内部调用接口测试,memcache ,引用检查
让人郁闷的就是结果没出来,出来的话就不用继续了哎。 memcache 默认超时是1秒,一看是外网ip,难道这里的问题,我ping了一下这个ip,好多毫秒呢,应该就是他了,把外网ip改成了内网ip,响应时间少了很多倍哦;鉴于上边的经验,优化要做细的,再看了内部接口的调用。用的get_contents_timeout,呵呵,代码如下:
function get_contents_timeout($url,$timeout=0.5){
不过显然是封装好的,0.5
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){
}
function microtime_float()
$tmp = get_contents_timeout($url);
分段计时,发现问题了,真的发现问题了,这个怎么会超时呢!@#¥%……&*()——
但是确实是他超时了,域名用的是透明代理+vip,费解呀
小结:日志分析很重要,要是早sort出问题,可能信心会好点地;瓶颈问题,1秒能执行70requests跟700requests是一样一样的,现在每秒的并发还不超过30呢,所以这个不能解决问题的;还有一句话要记住,``一切皆有可能``。