【问题标题】:Why does git fail on push/fetch with "Too many open files"为什么 git 在推送/获取时因“打开的文件太多”而失败
【发布时间】:2021-02-22 21:01:24
【问题描述】:

我遇到了一个 Git 问题,我收到以下消息:

> git fetch
error: cannot create pipe for ssh: Too many open files
fatal: unable to fork

系统管理员提高了我的文件限制,但并未纠正该问题。此外,我在使用 vi 创建新文件时没有问题。

尝试推送新分支时,我收到类似的消息:

git push origin test_this_broken_git 错误:无法创建管道:打开的文件太多 致命:发送包:无法分叉边带解复用器

有人能准确回答为什么会这样吗?我最近没有对我的 git 配置进行任何更改,并已手动验证。

【问题讨论】:

    标签: linux git config


    【解决方案1】:

    有两条类似的错误信息:

    EMFILE:打开的文件太多 ENFILE:系统中打开的文件过多

    您似乎收到了EMFILE,这意味着超出了单个进程的文件数。因此,检查vi 是否可以打开文件是无关紧要的——vi 将使用它自己的、单独的文件表。检查您的限制:

    $ ulimit -n 1024

    所以在我的系统上,单个进程中打开文件的限制为 1024 个。您应该不需要询问您的系统管理员(请不要使用缩写 SA,它太不透明;如果您必须缩写,请使用“sysadmin”)来提高限制。

    您可能希望通过在strace 下运行 Git 来检查 Git 打开了哪些文件。

    这可能是 Git 或库中的错误,也可能是您使用的是旧版本的东西,或者可能是更奇怪的东西。先试试strace看看它打开了哪些文件,然后检查Git是否关闭了这些文件。

    来自 Hazok 的更新:

    使用上述建议后,发现错误是由于松散对象过多引起的。由于git gc 运行频率不够,导致松散对象过多。

    【讨论】:

    • 感谢您的解释和提示。我没有向 SA 提出请求,他们仍在试图找出根本原因,而且时间太长了,所以我想看看 Stackoverflow 上的专家建议:D 我尝试了 strace,它正在倾倒大量统计数据, lstat,打开,读取,读取,关闭似乎是我从命令中中断的每个标签的命令。
    • 您介意我编辑您的答案以提供最终原因和解决方案吗?我想给你一个充分的信任,因为这是一个 Git 问题,运行 strace 帮助了很多。
    【解决方案2】:

    为什么会这样?

    来自the git documentation

    当存储库中的松散对象大约超过这么多时, git gc --auto 将打包它们。一些 Porcelain 命令不时使用此命令执行轻量级垃圾收集。 默认值为 6700。

    这里的“一些 Porcelain 命令”包括 git pushgit fetch 等。因此,如果最大打开文件限制 ulimit -n git gc --auto 阻止一个 git 仓库。

    我很着急。如何解决?

    如果你有足够的权限调整系统ulimit:

    $ sudo ulimit -n 8192
    

    否则,您可以通过设置 git config gc.auto=0 来禁用 git gc,这样您就可以将本地提交推送到远程,删除存储库,然后将其克隆回来,而不会产生数千个松散的对象。

    我们怎样才能防止这种情况再次发生?

    设置git config --global gc.auto=200,其中 200 比您的最大打开文件限制小一些。如果你选择的值太小,git gc 会运行太频繁,所以要明智地选择。

    如果你设置gc.auto=0,除非你手动运行git gc,否则松散的对象永远不会被打包。因此,同一目录中可能会累积数十万个文件,这可能是一个问题,尤其是对于机械硬盘驱动器或 Windows 用户而言。 (另见:How many files in a directory is too many?Is it OK (performance-wise) to have hundreds or thousands of files in the same Linux directory?)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 2021-10-29
      相关资源
      最近更新 更多