当你推送到 git.sr.ht 时会发生什么,以及为什么它如此缓慢?

主要观点:Sourcehut 过去 SSH 操作 git 过慢,经大量工作后现已改善,现探讨其问题原因、系统结构及解决方式。
关键信息:

  • 推送或拉取到 git.sr.ht 需经历 5 个主要任务:调度、识别、授权、执行、后续(钩子)。
  • 调度阶段通过gitsrht-dispatch二进制确定登录服务,OpenSSH 生成authorized_keys文件。
  • 识别阶段gitsrht-keys在本地 Redis 缓存 SSH 密钥,查询用户 ID 等信息,若未命中则询问 meta.sr.ht 并缓存。
  • 授权阶段gitsrht-shell查找要操作的仓库,对比访问控制列表,若仓库不存在且开启自动创建功能则创建。
  • 执行阶段将操作交给 git 相关二进制。
  • 后续钩子阶段通过gitsrht-update-hook处理更新仓库 mtime、提交 builds.sr.ht 任务、发送 webhooks 等,分 3 个阶段完成,且可能涉及多次 SQL 往返查询。
  • 过去慢的原因:各步骤用 Python 编写,启动 Python VM 及导入模块开销大,SQL 配置未优化,部分逻辑移至 web 应用导致处理缓慢,web 工作进程数量固定且只能同时做一件事,增加 git 推送逻辑后会导致工作进程被占用,影响 web 应用和 git 推送速度。
  • 现在虽已大幅改善但仍有瓶颈:I/O 吞吐量,服务器繁忙时会先处理其他用户请求,新服务器硬件正在筹备以解决此问题。
阅读 15
0 条评论