防火墙会话老化导致 Confluence 卡死

防火墙会话老化导致 Confluence 卡死:一次 30 秒内自愈的完整排障记录

日期:2025-08-23

关键词:Confluence、c3p0、防火墙会话老化、TCP keepalive、30 秒 SLA


1 问题现象

  • 症状:IDC 防火墙会话表被清空后,Confluence 7.13.7 页面出现 5-30 秒白屏
  • 根因:c3p0 连接池默认 永不回收 连接,TCP 半开连接被复用,导致 HTTP 线程卡住 2 小时+(见 StuckThreadDetectionValve 日志)。
  • 规模:500 人并发,节点 16 vCPU / 64 GB。

2 环境信息

组件 版本 / 配置
Confluence 7.13.7
连接池 c3p0
数据库 MySQL 8.0(端口 6033,ProxySQL 前端)
防火墙 IDC 级,会话老化 60-120 秒
节点 CentOS 7,千兆带宽,内核 5.x

3 诊断过程

3.1 日志确认

23-Aug-2025 14:19:31.468 WARNING [Catalina-utility-3] org.apache.catalina.valves.StuckThreadDetectionValve.notifyStuckThreadCompleted
Thread [http-nio-8090-exec-8] ... was active for approximately [7,259,621] milliseconds.

3.2 MySQL 进程列表

mysql> show processlist;
  • 20+ 条 confluence 连接 Sleep 时间 > 9991 秒
  • 两条被 Killed,说明 TCP 半开 但应用未察觉。

3.3 操作系统 TCP 保活参数

sysctl -a | grep -E 'keepalive_time|keepalive_intvl|keepalive_probes'

输出:

net.ipv4.tcp_keepalive_time = 7200
net.ipv4.tcp_keepalive_intvl = 75
net.ipv4.tcp_keepalive_probes = 9

7200 秒远大于防火墙老化周期,OS 很久才踢掉死连接。


4 解决方案

4.1 c3p0 连接池(30 秒级)

<confluence-home>/confluence.cfg.xml仅修改 4 行

<!-- 30 秒探活 + 30 秒强制回收 -->
<property name="hibernate.c3p0_idle_test_period">15</property>
<property name="hibernate.c3p0_max_idle_time">30</property>
<property name="hibernate.c3p0_max_connection_age">30</property>
<property name="hibernate.c3p0_preferred_test_query">SELECT 1</property>
  • idle_test_period=15:每 15 秒探活一次空闲连接;
  • max_idle_time=30:空闲 30 秒即回收;
  • max_connection_age=30:无论忙/闲,30 秒必换新连接;
  • preferred_test_query=SELECT 1:轻量级探活 SQL。

4.2 操作系统 TCP 保活(可选兜底)

# 临时生效
sysctl -w net.ipv4.tcp_keepalive_time=30
sysctl -w net.ipv4.tcp_keepalive_intvl=10
sysctl -w net.ipv4.tcp_keepalive_probes=3

# 永久生效
cat >> /etc/sysctl.d/99-confluence.conf <<EOF
net.ipv4.tcp_keepalive_time=30
net.ipv4.tcp_keepalive_intvl=10
net.ipv4.tcp_keepalive_probes=3
EOF
sysctl -p /etc/sysctl.d/99-confluence.conf

4.3 重启生效

systemctl restart confluence

5 效果验证

测试项 结果
防火墙 conntrack -D 清会话 30 秒内页面恢复
MySQL show processlist 最长 Sleep 时间 ≤ 30 秒
catalina.out 无 2 小时级卡线程

6 注意事项

  1. 带宽影响
    30 秒级回收 ≈ 0.0003 Mbps,可忽略。

  2. 回滚方式
    删除新增 4 行,恢复默认即可。

  3. 监控脚本(可选)

# 每 30 秒探活 /rest/api/space
while true; do
  curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8090/rest/api/space || systemctl restart confluence
  sleep 30
done

7 总结

维度 优化前 优化后
恢复时间 2-30 分钟 ≤ 30 秒
用户感知 页面卡死 无感知
额外资源 0 0.0003 Mbps

通过 c3p0 30 秒级回收 + OS 60 秒级 keepalive,彻底解决了防火墙会话老化导致的 Confluence 卡死问题。

posted @ 2025-08-23 15:03  元贞  阅读(19)  评论(0)    收藏  举报