Skip to main content

分析你的 GitHub Enterprise Server 实例上的 Git 流量

使用调控器识别在实例上驱动负载的 Git 流量模式,以便排查 Git 操作缓慢问题并减少性能影响。

关于州长

Governor 是一个用于监控您的实例中 Git 活动的内置工具。 ghe-governor使用命令查看正在创建负载的存储库、用户、IP 地址和 Git 操作。

当 CPU、内存或磁盘使用率增加时使用此数据,需要确认 Git 流量是否为原因。 有关命令语法和子命令,请参阅 命令行实用程序

调控器仅记录 Git 操作。 它不包括 API 或 Web 流量。 若要检查当前正在运行的操作,请参阅 ghe-btop命令行实用程序 中的实用工具。

关于调控器数据文件

Governor 将其数据存储在 /data/user/governor/ 下的文件中。 每个文件保存一小时的数据,并保留两周。 文件名包含 Unix 时间戳,这些时间戳指示每个文件涵盖的时间段。

注意

在 GitHub Enterprise Server 3.13 及更早版本中,调控器数据文件位于 /data/user/gitmon/ 并使用以下命名模式 gitmon.<timestamp>.db

若要确认磁盘上当前保存的数据范围,请将最早和最新的文件名中的时间戳转换为可读日期。

for epoch in $(sudo ls /data/user/governor/ 2>/dev/null | grep '^governor\.' | sort | sed -n '1p;$p' | cut -f2 -d.); do echo "${epoch} = $(date -d @${epoch})"; done

输出显示最早和最新数据文件的开始时间。

1551186000 = Tue Feb 26 13:00:00 UTC 2019
1552392000 = Tue Mar 12 12:00:00 UTC 2019

在您开始之前

在运行调控器查询之前,请收集以下信息:

  • 对设备的 SSH 访问。 需要访问管理程序才能运行 ghe-governor。 请参阅“访问管理 shell (SSH)”。
  • 要查询的节点。 对于独立部署或高可用性部署,请从主节点上开始。 对于群集,请在每个 git-server 节点上运行查询,因为没有单个节点包含所有 Git 流量。
  • 影响时间窗口。 请注意报告的降级的开始和结束时间,以便你可以将查询范围限定为 -t-u
  • 存储库或组织名称(如果用户报告了特定存储库或组织的问题)。

确定 Git 是否参与加载

先给出总体概述,然后将负载归因到具体的存储库或程序。

  • 汇总实例上所有最近的 Git 活动:

    ghe-governor health
    
  • 查找具有最慢平均响应时间的存储库:

    ghe-governor aggregate repo avg_rt
    
  • 查找具有最长单个操作的存储库:

    ghe-governor aggregate repo max_rt
    
  • 查找最慢的单个操作(未分组):

    ghe-governor top rt -n 50
    
  • 查找占用最多 CPU 时间的存储库:

    ghe-governor aggregate repo cpu
    
  • 对于突出的存储库,请查找哪个 Git 子程序负责其 CPU 使用率:

    ghe-governor aggregate program cpu -r OWNER/REPOSITORY
    
  • 查找占用最多 CPU 时间的 pack-objects 存储库。 pack-objects 程序会组装在克隆和抓取期间发送给客户端的数据;数量过多时,会给设备带来显著的 CPU 和内存压力:

    ghe-governor aggregate repo cpu -P pack-objects
    
  • 查找使用 CPU 时间最多的单个操作(未分组):

    ghe-governor top cpu -n 50
    
  • 查找在特定时间间隔内驱动最大磁盘写入的存储库:

    ghe-governor aggregate repo disk_write_kb -t START-TIME -u END-TIME
    
  • 检查高并发性,这表示许多 Git 操作同时运行:

    ghe-governor aggregate repo max_parallelism
    

如果结果指向特定的存储库或程序,请继续阅读下面的相关部分。

识别主要克隆和抓取流量

程序 upload-pack 在克隆和提取期间处理提供给客户端的数据。 使用这些查询可查找哪些存储库、用户和 IP 地址正在推动最多的克隆和提取活动。

  • 按存储库统计克隆和提取操作:

    ghe-governor aggregate repo count -P upload-pack
    
  • 识别执行克隆和抓取操作的用户,并统计其操作次数:

    ghe-governor aggregate user_id count -P upload-pack
    
  • 标识生成最多克隆和提取请求的 IP 地址。 少量 IP 地址却具有较高数量,这通常表明是一个 CI 运行器集群:

    ghe-governor aggregate ip count -P upload-pack
    
  • 测量每个存储库提供的数据总量:

    ghe-governor aggregate repo uploaded_kb -P upload-pack
    
  • 测量每个用户上传的数据的平均量:

    ghe-governor aggregate user_id avg_uploaded -P upload-pack
    
  • 查找每个存储库的峰值克隆和提取并发。 MAXPL 列显示每个存储库记录的并发操作最高数量。 少数几个仓库出现较高数值表明发生了惊群现象:

    ghe-governor aggregate repo max_parallelism -P upload-pack
    
  • 查找最大的单次克隆或抓取操作(未分组):

    ghe-governor top uploaded -P upload-pack -n 50
    

识别推送流量占比较高的流量

receive-packspokes-receive-pack 程序处理在推送过程中从客户端接收的数据。 使用这些查询可查找哪些存储库、用户和 IP 地址生成了最多的推送活动。

  • 按存储库对推送操作进行计数:

    ghe-governor aggregate repo count -P receive-pack -P spokes-receive-pack
    
  • 识别向组织推送的用户,并统计其推送操作次数:

    ghe-governor aggregate user_id count -o ORGANIZATION -P receive-pack -P spokes-receive-pack
    
  • 测量每个存储库收到的数据总量:

    ghe-governor aggregate repo received_kb -P receive-pack -P spokes-receive-pack
    
  • 标识发送最多推送数据的 IP 地址:

    ghe-governor aggregate ip received_kb -P receive-pack -P spokes-receive-pack
    
  • 查找最大的单个推送操作(未分组):

    ghe-governor top received -P receive-pack -P spokes-receive-pack -n 50
    

缩小分析范围

可以将以下选项的任意组合添加到或ghe-governor top``ghe-governor aggregate命令中,以便将查询焦点放在特定的时间窗口、存储库、所有者或程序上。

时间筛选器

OptionDescription
-t <timespec>仅考虑给定开始时间以来的操作。 默认值为 48 小时前。
-u <timespec>仅考虑截至给定结束时间的操作。 默认值为当前时间。

接受 <timespec>以下格式。

FormatExampleMeaning
Unix 时间戳-t 1371614483自 1970 年 1 月 1 日起的秒数
Java时间戳-t 1371614483637自 1970 年 1 月 1 日起的毫秒数
相对天数-t 1d最后一天
相对小时数-t 2h最近两个小时
相对分钟数-t 20m最后二十分钟

作用域筛选器

OptionDescription
-r <owner>/<repository>仅考虑与给定所有者和存储库匹配的操作。 多次指定此选项以匹配多个存储库。
-o <owner>仅考虑与给定所有者匹配的操作,例如用户或组织。 多次指定此选项以匹配多个所有者。
-P <program>只考虑运行给定 Git 子程序的操作,例如upload-packreceive-packrev-list``pack-objects。 多次指定此选项以匹配多个程序。
-I <address>仅考虑来自特定 IP 地址的操作。 多次指定此选项以匹配多个地址。

输出选项

OptionDescription
-j将输出格式设置为 JSON 而不是 ASCII 表。
-n <N>将输出限制为 N 条记录。 对于聚合查询,默认值为 20;对于排名靠前的查询,默认值为 200。
--count-only仅显示 KEYCOUNT 列。 仅适用于聚合查询。

解读结果列

以下缩写显示在 ghe-governor 结果表中。

Meaning
AVG RTGit 调用所花费的平均时间(以秒为单位)
MAX RT每台主机运行时间最长的调用的运行时长(以秒为单位)
MAXPL / AVGPL最大和平均并行度:某一时刻同时有多少个尚未完成的 Git 调用
CPU/SECGit 每秒实际经过时间所使用的 CPU 时间秒数。 除以 CPU 核心数,乘以 100 以获取特定于 Git 的 CPU 百分比。 此值不能超过 CPU 核心数。
UPL服务器上传到客户端的数据,例如在抓取和克隆期间
RECV服务器从客户端接收的数据,例如在推送期间

READ WRITE UPLRECV列以 GB 为单位报告,相应的速率以兆字节/秒(MB/秒)报告。

解释常见模式

下表将常见的调控器输出模式映射到其可能的原因。

Pattern可能的原因
来自少数 IP 地址的高 upload-pack 计数CI 运行程序机群重复克隆一个或多个存储库,而不是重复使用本地签出
max_parallelism少量存储库的高雷霆牧民:许多运行程序同时触发并发克隆,通常是因为计划作业同时启动
每个存储库的uploaded_kb较大,且每个用户的avg_uploaded较高重复的完整克隆;客户端未重用本地签出,或者未使用浅表或部分克隆
存储库或组织的高received_kb推送密集型工作负荷;可能涉及大型二进制文件或频繁提交到 monorepo
pack-objects CPU,操作次数适中对象打包开销高;存储库或可通过执行一次维护,或由客户端使用带有 --filter 的部分克隆而受益
存储库的高 avg_rtmax_rt操作缓慢;通常由大型 pack-objects 运行作业、高并发或其他工作负载导致的资源争用引起

如果 Governor 数据显示存储库、用户或运行程序机群正在生成过多的负载,则以下操作可能会降低影响。

  • 重复使用本地结帐。 在自动化工作流中,用 git fetch 替换新创建的克隆。 这可以避免在每次运行时传输完整的对象图。
  • 使用浅克隆。 对于不需要完整提交历史的工作流,请在 clone 命令中传入 --depth 参数,例如 git clone --depth 1。 这既减少了传输的数据量,也减少了 pack-objects 必须完成的工作量。
  • 使用部分克隆。 对于具有给定工作流中不需要的大型二进制对象或许多文件的存储库,用于 --filter 仅请求工作流所需的对象,例如 git clone --filter=blob:none
  • 添加本地镜像或缓存代理。 对于反复克隆同一仓库的大型运行器集群,透传拉取代理或本地镜像可以承接抓取流量,并减轻实例负载。
  • 交错计划的作业。 按计划触发的偏移 CI/CD 工作流,以便并非所有运行程序同时启动,从而减少并发克隆突发的大小。
  • 减少工作流并行度。 可以重新配置克隆多个存储库的工作流,以限制并发并随着时间的推移分散负载。

何时联系 GitHub 支持人员

如果符合以下任一情况,请联系 GitHub Enterprise 支持 并附上支持包。

  • 在降低克隆压力或错开计划作业的执行时间后,性能仍未恢复。
  • 您的实例出现了无法用客户端工作负载解释的广泛 Git 错误或连接失败。
  • Governor 显示持续的 max_parallelism 值,表明该实例已达到或接近容量上限,而仅靠工作负载变化不太可能解决该问题。
  • 在调控器输出中看到一个明确的模式,但不确定如何解释它或采取什么操作。

有关生成支持捆绑包的详细信息,请参阅 向GitHub支持提供数据

延伸阅读

有关监视系统资源的详细信息,请参阅 ** 关于监控仪表板