在Tomcat应用调用libvirt库线程卡死问题的解决
在最近的项目中,java包是有用的libvirt用于KVM管理远程命令调用libvirt。我们的测试机会测试,当连接状态的控制,有可能是一个严重的错误,因为当Flex应用程序界面上每个虚拟机点击节点,会导致远程服务的背景是3-4次获取远程服务,这将使用libvirt的结构,我们为了提高效率,将链接libvirt,维持,但不是每一次甚至减少性能损失。
存在这样的情况,当网络正常,连接建立,一直驻留在内存中,如果拔下电缆,连接没有断开,因为记忆中的连接值不为空,不能确定是否断开链接,所以在点击界面,一个叫做libvirt的接口界面会被卡住,点击几下,所有的服务线程Tomcat是卡住,造成接口不能使用。
解决方案是启动一个线程,因为它实时检测主机的断开状态。当状态不正常时,它直接以获取连接的方式抛出异常,从而阻止了后续的逻辑执行,但这只能解决状态问题,无法解决在这种状态下所获得的间隙中的接口单击问题。我们可以发现Tomcat的线程池模型可以提供帮助,因此我们可以使用线程池。经过测试,我们终于找到了它。
据说tomcat7能检测线程被卡住,但由于它不在产品tomcat7的tomcat6环境升级,所以这是不可用的。
特殊改性方法:
复制代码代码如下所示:
<执行名称=tomcatthreadpoolnameprefix =卡特琳娜EXEC -maxthreads =150minsparethreads = 4 / GT
取消注释,然后你可以修改你的价值要maxthreads和minsparethreads两参数,maxthreads是最方便的多线程允许。
通常150应该是足够的,下面的参数表示驻留服务线程的最小数量,也就是说,这些线程将等待服务。
<连接器执行=tomcatthreadpool 8080 港口= =http协议 / 1.1
connectiontimeout =20000maxtreads =500minsparethreads =30maxsparethreads =50
uriencoding =UTF-8keepalivetimeout =15000
redirectport = 8443 />
修改连接节点和增加执行=tomcatthreadpool 配置
这基本上解决了这个问题,参数的具体含义,其中两个与上面提到的相同。执行器代表上面的执行器节点的引用,该配置的所有线程都将在该池中。
keepalivetimeout表明每个线程可以停留的时间最长,即可以生存的时间最长。
随着这些变化,我们将不会libvirt线程Tomcat卡住,一旦被套,只有15秒的一个线程,除非你也可以要求有500个线程,否则Tomcat可以提供正常的服务,只是上面没有调整参数,无法测试,只是一个临时的解决方案,具体的价值还需要在根据实际情况,通过多组数据的对比试验,然后确定一个值。