2017-05-31 45 views
1

我有一個Git的Redmine服務器。它有2GB的RAM。Git的接收/上傳包需要所有的內存在推

當有人試圖推動一個存儲庫大於2GB的數據,我得到以下錯誤:

Counting objects: 957, done. 
Delta compression using up to 12 threads. 
Compressing objects: 100% (577/577), done. 
Writing objects: 100% (957/957), 2.18 GiB | 29.66 MiB/s, done. 
Total 957 (delta 255), reused 862 (delta 229) 
fatal: The remote end hung up unexpectedly 
fatal: The remote end hung up unexpectedly 
Everything up-to-date 

第一fatal: ...之前,紅寶石開始把所有的服務器上的RAM。

當達到〜2GB的RAM使用量時,會發生fatal: ...錯誤。錯誤在服務器上:

App 9339 stderr: Errno::ENOMEM: Cannot allocate memory - git 

所以我的猜測是,Git的或管理平臺試圖把那些2.18 GB到RAM中,這顯然是不行的。

錯誤後:

  • 服務器上的存儲庫仍然是空的;
  • 直到我重新啓動Redmine時,RAM使用率仍然在95 +%。

我該如何讓它工作?它是Redmine還是Git能夠吃掉所有的RAM?

可以推動數據「零件一部分」(like here)是一個解決方案嗎?

我已經試過increase the HTTP post buffer sizegit config http.postBuffer 524288000)沒有成功。


編輯(2017年6月1日):

某些規格:

  • Ubuntu的LTS 05年4月12日
  • 管理平臺v2.6.9
  • GIT中v1.7.9 .5

Redmine部署在帶有乘客模塊的Apache服務器(v2.2.22)後面。它使用Grack(最新修訂版)將其Git集成到Redmine SCM插件中來創建存儲庫。

重新查看日誌後,它看起來像罪魁禍首是格雷克。

App 9339 stderr: Errno::ENOMEM: Cannot allocate memory - git 
App 29461 stderr:  /opt/grack/lib/git_adapter.rb:24:in ``' 
App 29461 stderr:  /opt/grack/lib/git_adapter.rb:24:in `command' 
App 29461 stderr:  /opt/grack/lib/git_adapter.rb:34:in `upload_pack' 
App 29461 stderr:  /opt/grack/lib/grack.rb:84:in `get_info_refs' 
App 29461 stderr:  /opt/grack/lib/grack.rb:55:in `call' 
App 29461 stderr:  /opt/grack/lib/grack.rb:55:in `call' 

換句話說,當Grack啓動git upload-pack命令發生錯誤。


EDIT(2017年6月1日)(2):

本地資源庫的確具有2 + GB一包。我用下面的重新包裝它:

git repack -a -d --window-memory=512m --max-pack-size=512m 

爲了減少大包成多個小包裝。我還配置了以下客戶端和服務器端:

git config pack.windowMemory 512m 
git config pack.packSizeLimit 512m 

但問題仍然存在。

App 30005 stderr: [ 2017-06-01 09:15:04.4393 30122/0x000000019264a8(Worker 1) utils.rb:72 ]: *** Exception Errno::ENOMEM in Rack body object #each method (Cannot allocate memory - git) (process 30122, thread 0x000000019264a8(Worker 1)): 
App 30005 stderr:  from /opt/grack/lib/git_adapter.rb:19:in `popen' 
App 30005 stderr:  from /opt/grack/lib/git_adapter.rb:19:in `command' 
App 30005 stderr:  from /opt/grack/lib/git_adapter.rb:43:in `receive_pack' 
App 30005 stderr:  from /opt/grack/lib/grack.rb:70:in `block in service_rpc' 

EDIT(2017年6月1日)(3):

增加了一些日誌記錄Grack,看看它究竟推出:

git receive-pack --advertise-refs --stateless-rpc /var/git/mygit.git 

因爲它不啓動命令從Git倉庫目錄中,我嘗試了以下內容:

git config --global pack.windowMemory 512m 
git config --global pack.packSizeLimit 512m 

Sa仍然無法工作。

EDIT(2017年6月1日),(4):

再次嘗試,但與64m代替512m,仍然沒有效果。

它看起來像Git仍然需要採取RAM上的所有對象來開始包裝。客戶端,git repack命令確實需要2 + GB才能執行,即使結果輸出是多個512 MB文件。

+0

Downvoters,請解釋。我接受這個事實,即我的問題可能很愚蠢,但只是'-1'不會有幫助。 – kagmole

+0

我已經投票贊成你糾正你的downvoter問題:D,請解釋更多,哪個OS,哪個GIt/redmine版本,它是如何部署的,它是redminegit託管插件還是什麼? –

+0

謝謝你的關注。我更新了我的問題。我現在將尋找Grack的潛在問題。 – kagmole

回答

0

由於此問題正在深入研究,因此以下是我用作答案的解決方法。

它看起來像接收/上傳包需要加載RAM上的所有內容。也許我錯了,但我沒有發現任何東西來減少內存使用量到小數據包中。所以我做的是創建一個瞬態交換文件。

# create a file of 4GB 
sudo dd if=/dev/zero of=/swap bs=1024 count=4194303 

# make it a swap file 
sudo mkswap /swap 

# enable the swap on this swap file 
sudo swapon /swap 

2GB是不夠的:推動了就好〜3.5GB,所以4GB的交換文件。

推動花了很長時間(沒有shlock Sherlock),但至少成功了。

我離開爲今後類似的問題,新的交換文件,但如果你想推後刪除它,你可以做到以下幾點:

# disable the swap (will automatically move used memory into RAM or another swap) 
sudo swapoff /swap 

# delete the file 
sudo rm /swap 

Reference on UNIX guide