【Git學習】解決GitLab記憶體消耗大的問題
一、問題描述
今天有提示反饋Gitlab伺服器push不上去,讓我看看是不是Gitlab伺服器出了什麼問題。
我查看了下gitlab線上的資訊
這臺伺服器消耗了31.3GB記憶體。
然後我11:14分嘗試去連線Gitlab伺服器,發現要很久很久才連線上。
直到11點18分才登陸成功。
使用 free命令查看了下記憶體情況,我艹,太猛了吧,使用了60個G,記憶體只剩2.6G了。
剛想繼續操作,就被強制的斷開了連線
後面一直想去連線這臺伺服器,一直連線失敗
Jenkins任務也是編譯失敗,連線不上Gitlab伺服器,拉取不到程式碼進行編譯。
好吧,糟糕透了,為什麼Gitlab會佔這麼多的記憶體呢?
二、解決問題
2.1 臨時解決方法
沒辦法了,我這邊使用XShell無法遠端登入伺服器,無法檢視原因了,後來只能聯絡公司的網管人員去機房,將這臺伺服器進行重啟。
重啟之後,重新檢視下記憶體,佔用了16G,剩餘46G。
Gitlab後臺檢視的資料也是,記憶體只佔用了11.3GB,還算比較正常。
現在大家的工作都暫時恢復正常了,所有的push和fetch操作速度都很快了,因為記憶體是充足的。
但是網管告知我,這臺伺服器後面又會記憶體飆上來的。下面是網管說今天早上的監控資料,負載很高的。
我們從重啟之後,Gitlab佔用記憶體降低下來,然後整個系統記憶體也降低下來了,因此這個記憶體佔用的元凶肯定就是gitlab。
使用top命令檢視下執行的程序,發現一大半都是git相關的。
隨著人員用的越來越多,記憶體肯定又會飆升上來的,如何解決GitLab佔用記憶體大的難題呢??
2.2 解決GitLab記憶體消耗大的問題
2.2.1 查詢相關的文章
使用google了一下,找到以下的文章。
有句話寫的 :
Notice: The 25 workers of Sidekiq will show up as separate processes in your process overview (such as top or htop) but they share the same RAM allocation since Sidekiq is a multithreaded application. Please see the section below about Unicorn workers for information about how many you need of those
翻譯中文的意思是:
注意:Sidekiq的25名工作人員將在您的流程概述(例如top或htop)中顯示為單獨的程序,但由於Sidekiq是一個多執行緒應用程式,因此它們共享相同的RAM分配。請參閱以下有關Unicorn工作人員的部分,瞭解您需要多少人。
有段描述
Assume there are 30 real unicorn process running, each takes 500MB memory, then they will take 30*500MB=15GB memory
To decrease unicorn processes count, edit /etc/gitlab/gitlab.rb, and uncomment following line
翻譯成中文
假設正在執行30個真正的獨角獸程序,每個程序需要500MB記憶體,那麼它們將需要30 * 500MB = 15GB記憶體
要減少獨角獸程序數,請編輯/etc/gitlab/gitlab.rb,並取消註釋以下行
從上面查詢到的資訊,貌似都是需要去修改Unicorn的設定。因此我們就去修改下這個配置檔案吧。
2.2.2 編輯/etc/gitlab/gitlab.rb檔案,修改Unicorn的設定
################################################################################
558 ## GitLab Unicorn
559 ##! Tweak unicorn settings.
560 ##! Docs: https://docs.gitlab.com/omnibus/settings/unicorn.html
561 ################################################################################
562
563 # unicorn['worker_timeout'] = 60
564 ###! Minimum worker_processes is 2 at this moment
565 ###! See https://gitlab.com/gitlab-org/gitlab-ce/issues/18771
566 # unicorn['worker_processes'] = 2
567
568 ### Advanced settings
569 # unicorn['listen'] = '127.0.0.1'
570 # unicorn['port'] = 8080
571 # unicorn['socket'] = '/var/opt/gitlab/gitlab-rails/sockets/gitlab.socket'
572 # unicorn['pidfile'] = '/opt/gitlab/var/unicorn/unicorn.pid'
573 # unicorn['tcp_nopush'] = true
574 # unicorn['backlog_socket'] = 1024
575
576 ###! **Make sure somaxconn is equal or higher then backlog_socket**
577 # unicorn['somaxconn'] = 1024
578
579 ###! **We do not recommend changing this setting**
580 # unicorn['log_directory'] = "/var/log/gitlab/unicorn"
581
582 ### **Only change these settings if you understand well what they mean**
583 ###! Docs: https://about.gitlab.com/2015/06/05/how-gitlab-uses-unicorn-and-unicorn-worker-killer/
584 ###! https://github.com/kzk/unicorn-worker-killer
585 # unicorn['worker_memory_limit_min'] = "400 * 1 << 20"
586 # unicorn['worker_memory_limit_max'] = "650 * 1 << 20"
因此我們要修改這個被註釋掉的內容為一個合理的值。
557 ################################################################################
558 ## GitLab Unicorn
559 ##! Tweak unicorn settings.
560 ##! Docs: https://docs.gitlab.com/omnibus/settings/unicorn.html
561 ################################################################################
562
563 # unicorn['worker_timeout'] = 60
564
565 # 根據連結來修改:https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/settings/unicorn.md
566 # 2018-11-14 歐陽鵬修改
567 unicorn['worker_timeout'] = 60
568
569 ###! Minimum worker_processes is 2 at this moment
570 ###! See https://gitlab.com/gitlab-org/gitlab-ce/issues/18771
571 # unicorn['worker_processes'] = 2
572 # 2018-11-14 歐陽鵬修改的 worker=CPU核數+1
573 unicorn['worker_processes'] = 17
修改完之後,我們執行下面的命令
- gitlab-ctl reconfigure
- gitlab-ctl restart
重啟之後,看看記憶體大小
現在使用了14G,似乎比之前重啟Gitlab伺服器之後的16G佔用小,希望有用。 後續持續觀察記憶體佔用情況,如果還有問題,持續在此篇部落格更新記錄。
這個10.1Gb也比之前的11.3Gb小了一些,希望是穩定的。
2.2.3 繼續監控
過了一天了,今天早上來開啟檢視下,發現伺服器使用的記憶體又達到了47G
[email protected]:~# date
2018年 11月 15日 星期四 09:27:20 CST
[email protected]:~# free -h
total used free shared buffers cached
Mem: 62G 47G 14G 1.0G 310M 35G
-/+ buffers/cache: 12G 50G
Swap: 63G 25M 63G
[email protected]:~#
然後看Gitlab後臺管理介面,顯示只是有了15GB,但是更新時間是18小時前的。
重啟下gitlab,重啟後發現系統使用的記憶體還是40G。
[email protected]:~# date
2018年 11月 15日 星期四 09:27:20 CST
[email protected]:~# free -h
total used free shared buffers cached
Mem: 62G 47G 14G 1.0G 310M 35G
-/+ buffers/cache: 12G 50G
Swap: 63G 25M 63G
[email protected]:~# gitlab-ctl restart
ok: run: gitaly: (pid 23080) 1s
ok: run: gitlab-monitor: (pid 23091) 0s
ok: run: gitlab-workhorse: (pid 23094) 1s
ok: run: logrotate: (pid 23110) 0s
ok: run: nginx: (pid 23116) 0s
ok: run: node-exporter: (pid 23139) 1s
ok: run: postgres-exporter: (pid 23155) 0s
ok: run: postgresql: (pid 23290) 0s
ok: run: prometheus: (pid 23333) 0s
ok: run: redis: (pid 23379) 0s
ok: run: redis-exporter: (pid 23383) 0s
ok: run: sidekiq: (pid 23398) 0s
ok: run: unicorn: (pid 23407) 1s
您在 /var/mail/root 中有新郵件
[email protected]:~# free -h
total used free shared buffers cached
Mem: 62G 40G 22G 363M 311M 34G
-/+ buffers/cache: 6.3G 56G
Swap: 63G 21M 63G
[email protected]:~#
檢視gitlab後臺,剛剛更新的資料,gitlab使用記憶體11.4G。因此這個40G使用的記憶體,可能還有其他的應用在佔用著。下面通過命令去看看佔用記憶體和CPU的程序有哪些?
通過下面的連結,學習 Linux下如何檢視哪些程序佔用的CPU記憶體資源最多?
linux下獲取佔用CPU資源最多的10個程序,可以使用如下命令組合:
ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head
執行下,結果如下:
[email protected]:~# ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
git 23398 3.7 0.9 911056 603924 ? Ssl 09:30 0:39 sidekiq 5.0.0 gitlab-rails [0 of 25 busy]
git 23094 3.4 0.0 1547836 25852 ? Ssl 09:29 0:36 /opt/gitlab/embedded/bin/gitlab-workhorse -listenNetwork unix -listenUmask 0 -listenAddr /var/opt/gitlab/gitlab-workhorse/socket -authBackend http://localhost:8080 -authSocket /var/opt/gitlab/gitlab-rails/sockets/gitlab.socket -documentRoot /opt/gitlab/embedded/service/gitlab-rails/public -pprofListenAddr -secretPath /opt/gitlab/embedded/service/gitlab-rails/.gitlab_workhorse_secret -config config.toml
git 31171 3.3 0.7 1214996 517696 ? Sl 09:43 0:06 unicorn worker[12] -D -E production -c /var/opt/gitlab/gitlab-rails/etc/unicorn.rb /opt/gitlab/embedded/service/gitlab-rails/config.ru
gitlab-+ 23129 3.1 0.0 46800 6536 ? S 09:29 0:32 nginx: worker process
git 29993 2.7 0.8 829452 545896 ? Sl 09:41 0:10 unicorn worker[16] -D -E production -c /var/opt/gitlab/gitlab-rails/etc/unicorn.rb /opt/gitlab/embedded/service/gitlab-rails/config.ru
git 23577 2.5 0.8 1217396 555804 ? Sl 09:30 0:25 unicorn worker[14] -D -E production -c /var/opt/gitlab/gitlab-rails/etc/unicorn.rb /opt/gitlab/embedded/service/gitlab-rails/config.ru
git 29526 2.3 0.8 2252268 528812 ? Sl 09:40 0:10 unicorn worker[8] -D -E production -c /var/opt/gitlab/gitlab-rails/etc/unicorn.rb /opt/gitlab/embedded/service/gitlab-rails/config.ru
git 24747 2.3 0.8 1389772 540836 ? Sl 09:32 0:20 unicorn worker[2] -D -E production -c /var/opt/gitlab/gitlab-rails/etc/unicorn.rb /opt/gitlab/embedded/service/gitlab-rails/config.ru
git 23534 2.3 0.8 1501940 559820 ? Sl 09:30 0:23 unicorn worker[1] -D -E production -c /var/opt/gitlab/gitlab-rails/etc/unicorn.rb /opt/gitlab/embedded/service/gitlab-rails/config.ru
git 23531 2.3 0.7 1340108 517696 ? Sl 09:30 0:23 unicorn worker[0] -D -E production -c /var/opt/gitlab/gitlab-rails/etc/unicorn.rb /opt/gitlab/embedded/service/gitlab-rails/config.ru
[email protected]:~#
linux下獲取佔用記憶體資源最多的10個程序,可以使用如下命令組合:
ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head
執行下,結果如下:
[email protected]:~# ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
git 23398 3.6 1.0 7360572 705220 ? Ssl 09:30 0:41 sidekiq 5.0.0 gitlab-rails [0 of 25 busy]
git 29993 2.8 0.8 1211224 548032 ? Sl 09:41 0:13 unicorn worker[16] -D -E production -c /var/opt/gitlab/gitlab-rails/etc/unicorn.rb /opt/gitlab/embedded/service/gitlab-rails/config.ru
git 29526 2.3 0.8 1198500 530768 ? Sl 09:40 0:11 unicorn worker[8] -D -E production -c /var/opt/gitlab/gitlab-rails/etc/unicorn.rb /opt/gitlab/embedded/service/gitlab-rails/config.ru
git 27297 2.0 0.8 1651900 529744 ? Sl 09:36 0:15 unicorn worker[6] -D -E production -c /var/opt/gitlab/gitlab-rails/etc/unicorn.rb /opt/gitlab/embedded/service/gitlab-rails/config.ru
git 24747 2.3 0.8 1569668 540928 ? Sl 09:32 0:23 unicorn worker[2] -D -E production -c /var/opt/gitlab/gitlab-rails/etc/unicorn.rb /opt/gitlab/embedded/service/gitlab-rails/config.ru
git 24732 2.1 0.8 1400568 538528 ? Sl 09:32 0:21 unicorn worker[7] -D -E production -c /var/opt/gitlab/gitlab-rails/etc/unicorn.rb /opt/gitlab/embedded/service/gitlab-rails/config.ru
git 23580 2.1 0.8 2089948 540508 ? Sl 09:30 0:23 unicorn worker[15] -D -E production -c /var/opt/gitlab/gitlab-rails/etc/unicorn.rb /opt/gitlab/embedded/service/gitlab-rails/config.ru
git 23577 2.5 0.8 1314080 555944 ? Sl 09:30 0:28 unicorn worker[14] -D -E production -c /var/opt/gitlab/gitlab-rails/etc/unicorn.rb /opt/gitlab/embedded/service/gitlab-rails/config.ru
git 23574 2.0 0.8 1405348 532832 ? Sl 09:30 0:22 unicorn worker[13] -D -E production -c /var/opt/gitlab/gitlab-rails/etc/unicorn.rb /opt/gitlab/embedded/service/gitlab-rails/config.ru
git 23568 1.7 0.8 2627184 552372 ? Sl 09:30 0:19 unicorn worker[11] -D -E production -c /var/opt/gitlab/gitlab-rails/etc/unicorn.rb /opt/gitlab/embedded/service/gitlab-rails/config.ru
您在 /var/mail/root 中有新郵件
[email protected]:~#
- 檢視佔用cpu最高的程序
ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head
或者top (然後按下M,注意這裡是大寫)
- 檢視佔用記憶體最高的程序
ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head
或者top (然後按下P,注意這裡是大寫)
看來問題還是沒有解決,Gitlab依然是佔用CPU和記憶體的最大頭!
這個bundle到底是什麼?
這個bundle佔用記憶體太多了
我們來操作一下,如下所示。可以發現這些 bundle其實就是unicorn workers and sidekiq在使用。
重啟下gitlab 少了12G記憶體佔用
三、最終修改
2018-11-19 15:16:39 經過一輪修改,重啟伺服器之後
Gitlab只是有了5GB
系統總共記憶體只是有了6.2G
持續觀察試一試
2018-11-20 09:29 今天早上來看,哇,第一欄 Mem 使用了60G,free 2G 。嚇死我了,我感覺已經拯救不了gitlab了,後面才發現自己對free命令有個很大的錯誤理解。
linux的記憶體分配機制就是這樣的。free 不會有太多,充分利用實體記憶體來做快取等等。
只要使用dmesg檢視系統日誌、報錯等等的時候,不出現 oom就沒問題。
而系統真正使用的記憶體只有5.9G,剩餘了57G記憶體。和Gitlab後臺顯示基本一致
因此,我的優化效果還是有的,從最開始Gitlab服務佔用了30多G的記憶體到現在只佔用7G左右!
關於 free命令的用法可以參考連結:
相關推薦
【Git學習】解決GitLab記憶體消耗大的問題
一、問題描述 今天有提示反饋Gitlab伺服器push不上去,讓我看看是不是Gitlab伺服器出了什麼問題。 我查看了下gitlab線上的資訊 這臺伺服器消耗了31.3GB記憶體。 然後我11:14分嘗試去連線Gitlab伺服器,發現要很久很久才連線上。
【Git學習】解決git push操作的時候出錯,提示 error: unpack failed: unable to create temporary object directory
一、問題描述 剛剛在敲完某個模組的程式碼,提交程式碼到那麼本地分支,然後push到遠端分支的時候,出現了下面的錯誤,提示我Push rejected。然後沒有其他的提示了。 使用 git bash 終端,輸入git push 命令,也提示被拒絕,如下所示
【git學習】在CenterOS系統上恢復GitLab時出現錯誤:tar: 由於前次錯誤,將以上次的錯誤狀態退出 unpacking backup failed
一、問題描述 今天在測試加密GitLab備份檔案之後,進行解密,然後再恢復GitLab的時候,恢復失敗,報瞭如下的錯誤: tar: db:無法 mkdir: 許可權不夠 tar: db:無法 mkdir: 許可權不夠 tar: db/database.sql.
【git學習】在CenterOS系統上安裝GitLab並自定義域名訪問GitLab管理頁面
目前就職的公司一直使用SVN作為版本管理,現在打算嘗試從SVN遷移到Git。安排我來預言並搭建好相關的環境以及自己嘗試使用Git。今天我就嘗試在Center OS系統上安裝GitLab,現在在此記錄一下整個安裝過程。 第一步 檢視GitLab的官方
【Python學習】解決pandas中打印DataFrame行列顯示不全的問題
需要 pandas pre pytho 如果 clas panda 顯示不全 可能 在使用pandas的DataFrame打印時,如果表太長或者太寬會自動只給前後一些行列,但有時候因為一些需要,可能想看到所有的行列。 所以只需要加一下的代碼就行了。 #顯示所有列 pd.se
【GIT學習】GIT的安裝與使用方法
Git是什麼? Git是目前世界上最先進的分散式版本控制系統(沒有之一)。 工作原理 / 流程: Workspace:工作區 Index / Stage:暫存區 Repository:倉庫區(或本地倉庫) Remote:遠端倉庫 實際專案開發中,我們經常會用一些版本
【Git學習】 常用命令
git三個工作區和檔案的四種狀態 工作目錄(workspace)、暫存區(index)、本地倉庫(repo) 未跟蹤(untracked)、已暫存(staged)、已修改(modified)、已提交(committed) 當在工作目錄中新加入一個檔案時,它處於未
【Git學習】 安裝與使用
Git是什麼? Git是目前世界上最先進的分散式版本控制系統(沒有之一)。另外,Git極其強大的分支管理,把SVN等遠遠拋在了後面。 專案原始碼由Git管理,而GitHub和碼雲都是基於Git的開源專案託管平臺,它為開源專案免費提供Git儲存。 重要參考:
【Jenkins學習 】解決Jenkins節點編譯android專案出現錯誤:[Gradle]
一、錯誤描述 今天Jenkins節點編譯伺服器出現了磁碟不足,在該節點伺服器上移動了部分目錄,刪除了部分檔案之後,再次編譯的時候出現了錯誤,如下所示: [Gradle] - Launching build. [Gradle] - [ERROR] Can't re
【Git學習】使用git reflog 命令來檢視歷史提交記錄並使用提交記錄恢復已經被刪除掉的分支
一、問題描述 昨天下午有個同事急急忙忙跑我座位上,要我幫忙,說他剛剛因為手誤,將他本地的某個project的某個branch分支刪除了,並且也將Gitlab上面的分支也刪除了。他本來是想發起merge request的,但是後面他眼神不好以為已經merged過了
【Git 學習】深入理解git reset 命令
重置命令(git reset)是Git 最常用的命令之一,也是最危險最容易誤用的命令。來看看git reset命令用法。 ---------------------------------------------------------------------------------------------
【Git學習】深入瞭解git checkout命令
檢出命令(git checkout)是Git最常用的命令之一,同時也是一個很危險的命令,因為這條命令會重寫工作區。檢出命令的用法如下: 用法一:git checkout[-q][<commit>][--]<paths>…… 用法二:git checkout[<branch>] 用法三:git check
【Jenkins學習 】解決jenkins執行磁碟滿的問題
一、背景 今天有同事編譯Jenkins的相關Jobs的時候,出現了編譯成功,但是輸出產物失敗的情況,如下圖所示: Caused by:java.io.IOException: No space left on device at java.i
【Python學習】Python解決漢諾塔問題
次數 代碼 int 解題思路 move python學習 求解 color 印度 參考文章:http://www.cnblogs.com/dmego/p/5965835.html 一句話:學程序不是目的,理解就好;寫代碼也不是必然,省事最好;拿也好,查也好,解決問題就好
【git學習筆記】
dea clas 本地庫 文件 倉庫 狀態 作用 col 學習 一.查看git的配置文件 1.在項目下,有一個.git的隱藏文件 2.config為git的配置文件 3.查看config :branch表示分支,此配置文件表示當前有兩個分支NNU和master,一個遠程
【深度學習】多層感知器解決異或問題
利用Python 建立兩層感知器,利用W-H學習規則訓練網路權值: #!/usr/bin/env python # -*- coding:utf-8 -*- import random import numpy as np import matplotl
【深度學習】不要被深度學習一葉障目不見泰山;NLP 解決方案是如何被深度學習改寫的?
雷鋒網 AI 科技評論按:正如大家討論人工智慧時經常把它和機器學習甚至深度學習近似等價,工業界和學術界的許多研究、開發人員們也往往過於關注深度學習,忽略了實際上範圍更廣的機器學習和人工智慧領域還有許多有價值的問題等待研究。 近日,UC 伯克利大學電子工程與計算機學院和統計學
【Android學習】關於Android中解決重寫onTouch事件提示 的警告:onTouch should call View#performClick when a click is detec
一、問題的出現 當我對控制元件使用setOnTouchLister()時重寫了onTouch()方法時就出現了這個警告 二、原因 onTouchListener的onTouch方法優先順序比onTouchEvent高,會先觸發 假如onTouch方法返回fa
【Git學習筆記】刪除檔案及資料夾,並push到遠端庫
本文講述如何把本地倉庫上的檔案或者資料夾刪除,並且將這些改動提交到遠端倉庫。 1、準備 建立一個檔案並提交到版本庫中: 現在我想把版本庫中的test.txt檔案刪除。 把這個檔案push到遠端倉庫orgin中。 執行:git push origin master 2、
【深度學習】RNN中梯度消失的解決方案(LSTM)
上個部落格裡闡述了梯度消失的原因,同時梯度消失會造成RNN的長時記憶失效。所以在本部落格中,會闡述梯度消失的解決方案:①梯度裁剪(Clipping Gradient)②LSTM(Long Short-T