问题描述

基于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 异常信息。

问题解决。

基于phathomjs token 不定时无响应问题排查的更多相关文章

  1. PC监听鼠标和键盘事件,定时无响应退出

    直接上代码: window.onload = function () { initScreenSaver(); } //0912 add function ScreenSaver(settings){ ...

  2. VC中基于 Windows 的精确定时[转]

    在工业生产控制系统中,有许多需要定时完成的操作,如定时显示当前时间,定时刷新屏幕上的进度条,上位 机定时向下位机发送命令和传送数据等.特别是在对控制性能要求较高的实时控制系统和数据采集系统中,就更需要 ...

  3. SQL阻塞原因造成系统多功能无响应的分析解决思路

    最近遇到一个sqlserver项目,月底会出现多个财务相关功能出现不定期操作无响应问题 通过查询SQL阻塞信息,定位到阻塞源头spid.该会话的状态.等待事件及执行的SQL脚本 根据spid查询该会话 ...

  4. 基于PHP的crontab定时任务管理

    BY JENNER · 2014年11月10日· 阅读次数:6 linux的crontab一直是server运维.业务开展的利器.但当定时任务增多时,管理和迁移都变得非常麻烦,并且easy出问题.以下 ...

  5. VC中基于 Windows 的精确定时

    在工业生产控制系统中,有许多需要定时完成的操作,如定时显示当前时间,定时刷新屏幕上的进度条,上位 机定时向下位机发送命令和传送数据等.特别是在对控制性能要求较高的实时控制系统和数据采集系统中,就更需要 ...

  6. 一次Mysql连接池卡死导致服务无响应问题分析(.Net Mysql.Data 6.9.9)

    问题: 进程启动后,线程数迅速上升至最小线程数后,缓慢上升(线程池限制)到数千,然后由于线程过多,CPU飙升到90%. 对外表现为Api无响应或连接超时. 背景 有些数据存在于另一个机房,通过内网专线 ...

  7. ArcGIS Server浏览地图服务无响应原因分析说明

    1.问题描述 从4月17号下午5时起,至18号晚9点,客户单位部分通过ArcGIS Server发布的地图服务(该部分地图服务的数据源为数据库SJZX)无法加载浏览,表现为长时间无响应.同时,通过Ar ...

  8. [转]Oracle 11g 基于CentOS7静默安装教程(无图形界面,远程安装) --有部份地方有问题

    Oracle 11g 基于CentOS7静默安装教程(无图形界面,远程安装) [转载]原文地址:http://canonind.blog.51cto.com/8239025/1883066 一.安装前 ...

  9. 测试人员遇到Android APP崩溃和无响应手足无措?

    这2天,在测APP兼容性时,遇到APP奔溃闪退的情况.将问题反馈给开发后,开发自己调试后,没有复现.由于又是远程,base地不在一块,我总不能把手机寄过去吧,那也太费事了. 所以就想到,提供明确的报错 ...

随机推荐

  1. Python插件安装

    Python插件安装 1. 找到Python的安装目录. 打开CMD控制台输入 python 打开环境变量,找到Python安装路径. 进入 安装目录 下的 Scripts 目录 . 查看已安装的插件 ...

  2. centos系统将shell脚本改成systemctl启动的形式

    说明: CentOS 7的服务systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和用户(user)之分,像需要开机不登陆就能运行的程序,就将程序存在系统服务里,即 ...

  3. Java并发分析—volatile

    在https://www.cnblogs.com/xyzyj/p/11148497.html中已经说明了在多线程并发的情况下,会出现数据的不一致问题,但归根结底就是一个原因,在宏观上就是线程的执行顺序 ...

  4. Vmware 主机锁定模式

    https://docs.vmware.com/cn/VMware-vSphere/6.5/com.vmware.vsphere.security.doc/GUID-88B24613-E8F9-40D ...

  5. 元祖&字典

    #什么是元祖:元祖是一个不可变的列表(没有改的需求) #======================================基本使用============================== ...

  6. 覆盖(重写)&隐藏

    成员函数被重载的特征(1)相同的范围(在同一个类中): (2)函数名字相同: (3)参数不同: (4)virtual 关键字可有可无. 覆盖是指派生类函数覆盖基类函数,特征是(1)不同的范围(分别位于 ...

  7. Android通过包名打开第三方应用

    import android.content.ComponentName; import android.content.Context; import android.content.Intent; ...

  8. android studio 3.2 查看Deveice Monitor

    View菜单下面的 Tool Windows 下面的 Devecie File Explorer

  9. java8的lambda过滤list遍历集合,排序

    1.根据属性过滤list List<AllManagerBean> testLists = broadCastRoomMapper.allManagerlist(); List<Al ...

  10. [NOI2014]魔法森林(LCT)

    蒟蒻又发现自己还没写过LCT…… 首先显然按照权值a从小到大排序,维护b的最小生成树.然后直接扫,代价是加入b的最大值,然后动态加边,因为有边权,所以在lct中边应该理解为点.每次连接(u,v)时,若 ...