CentOS 上 Tomcat 启动慢的定位与解决
一、快速定位是否由熵不足导致
- 查看 Tomcat 启动日志,若出现类似日志:
org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance … took [55,507] milliseconds
多半是生成 SecureRandom 的熵不足所致。
- 检查系统熵值:
cat /proc/sys/kernel/random/entropy_avail
数值通常低于 100 时更容易出现阻塞。
- 对比阻塞与非阻塞随机源速度:
cat /dev/random | od -x | head -n 1
cat /dev/urandom | od -x | head -n 1
若前者明显更慢,即可确认是熵瓶颈。
二、优先方案 增加系统熵或改用非阻塞熵源
- 安装并启动硬件随机数服务(推荐):
yum install -y rng-tools
systemctl start rngd
systemctl enable rngd
如 CPU 支持 RDRAND,rngd 会使用硬件源加速熵池填充。
- 在 Tomcat 启动参数中指定熵源(无需改 JDK 文件):
编辑 $TOMCAT_HOME/bin/catalina.sh,在文件靠前位置加入:
JAVA_OPTS=“$JAVA_OPTS -Djava.security.egd=file:/dev/urandom”
- 直接修改 JDK 安全配置(可选):
编辑 $JAVA_HOME/jre/lib/security/java.security,将
securerandom.source=file:/dev/random
改为
securerandom.source=file:/dev/urandom
某些 JDK/版本上也可写为 /dev/./urandom 以绕过内置替换规则。
- 风险提示:/dev/urandom 为非阻塞源,安全性略低于 /dev/random;在绝大多数 Web 应用场景下可接受,若对随机强度有极高要求,应优先采用 rngd 增加熵池。
三、Tomcat 配置与 JVM 层面的优化
- 连接器与线程模型:
使用 NIO 或 APR 提升 I/O,合理设置线程与队列,示例:
- 启用压缩以减少后续网络传输开销:
compression=“on” compressionMinSize=“2048”
compressableMimeType=“text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json”
- JVM 内存与 GC(示例,按机器内存调整):
JAVA_OPTS=“-server -Xms2g -Xmx2g -XX:+UseG1GC -Djava.awt.headless=true -Dfile.encoding=UTF-8”
- 精简应用与自动部署:
删除 webapps 下不需要的应用(如 examples、docs、host-manager),必要时将 Host 的 autoDeploy/deployOnStartup 设为 false,减少启动扫描与部署耗时。
四、系统与内核层面的优化
- 文件描述符与内核网络参数:
在 /etc/security/limits.conf 增加:
- soft nofile 65536
- hard nofile 65536
在 /etc/sysctl.conf 增加:
net.core.somaxconn 65535
fs.file-max 65536
执行 sysctl -p 使配置生效。
- 透明大页(THP):部分环境下会拖慢 JVM 初始化,建议禁用:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
如需持久化,可加入 /etc/rc.local 或 systemd 服务。
五、验证与回退建议
- 重启 Tomcat 并观察日志,确认是否仍有
“Creation of SecureRandom instance … took” 的长耗时;
再次查看 entropy_avail,应明显高于之前的数值。
- 若修改了 java.security,建议保留原始行并添加注释,便于回退;
若使用 -Djava.security.egd,可直接移除该参数恢复默认熵源。