我最近设置了一个小的turnkeylinux版本控制虚拟机(有大约256MB的RAM),并试图克隆我推送给它的一个版本库。 推送到(通过ssh)是非常快的,但是从非常缓慢拉。
这是我得到的东西,如果我离开它,直到SSH超时:
$ git pull [email protected]'s password: remote: Counting objects: 403, done. Read from remote host 1.2.3.4: The connection was aborted fatal: The remote end hung up unexpectedly fatal: early EOF
我试图像这样的克隆:
> mkdir myProj > cd myProj > git init > git remote add origin git+ssh://[email protected]/srv/repos/git/myProj > git pull
当我发出拉命令时,它几乎立即达到50%,然后暂停。 它慢慢爬行了几个百分点(一次尝试达到66%),然后最终死亡,如果留下足够长的时间。
这个回购很less,到目前为止只有很less的修改。 除非确定了这个问题,否则我的主要存储库要大得多,而且也不可用。
任何想法可能会导致突然放缓?
我刚刚证实,当使用git://协议连接时,虚拟机很慢。 因此,ssh不是一个问题。 相应地更新问题标题。
您是否能够使用file:协议库URL在VM上进行本地克隆?
git clone file:///srv/repos/git/myProj /tmp/myProj-clone
file: protocol强制本地操作使用非常接近git: / ssh: / smart- http:远程URL所使用的正常智能协议的协议。 具体而言,它使用基于包的协议,而不是利用本地操作的正常优化(存储库对象的硬链接/复制)。
您可能没有足够的内存供服务器生成拉取操作所需的包。 做一个基于本地,基于file:基于克隆/拉的试用版,可以锻炼虚拟机的数据包生成function,而不用拖拽任何types的networking组件来混淆问题。
有几个configurationvariables可以控制包的生成:
您可能能够调整您的存储库,以较less的内存密集型方式生成其包(尽pipe封装效率可能会受到影响)。
我的猜测是,256MB(对于操作系统和应用程序?)太小,不能期望(可能)内存饥渴的应用程序(如Git的包操作)快速甚至正确地工作。
尝试在服务器上禁用TCP分段卸载 – > ethtool -K eth0 tso off
login到1.2.3.4,cd到你的git仓库,然后做'重新包装'。 然后尝试一下,看看是否有帮助。
如果你没有足够的交换空间并且OOM Killer开始运行,那么256MB的内存可能就是小内存。你是否检查过虚拟机系统的日志中是否存在被杀的程序? 磁盘上的存储库有多大(非裸存储库的.git目录)?
请注意, git的实现使得存储库中最大的对象(例如ISO映像)必须在内存中同时作为解压缩和[git]压缩数据在线上传输(git pack data transfer) 。 存储库中包含的一个高度压缩的200MB二进制blob(例如H.264video)将从该机器获取/拉取/克隆,以至less消耗大约400MB的内存。 如果你的系统只有256MB的整个系统,你将需要大约额外的140MB的git加上交换所需的操作系统的所有内存。 给定足够的交换空间,它将工作,但它会很慢。
Git针对系统进行了大量优化,可以在RAM中保存至less10个最大的对象。 一个只有256MB内存的系统,如果你处理一大堆小文件(如Linux内核),就足够了,但如果你有一个巨大的文件,将会停止交换。 对于大量小文件的情况,内存需求似乎大约是存储库中对象数量的160个字节。 要获得有关对象计数的想法,请运行git count-objects -v并计算count和in-pack总和。 你有更多的东西in-packlessgit占用磁盘空间。
如果你想使用git来处理一个拥有巨大二进制文件的项目, 并且你的git存储库机器的内存有限,请遵循git开发的“松散对象”。
资料来源: http : //git.661346.n2.nabble.com/pack-operation-is-thrashing-my-server-td684437.html