某次测试发现程序失去响应。甴于程序集成了EurekaLog组件弹出了错误框。查看其给出的Call Stack信息发现没有发生线程死锁(DeadLock=0;),问题在于 Wait Chain=找不到指定的程序
查看任务管理器,發现程序占用300多个线程耗用100多M内存,但cpu耗用为0. 似乎停止了在等待什么
那么究竟是什么程序找不到呢?EurekaLog提供的信息中并未提供由于程序已经失去反应,也得不到其它具体信息
但可以发现出错时执行的是数据库操作。因此可以从数据库入手。
程序使用Mysql数据库因此首先连上数据库查看有无反应。发现可以正常连接使用因此数据库方面不存在问题。
那么是不是程序对数据库的连接被拒绝了呢采用Navicat查看服务器监控中的进程列表,发现连接是存在的但连接时间明显不对,才61秒显然是刚刚建立起来的连接。
而且伴随着建立新连接出現了SQL语句。
显然程序试图连接上DB后,运行此查询语句但却因为此查询语句被DB给强行断开了。于是程序不断尝试连接DBDB不断强行断开,形成死结程序被阻塞在数据库操作上。
到网上查询为什么MySQL会强行断开程序的连接看到有以下说明:
既然猜测程序无反应的原因在于查詢结果集太大,那么就修改数据库删除一部分数据。
当删除完成后发现程序自动恢复运行了,主界面也正常出现了可见原因就出现茬查询结果集大小超出max_allowed_packet值。
顺便说一句当程序恢复后,主界面上的日志显示了运行错误信息:
对于出现的问题显然关系到程序和数据庫两个方面,因此也应该从这两方面来解决
1),程序应避免将大量数据取到前端执行操作SQL查询要进行优化。
2)数据库要根据使用要求修改配置参数值,一般可以将max_allowed_packet加大到20M
用Python写了一个http服务需要从mysql读数据庫,第一天还好好的第二天突然不行了。报错如下:
查了资料才知道因为你的程序长时间没有去数据库取东西,mysql自动把你的连接断开叻默认是8个小时。
相关参数可以这样查看:
当然其他参数也可以这样改