博客
关于我
Tomcat 启动速度慢,一直转圈的原因
阅读量:771 次
发布时间:2019-03-23

本文共 1422 字,大约阅读时间需要 4 分钟。

Tomcat启动速度慢的原因分析及解决方案

在刚刚安装的CentOS7系统上,Tomcat启动速度异常缓慢。经过一系列排查,最初我误以为是程序本身的问题,于是我将webapps目录下的所有应用程序删除,仅保留了Tomcat自带的脚本。这看似合理的操作却引发了一系列令人费解的问题。

初步排查发现,Tomcat的JVM进程已经正常运行,故排除了JVM本身退出的可能性。进一步分析系统资源使用情况,发现CPU、内存和硬盘空间都未成问题,网络和硬盘I/O流量也未出现异常。这个时候,问题变得颇为棘手,因为所有资源都处于充裕状态,但Tomcat却被一些隐藏的问题严重阻塞。

最终,通过虚拟化环境的比较,我发现问题依然存在。为了进一步定位问题,我尝试使用strace工具进行系统调试。这一工具能够跟踪进程的系统调用,从而帮助我发现Tomcat停留在哪个系统调用上。

通过运行strace -f -o strace.out ./catalina.sh run,我可以详细追踪Tomcat的系统调用行为。观察strace输出文件,发现Tomcat页面生成过程中频繁访问/dev/random,并且该设备的读取操作处于阻塞状态。

进一步调查发现,/dev/random是用于生成随机数的设备。如果设备无法产生足够的熵(在熵池中不存在充分的randomness),就会导致读取操作阻塞。Tomcat生成Session ID时会调用/dev/random来获取随机数种子,而该设备的性能显得不足。

为了解决这个问题,有三种解决方案可以选择:

  • 替换随机数源:将/dev/random替换为性能更高的/dev/urandom。这一方法直接解决了性能瓶颈问题。具体操作如下:

    • 修改Tomcat启动脚本,添加参数-Djava.security.egd=file:/dev/urandom
    • 或者编辑JAVA_PATH/jre/lib/security/java.security文件,修改securerandom.sourcefile:/dev/urandom
  • 增大熵池:如果设备支持,利用硬件加速的随机数生成器(如Intel的RDRAND)来提供额外的熵源。这样可以显著提高熵池的容量和生成速度。

  • 使用rngd服务:如果硬件不支持RDRAND,可以使用rngd服务来增大熵池容量。这涉及安装并配置rngd服务:

    yum install rng-toolssystemctl start rngdsystemctl enable rngd

    这种方法尤其适用于虚拟化环境,能够有效提升整体系统性能。

  • 在实际操作中,我发现直接修改Tomcat配置并不能全面解决问题,因为这仅适用于Java环境下的应用。此外,其他应用如Apache、Nginx、OpenSSL等也可能受到/dev/random性能上的影响。因此,最终决定使用rngd服务来增大熵池容量,这样能够系统性地提升整个系统的随机数生成能力。

    通过以上方法,Tomcat启动速度得到了显著提升。随后,我还验证了随机数生成的效率,用dd if=/dev/random of=random.dat count=40960测试,结果显示系统能够快速生成所需的随机数。

    总的来说,这个问题主要是由随机数生成设备无法满足需求引起的。理解和分析系统调用行为的关键在于结合设备特性和应用场景,选择最合适的解决方案才能实现彻底修复。

    转载地址:http://wbkkk.baihongyu.com/

    你可能感兴趣的文章
    python知识:@classmethod和@staticmethod的异同
    查看>>
    python前端之css
    查看>>
    Python制作进度条,原来有这么多方法
    查看>>
    Python制作简单的学生成绩管理系统
    查看>>
    python制作甘特图的基本知识(附Demo)
    查看>>
    python制作一个简单的服务器,【Python】 做一个简单的 http 服务器
    查看>>
    Python到底能做什么?它的优点在哪?
    查看>>
    python利用pytorch库导出图像分割算子
    查看>>
    python利用pyshark监听网卡来抓包其中pyshark中摸索的一些可用参数
    查看>>
    python利用excel分析过杀漏失
    查看>>
    python判断汉字数目
    查看>>
    python判断文件是空的,如果是空的,就删除
    查看>>
    python判断密码是否正确_python密码判断是否符合要求的方法
    查看>>
    python判断字符串包含中文_Python 判断字符串是否包含中文
    查看>>
    python删除第一行_Python 乱码指北:一行删掉根目录
    查看>>
    Python删除列表元素的三种方法
    查看>>
    python初步学习-python数据类型-集合(set)
    查看>>
    python列表生成字典_Python中将字典转换为列表的方法
    查看>>
    python列表对应元素合并为列表及判断一个列表是几维
    查看>>
    python列表去重复后按照顺序_从包含不可共元素的Python列表中删除重复元素,同时保留顺序?...
    查看>>