防火墙会话老化导致 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 注意事项
-
带宽影响
30 秒级回收 ≈ 0.0003 Mbps,可忽略。 -
回滚方式
删除新增 4 行,恢复默认即可。 -
监控脚本(可选)
# 每 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 卡死问题。
本文来自博客园,作者:元贞,转载请注明原文链接:https://www.cnblogs.com/yuleicoder/p/19054457
浙公网安备 33010602011771号