基于phathomjs token 不定时无响应问题排查

问题描述

基于phathomjs的token池项目,基本原理是,打开淘宝页,获取匿名cookie,再由cookie中提取有效token,调用方通过该token获取淘宝数据

 

为方便基他人应用,封装了部分功能为一个http api

 

功能是完备的,问题是服务运行个一天左右,就无响应了

 

问题1,phathomjs本身的问题,虽然早期phathomjs 有内存泄露的问题,但当前的版本已修复

问量2,自身代码的问题

 

时间有限就不啰嗦了,

 

几个排查点

1 服务是否中断

 服务还在运行,进程还在,http api 端口 依然在监听,直觉是泄露,在是哪里泄露,是什么泄露,需要确认和排查。

2 查看网络请求

 netstat -ntp

 显示http api listen的端口,大量CLOSE_WAIT,这个原因是tcp层面服务端没有向客户端发送fin,就我的服务而言就是没有 调用http.response()

 

到这一步就已经找到线索,之后往上查http.response()的调用栈即可。

 

3 怀疑出现了泄露

 因此 top 

 发现进程内存占用500m

 重启服务进程 内存占用150m

泄露确主

 

4 查http.response()的调用栈

 

这个功能函数是打开某url,然后phathomjs,打开一个page(不显示页面,phathomjs内的page类型),会加载相关页面资源,在获取到某url后(http请求获取jsonp格式的数据)这个url是触发下一步的关键点,获取完成表示页面打开成功,当前页有效,之后获取当前页面的cookie,cookie提取token,token返回。

 

到这里很多人都已经猜到问题在哪了。

 

以上只是顺利运行的情况,其实考虑到对方反爬虫,网络不稳定等这种原因,打开page页后,这个页可能永远拿不到触发下一步的url

因此这个调用,在这一步阻塞,不会调用response,响应给客户端,也因此对应的连接一直保持CLOSE_WAIT,因为page占用的资源不能释放(代码内的逻辑是,取出token,调用response前释放 page.close())因此内存占用会增大。

 

问题找到,处理就简单了,处理方式在外部加了超时控制,超时后,page.close() 并向client response 异常信息。

 

问题解决。

 

 

 

 

posted @ 2018-03-23 17:22  cclient  阅读(389)  评论(0编辑  收藏  举报