Azure DevOps自托管Agent离线及EC2无法SSH问题排查求助
EC2自托管Azure DevOps Agent间歇性卡住离线且无法SSH连接的排查问题
问题描述
在Azure DevOps中运行Pipeline时,部署在EC2实例上的自托管Agent偶尔会卡住并离线,之后无法通过SSH连接该EC2实例。需判断该问题是否由AWS服务中断导致,或是其他原因,同时确认是否与提供的Pipeline配置相关。
提供的Pipeline配置
# Dependabot # Maven # Build your Java project and run tests with Apache Maven. # Add steps that analyze code, save build artifacts, deploy, and more: # https://docs.microsoft.com/azure/devops/pipelines/languages/java schedules: - cron: "0 12 * * 0" displayName: Weekly Dependency Updates branches: include: - main always: true trigger: - master pool: name: TestAgent demands: - Agent.Name -equals NewAgent stages: - stage: CheckDependencies displayName: 'Check Dependencies' jobs: - job: Dependabot displayName: 'Run Dependabot' variables: - name: DIRECTORY_PATH value: / - name: PACKAGE_MANAGER value: bundler - name: PROJECT_PATH value: sugamarora23/_git/DriveEasy # Optional : User to assign to the created pull request # Name : Assignee # value : any steps: - task: dependabot@1 displayName: 'Run Dependabot' inputs: failOnException: false - script: git clone https://github.com/dependabot/dependabot-script.git displayName: Clone Dependabot config repo - script: | cd dependabot-script docker build -t "dependabot/dependabot-script" -f Dockerfile . displayName: Build Dependabot Image - script: | docker run --rm -e AZURE_ACCESS_TOKEN='$(PAT)' \ -e GITHUB_ACCESS_TOKEN='$(GHPAT)' \ -e PACKAGE_MANAGER='$(PACKAGE_MANAGER)' \ -e PROJECT_PATH='$(PROJECT_PATH)' \ -e DIRECTORY_PATH='$(DIRECTORY_PATH)' \ dependabot/dependabot-script displayName: Dependabot
已完成操作
- 搭建基于EC2实例的Azure DevOps自托管Agent,配置Pipeline并设置每周依赖更新的定时任务
- 指定TestAgent池及NewAgent运行Pipeline,执行Dependabot依赖更新
预期与实际结果
- 预期:Pipeline按计划成功运行,完成依赖更新且无异常
- 实际:Pipeline运行期间,EC2上的自托管Agent偶尔卡住离线,之后无法SSH连接EC2,问题间歇性发生,原因不明
排查方向与解决建议
一、排除AWS服务中断因素
- 查看AWS对应区域的服务健康仪表盘,确认EC2、VPC等相关服务是否有历史中断记录,对比问题发生时间是否匹配
- 检查EC2实例的事件历史(AWS控制台→EC2→实例→事件历史),查看是否有AWS触发的重启、维护等操作
二、排查Pipeline配置与Agent运行负载问题
资源耗尽导致实例无响应
- 检查EC2实例的监控指标(CPU、内存、磁盘IO、网络带宽),确认问题发生时是否出现资源占满的情况:
- Pipeline中的Docker镜像构建与运行操作会占用大量CPU和内存,若EC2实例规格过小,极易因资源耗尽导致系统无响应
- 可在Agent运行时添加资源监控脚本,记录Pipeline执行期间的资源使用情况
- 检查磁盘空间:Docker镜像和容器会持续占用磁盘空间,若实例磁盘已满,会直接导致系统崩溃或无法连接
- 检查EC2实例的监控指标(CPU、内存、磁盘IO、网络带宽),确认问题发生时是否出现资源占满的情况:
Docker相关操作的潜在冲突
- Pipeline中同时执行了
dependabot@1任务和手动克隆脚本、构建镜像运行容器的操作,存在重复执行Dependabot的情况,可能引发资源冲突 - 手动构建Docker镜像后未清理旧镜像,会持续占用磁盘空间,最终导致实例异常
- 给Docker容器添加资源限制(如
--memory、--cpus参数),避免单个容器耗尽实例资源;同时收集容器运行日志,排查是否存在内存泄漏或进程僵死问题
- Pipeline中同时执行了
Agent本身的稳定性问题
- 检查自托管Agent的日志(默认路径:
_diag文件夹下的日志文件),查看离线前是否有错误、超时或资源不足的提示 - 确认Agent版本是否为最新,旧版本可能存在已知的稳定性缺陷
- 检查Agent运行用户的权限,确保其拥有执行Docker操作的足够权限,权限不足可能导致进程卡住
- 检查自托管Agent的日志(默认路径:
三、网络与SSH连接问题排查
- 检查EC2实例的安全组、NACL配置,确认SSH端口(22)是否始终开放,是否存在临时的网络规则变更
- 获取EC2实例的系统日志(AWS控制台→EC2→实例→获取系统日志),查看是否有SSH服务崩溃、系统内核报错等信息
- 在Agent中添加定时心跳脚本,或配置AWS CloudWatch告警,当实例无响应时自动触发重启
四、临时缓解方案
- 给EC2实例启用自动恢复(AWS控制台→EC2→实例→操作→实例设置→启用自动恢复),当实例检测到状态异常时自动重启
- 调整Pipeline配置,去掉重复的Dependabot任务,仅保留一种执行方式(要么用
dependabot@1任务,要么用手动Docker运行方式) - 升级EC2实例规格,增加CPU和内存资源,避免因资源不足导致的系统崩溃
内容的提问来源于stack exchange,提问作者Sugam Arora
相关产品推荐
相关产品推荐

