Jenkins节点显示离线但服务器端Agent已连接的故障排查求助
Jenkins节点显示离线但Agent已连接的故障排查分析
问题背景
我有一个Jenkins仪表板,关联了多个Freestyle项目与节点。此前通过Windows服务器上的管理员权限CMD脚本自动启动对应Agent,所有节点均可自动上线,该模式正常运行超一年。但近期所有节点突然显示离线,尽管服务器端Agent已连接。即使重启Jenkins服务、终止自动启动Agent的脚本并手动启动Agent,Jenkins节点仍显示离线。基础设施与服务器团队处理过服务器卡顿问题,但表示不清楚原因,认为是Jenkins应用的变更导致,而我们并未进行任何变更。近期唯一的变化是启用了自动化并行模式,该模式会启动大量Chrome实例,可能对服务器造成了一定影响,但不确定是否与此故障相关。
相关信息
Agent启动脚本
java -jar agent.jar -jnlpUrl <jenkins_url>/jenkins-agent.jnlp -secret <secret_key> -workDir "<work_directory>"
CMD输出关键信息
INFO: Agent discovery successful Agent address: <address> Agent port: <redacted> INFO: Connected
Jenkins节点日志输出
Inbound agent connected from <redacted> Remoting version: 3107.v665000b_51092 Launcher: JNLPLauncher Communication Protocol: JNLP4-connect
附加远程日志记录
Send Unexport FINEST hudson.slaves.SlaveComputer JNLP4-connect connection from <server ip info>:54036 wrote 1443: Unexport FINEST org.jenkinsci.remoting.protocol.impl.SSLEngineFilterLayer [JNLP4-connect connection from <server ip info>:54036] APP ENCODE: 1,445 bytes FINEST org.jenkinsci.remoting.protocol.impl.SSLEngineFilterLayer [JNLP4-connect connection from <server ip info>:54036] Handshake status: NOT_HANDSHAKING engine result: Status = OK HandshakeStatus = NOT_HANDSHAKING bytesConsumed = 1445 bytesProduced = 1483 sequenceNumber = 19 FINEST org.jenkinsci.remoting.protocol.impl.SSLEngineFilterLayer [JNLP4-connect connection from <server ip info>:54036] APP SEND: 1,483 bytes FINEST org.jenkinsci.remoting.protocol.impl.NIONetworkLayer [JNLP4-connect connection from <server ip info>:54036] SEND: 1,483 bytes FINEST org.jenkinsci.remoting.protocol.IOHub Scheduling adding OP_WRITE to channel=java.nio.channels.SocketChannel[connected local=/<ip>:49854 remote=<server ip info>:54036], selector=sun.nio.ch.WEPollSelectorImpl@4bbcc33e, interestOps=1, readyOps=4 FINE hudson.remoting.Channel Send Unexport
可能的故障原因及排查方向
1. 服务器资源耗尽(与并行Chrome实例直接相关)
近期启用的并行模式会启动大量Chrome实例,结合基础设施团队处理过服务器卡顿的情况,这是最可能的诱因:
- 当Windows服务器的CPU、内存或磁盘IO被耗尽时,Agent进程虽能建立基础连接,但无法及时响应Jenkins主节点的心跳或状态检查请求,导致主节点判定节点离线。
- 从日志看,Agent与主节点的TCP连接已建立,但后续的
Send Unexport操作可能因资源不足无法完成完整交互,最终引发节点状态异常。
排查建议:
- 打开Windows任务管理器,查看Agent进程的CPU、内存占用,以及所有Chrome实例的资源消耗总和。
- 临时关闭并行模式,减少Chrome实例数量,手动重启Agent后观察节点是否能正常在线。
2. Jenkins Remoting协议会话异常
日志中出现的Send Unexport通常表示主节点尝试终止Agent会话,结合场景可能存在以下问题:
- 版本不兼容:即使未主动变更Jenkins,主节点的Remoting插件可能被自动更新,而服务器上的
agent.jar仍是旧版本,导致连接后立刻被断开。 - 密钥或权限问题:服务器卡顿可能导致密钥缓存失效,或者节点配置中的Secret密钥与启动脚本中的
<secret_key>出现隐性不一致(比如脚本被意外修改)。
排查建议:
- 从Jenkins主节点重新下载最新的
agent.jar替换服务器上的版本,再重启Agent。 - 核对节点配置中的Secret密钥,确保和启动脚本中的内容完全一致。
3. Windows服务器网络或TCP栈异常
虽然连接能建立,但可能存在隐性网络问题:
- 基础设施团队处理服务器卡顿的过程中,可能调整了防火墙规则或网络策略,导致Agent与主节点的心跳包被丢弃。
- Windows的TCP/IP栈出现异常(比如TIME_WAIT连接过多),导致新会话无法维持稳定通信。
排查建议:
- 检查Windows服务器的防火墙日志,确认是否有Jenkins主节点IP的拦截记录。
- 执行
netstat -ano命令查看TCP连接状态,是否存在大量异常连接。 - 执行
netsh int ip reset重置TCP/IP服务,再重启Agent尝试连接。
4. Jenkins主节点状态缓存或磁盘问题
Jenkins主节点可能存在状态更新异常:
- 重启Jenkins服务后,节点状态缓存未完全清理,导致显示的离线状态未更新。
- 主节点磁盘空间不足,无法写入节点状态数据,导致状态更新失败。
排查建议:
- 检查Jenkins主节点的磁盘可用空间,确保有足够余量。
- 在Jenkins界面中对离线节点执行
Mark this node as online操作,观察状态是否能更新。
内容的提问来源于stack exchange,提问作者elads11
相关产品推荐
相关产品推荐

