服务器之家:专注于服务器技术及软件下载分享
分类导航

Linux|Centos|Ubuntu|系统进程|Fedora|注册表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服务器之家 - 服务器系统 - Linux - Tomcat中应用调用Libvirt库进行控制时可能导致线程卡死问题的解决方法

Tomcat中应用调用Libvirt库进行控制时可能导致线程卡死问题的解决方法

2019-12-09 17:21服务器之家 Linux

启动一个线程由于实时的检测主机的断开连接状态,当状态不正常的时候,在获取connection的方法中直接抛出异常,阻止后续的逻辑的执行。但是这样只能解决状态问题,不能解决在这个状态获取的间隙中的界面点击问题,查找到资

最近的项目中有用到libvirt的java包进行libvirt的远程命令调用,进行kvm的管理。我们的测试人员一个偶然的机会下测试出来,在控制连接状态的时候,可能存在一个严重的bug,由于界面上的flex应用在每次点击虚拟机节点的时候,会导致对后台的remote service进行大约3-4次的调用,而这些remote service中会利用libvirt的结构进行结果的获取,我们为了提高效率,将libvirt的链接进行了保持,而不是每次都进行重连,以减少性能的损耗。

存在这样的情况,当网络正常的时候,建立起来的connection,一直在内存中驻留,此时如果拔掉网线,这个链接也不会断开,由于内存中这个connection的值也不为空,无法判断链接是否断开,所以在此点击界面的时候,一点调用了libvirt的接口,就会一直卡住界面多点击几次后,tomcat的所有可服务线程就都卡住了,导致整个界面无法使用。

解决方法为:启动一个线程由于实时的检测主机的断开连接状态,当状态不正常的时候,在获取connection的方法中直接抛出异常,阻止后续的逻辑的执行。但是这样只能解决状态问题,不能解决在这个状态获取的间隙中的界面点击问题,查找到资料发现tomcat的线程池模型也许可以帮忙,于是将线程池用上了,测试过后,终于发现可以了。

据说tomcat7可以检测哪个线程被卡死了,但是由于条件显示没有将产品中的tomcat6环境升级为tomcat7,所以这个也就不可用了。

具体修改方法:

 

复制代码

代码如下:


<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/&gt
取消掉这段的注释,然后可以修改maxThreads和minSpareThreads两个参数为你想要的值,maxThreads比较简单允许的最多线程数
通常150应该足够了,后面的这个参数呢,表示最小的驻留服务线程数,也就是说这些线程会一直等待服务。</p> <p><Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" 
connectionTimeout="20000" maxTreads="500" minSpareThreads="30" maxSpareThreads="50"
URIEncoding="UTF-8" keepAliveTimeout="15000"
redirectPort="8443" /></p> <p>修改Connector节点,增加executor="tomcatThreadPool",maxThreads,minSpareThreads,maxSpareThreads,keepAliveTimeout等参数的配置
这样就基本上解决了问题,参数具体含义呢,其中两个和上面提到的意义是一样的,executor表示对上面的那个Executor节点的引用,所有这个配置的线程都会在那个池中。
keepAliveTimeout表示每个线程能被卡住的最长时间,也就是能存活的最长时间。

 

有了上述修改后,我们的tomcat就再也不会被libvirt线程卡住了,一旦卡住,也只是15秒的一个线程,除非能同时请求操过500个线程,否则tomcat都能正常的提供服务了,只是上述参数没经过调优,性能各方面都没有测试,只是临时解决,具体数值的大小,还是需要按照实际情况,经过多组数据的测试对比后然后确定一个值。

延伸 · 阅读

精彩推荐
  • LinuxLinux上设置用户通过SFTP访问目录的权限的方法

    Linux上设置用户通过SFTP访问目录的权限的方法

    这篇文章主要介绍了Linux上设置用户通过SFTP访问目录的权限的方法,SFTP可以理解为使用SSH协议进行FTP传输的协议,因而同时要对OpenSSH进行相关设置,需要的朋...

    OSChina10022019-06-19
  • Linux手把手教您在 Linux 上使用 GPG 加解密文件

    手把手教您在 Linux 上使用 GPG 加解密文件

    在本教程中,我将告诉你如何用 GPG 加密和解密文件。这是一个简单的教程,你可以在你的 Linux 系统上尝试所有的练习。这将帮助你练习 GPG 命令,并在你...

    Linux中国6962021-12-15
  • LinuxLinux常用的日志文件和常用命令

    Linux常用的日志文件和常用命令

    成功地管理任何系统的关键之一,是要知道系统中正在发生什么事。 Linux 中提供了异常日志,并且日志的细节是可配置的。Linux 日志都以明文形式存储,所...

    Linux教程网2632020-04-18
  • Linuxlinux中rmdir命令使用详解(删除空目录)

    linux中rmdir命令使用详解(删除空目录)

    今天学习一下linux中命令: rmdir命令。rmdir是常用的命令,该命令的功能是删除空目录,一个目录被删除之前必须是空的 ...

    linux命令大全5372019-11-19
  • Linux详解Linux系统下PXE服务器的部署过程

    详解Linux系统下PXE服务器的部署过程

    这篇文章主要介绍了Linux系统下PXE服务器的部署过程,包括对PXE的API架构作了一个基本的简介,需要的朋友可以参考下...

    运维之道9812019-07-04
  • LinuxLinux lnmp下无法使用mail发邮件的两种解决方法

    Linux lnmp下无法使用mail发邮件的两种解决方法

    在配置了lnmp环境后,出现了mail函数不能发送邮件的问题,其实有两种方法,一是使用sendmail组件,而是使用postfix。下面为大家一一介绍下 ...

    Linux之家4042019-09-17
  • Linux确保Linux系统安全的前提条件 漏洞防护

    确保Linux系统安全的前提条件 漏洞防护

    Linux 作为开放式的操作系统受到很多程序员的喜爱,很多高级程序员都喜欢编写Linux操作系统的相关软件。这使得Linux操作系统有着丰富的软件支持,还有无...

    Linux之家2642020-04-11
  • LinuxLinux中环境变量配置的步骤详解

    Linux中环境变量配置的步骤详解

    Linux中环境变量包括系统级和用户级,系统级的环境变量是每个登录到系统的用户都要读取的系统变量,而用户级的环境变量则是该用户使用系统时加载的...

    Myths7882022-02-10