zoukankan      html  css  js  c++  java
  • 同步大文件到gitlab导致内存溢出

    同步大文件到gitlab导致内存溢出

      今天补一下3月16日的笔记。

    一、问题引入

      曾经我在防篡改监控的文章里提过,开发说不要把内网大文件上传到gitlab上【参考之前文章:https://www.cnblogs.com/windysai/p/14354460.htm

     

       当时我也就听听,想着记住有这么回事,不要做这种骚操作就行。然后某天领导下发了一个任务,叫我把内网服务器的数据备份到线上,因为担心内网服务器会崩溃,主要是担心整个esxi宿主机,上面有各种虚拟机,有几台就是走上面截图的线路进行文章发布的。

      这个定时上传其实是以一个静态目录的方式传到gitlab上的,假设叫做:status_ljy,里面有目录:html, r, u和文件:index.html 。

      我备份的时候,实际上进去的是status_ljy,单独一个个小目录进行备份的。为啥这么搞,因为一大个status_ljy目录异常庞大,传输到线上容易中断,而且貌似不支持断点续传的。拆分成3个目录,比整个status_ljy备份传输会好点

      于是没考虑这么多,就运行这堆命令对备份到线上的内网目录进行压缩打包:

    1 [ljy@local-123-tomcat status_ljy]$ tar -cvf html.tar.gz_20210316_bak html
    2 [ljy@local-123-tomcat status_ljy]$ tar -cvf r.tar.gz_20210316_bak r
    3 [ljy@local-123-tomcat status_ljy]$ tar -cvf u.tar.gz_20210316_bak u

      留意一开始说的那个线路图,把status_ljy整个目录定时单向传输到gitlab。上面的备份命令运行完,备份文件实际上是在 status_ljy 目录里面的。问题出现了:敲一个命令,半天没有反应,我一开始还以为中毒。好不容易运行top命令,发现这台local-123的机器负载非常高,git进程把服务器资源吃光了:

      试着连接宿主机esxi,重启这台机器,报错内存溢出:

       于是干脆把这机器关了,硬件设置里给它加内存,无果。。。

       这么多git进程,强制kill进程过一会儿又出来。想想也就是定时任务把文章传输到gitlab,再到线上这里用到。为了不增加服务器负载,就停了这个定时任务。然后手动运行同步脚本:

     

       看着就是有个index.lock文件,类比mysql异常退出,也有个lock文件,不删除无法重新启动的方法,我试着去删掉,没用!

     运行同步脚本上 git add . 卡死,不得不“ctrl + z” 强制终止。

    二、原因发现及解决过程

       当时我还没醒觉到具体是什么原因导致的,直到登上gitlab,发现多了些备份目录:u.tar.gz_20210316_bak等。然后就很急了(因为工作日运营的人发文章同步不了会找到我),直接在gitlab的web页面上删掉这些html.tar.gz_20210316_bak,r.tar.gz_20210316_bak。。。

      然后报错信息变了,git add 说找不到提交过的文件

    查看gitlog提交日志:

    14:29:33  的时候刚好是我备份完这些目录的时候,脚本自动把备份目录传到gitlab上了!!!

     

    三、问题最终解决  

     这句是解决问题的关键:failed to push some refs to ‘xxxxx'

     

       不得不git pull 手动同步gitlab上最新目录status_ljy下来,相当于这条单向传输给我掰过来了。原来定时脚本是从内网 ——》 gitlab,恢复得从 gitlab ——》 内网。

    cd /home/ljy/data/status_ljy
    git pull 保持跟gitlab一致

        这个delta 3 这个日志就是把手动在gitlab删除的记录同步到内网上的

    最终git 日志恢复正常,如下,删掉了误操作的文件:

    四、反思+总结

      (1)第一次知道大文件传输到gitlab上会导致服务器崩溃的

      (2)既然是单一传输路径,按规范行动:在内网删掉大文件,然后利用定时脚本传输到gitlab上删除,而不是直接在gitlab上进行操作,把内网——》gitlab这步直接跳过,导致当前分支落后于远程分支而报错。

  • 相关阅读:
    php 验证码生成方法 及使用
    idea的jar文件,“java.lang.SecurityException: Invalid signature file digest for Manifest main attribute
    Ubuntu下Java JDK安装
    Ubuntu 忘记密码
    为 ubuntu 切换更新源
    使用Java开发桌面即时通讯程序遇到的问题
    MySQL 1093
    Java中命名Dao、Bean、conn等包的含义(不定期补充)
    通过导入Jar包的方式使用JSONObject
    IM开发通信协议基础知识(一)---TCP、UDP、HTTP、SOCKET
  • 原文地址:https://www.cnblogs.com/windysai/p/14719935.html
Copyright © 2011-2022 走看看