GitLab内存占用过高解决方案

GitLab内存占用过高解决方案

一、问题发现与排查

前提:服务器CPU内存信息为2C4G

近来发现,每当推送代码,gitlab服务器很大概率会卡死;htop 命令查看服务器运行情况,发现内存占用在90%以上,使用以下命令查询占用内存最多的十个进程

1
ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head

果然,基本吃内存大户都为 gitlab 的进程,主要需要解决workersidekiq 高占用

1656664601696

二、问题分析

参考官方硬件要求: GitLab installation minimum requirements | GitLab

1. worker 进程

参考以下总结:

1656664846812

结合官方文档,unicorn['worker_processess'] 需设置一个合适的值,官方推荐设置为物理核心数+1

2. sidekiq 进程

官方文档中写道

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名worker将在您的流程概述(例如top或htop)中显示为单独的进程,但由于Sidekiq是一个多线程应用程序,因此它们共享相同的RAM分配。请参阅以下有关Unicorn worker的部分,了解您需要多少人。

实际我并不需要这么多的worker,修改sidekiq['concurrency'] (默认25)以减少并发数。

三、问题解决

依据以上问题分析,修改配置文件 gitlab.rb ,默认为以下路径(若为容器运行,请修改挂接目录下的配置文件)

1
vim /etc/gitlab/gitlab.rb

最终采用解决方案:

1. 减少 workder 进程数

1
2
#综合考虑服务器配置,经测试2个进程占用也偏高,采用1个进程足矣
unicorn['worker_processes'] = 2

2. 减少 worker 进程的内存空间

1
2
unicorn['worker_memory_limit_min'] = "200 * 1 << 20"#默认为400
unicorn['worker_memory_limit_max'] = "350 * 1 << 20"#默认为650

3. 减少 sidekiq 数据库并发数

1
2
#考虑需求,5个并发足矣
sidekiq['concurrency'] = 5

4. 减少数据库缓存

1
2
#官方推荐为总RAM的1/4,但服务器不只gitlab一个应用,256MB已能满足需求
postgresql['shared_buffers'] = "256MB"

5. 重新初始化配置

配置文件修改保存后,重启使配置生效

1
2
3
4
#我的是docker中运行的gitlab,需要先进入容器
[root@VM-centos]# docker exec -it gitlab /bin/bash
#执行以下命令使修改后的配置生效
root@111c370ad:/# gitlab-ctl reconfigure

6. 效果验证

重启,使用命令查看内存占用,已降至50%左右

1656671499371

提交代码,服务器无卡顿,gitlab web端可正常访问;内存占用在几个提交推送后,维持在50%左右

1656671988496

至此,问题暂时解决,因为gitlab存在内存泄漏问题,后续待一段时间的提交推送后再观察内存情况。

参考: 解决GitLab内存消耗大的问题


GitLab内存占用过高解决方案
http://dunkingcurry30.github.io/2022/07/02/Gitlab内存占用过高解决方案/
作者
Dunking Curry
发布于
2022年7月2日
许可协议