快速提交导致gearman server 挂掉

这次在使用gearman做任务转发的时候遇到两个问题:
1,连续提交时client端报错
Exception in thread "Thread-5" java.nio.channels.ShutdownChannelGroupException
at sun.nio.ch.Invoker.invokeIndirectly(Invoker.java:210)
at sun.nio.ch.Invoker.invoke(Invoker.java:176)
at sun.nio.ch.Invoker.invoke(Invoker.java:285)
at sun.nio.ch.WindowsAsynchronousSocketChannelImpl$ReadTask.failed(WindowsAsynchronousSocketChannelImpl.java:600)
at sun.nio.ch.Iocp$EventHandlerTask.run(Iocp.java:399)
at java.lang.Thread.run(Thread.java:744)
2,快速提交达到5K条左右,导致server死掉
 
第一个问题,看错误一开始以为是gearman关闭错误,
1,阅读代码,发现并没有太大的问题。按照网上百度出来的请求关闭方式书写,并不存在语法错误。
通过jvisualvm监控 tomcat和eclipse 的资源使用情况并未发现异常。

 
2,其中代码中有一段是create Gearman和 create GearmanServer引起了我的注意。
这段代码中每个请求都要create Gearman和 create GearmanServer。快速提交的时候这样是肯定不行的。
对这一块代码进行优化,将Gearman 和 Server的创建定义成静态变量,避免重复创建。
这样改完之后,再测试的时候发现只发送一次,报错 shudown server.
这里我犯了一个基础错误。静态变量只在类加载的时候加载,有且只加载一次。所有成员对象共用。
下面代码中finally模块中将gearman关闭,导致报错。
 
3,网上找到资料,使用submitJob提交时需要sleep一会儿,避免快速提交,server认为是攻击,将请求pending.
详见http://blog.csdn.net/luka2008/article/details/40864633
我使用的是submitBackgroundJob提交方式,同样我也尝试让它sleep(20).
测试结果是:Exception in thread 数量变少,但仍然存在。
 
4,与老大沟通之后,老大表示他使用perl请求时从来不关闭连接。
我将java中的链接关闭取消。测试不再报错。但出现新的问题,循环提交10000次,导致server死亡。
 
第二个问题,快速提交时导致server死亡。
server端问题主要是老大帮忙解决的。不知道他的思路,但记录下解决方法,学习一下。
老大在监控server端使用情况之后,反馈快速提交时导致CPU耗尽,server死掉。
此时我已经让提交时sleep(20) ,为了测试将sleep时间增加到1s,问题依然存在。
老大那边通知我,他”尝试关掉gearman server多余的线程,让它用单线程跑,貌似有希望 “。
我再次测试运行正常。
有时间需要研究一下 gearman server。
 
 
 
 
 
 
 
 

猜你喜欢

转载自yuyajian.iteye.com/blog/2184217