核心优化思路:调整 Sidekiq 和 Puma (Unicorn) 的 worker 进程数
GitLab 的内存主要被两部分占用:
- Puma:处理 Web 请求的应用服务器。
- Sidekiq:处理后台作业(如发送邮件、仓库同步等)的队列处理器。
默认配置是为拥有大量内存的服务器设计的,我们需要为 8GB 的环境"减肥"。
优化步骤
1. 编辑 GitLab 配置文件
主要的配置文件是 /etc/gitlab/gitlab.rb
。修改前建议先备份。
bash
bash
sudo cp /etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb.bak
sudo nano /etc/gitlab/gitlab.rb
2. 调整 Puma (Web 服务器) 设置
找到或添加以下配置,大幅减少 worker 进程数:
ruby
css
# 将 worker 进程数减少到 2(默认可能很高)
puma['worker_processes'] = 2
# 如果你的服务器只跑 GitLab,可以尝试设置为 CPU 核数,对于 2-4 核的机器,2 是个安全值
# puma['worker_processes'] = 2
# 减少每个 worker 的线程数
puma['max_threads'] = 4
# puma['min_threads'] = 2
3. 调整 Sidekiq (后台任务) 设置
这是内存消耗的大头。Sidekiq 默认会启动多个进程,每个进程又包含多个线程。
ruby
perl
# 将并发数大幅降低(默认是 25,对 8G 机器来说太高了)
sidekiq['max_concurrency'] = 10
sidekiq['min_concurrency'] = 5
# 最关键的一步:限制 Sidekiq 启动的队列进程数量
# 默认会为每种队列类型启动一个进程,非常吃内存。
# 这个设置让所有队列共享一个进程,极大节省内存,但后台任务处理会变慢。
sidekiq['queue_groups'] = ['*']
4. (可选但推荐)调整 PostgreSQL 设置
GitLab 内置的 PostgreSQL 也可以优化。它默认会根据总内存来分配,我们需要限制它。
ruby
bash
# 告诉 PostgreSQL 它可用的内存没那么多
postgresql['shared_buffers'] = "512MB" # 默认可能为 1GB 或更多
postgresql['max_worker_processes'] = 4 # 减少工作进程数
5. (可选)调整 Prometheus 监控
GitLab 内置的监控也会吃内存,如果不需要可以关闭它。
ruby
bash
# 禁用节点监控
prometheus_monitoring['enable'] = false
# 或者,只禁用不需要的组件
node_exporter['enable'] = false
redis_exporter['enable'] = false
postgres_exporter['enable'] = false
6. (重要)启用交换分区 (Swap)
即使优化后,在高峰时段内存也可能吃紧。添加 Swap 可以防止系统因内存不足而崩溃。强烈建议为 8GB 服务器添加 2-4GB 的 Swap。
bash
bash
# 查看当前 Swap
free -h
# 如果没有或很小,按以下步骤添加(以添加 2GB 为例):
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# 使其永久生效
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
# 调整 Swappiness(告诉系统使用 Swap 的积极程度,默认60,可以调低一点)
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
7. 应用配置并重启 GitLab
完成所有修改后,重新配置并重启 GitLab 以使更改生效。
bash
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart
优化后效果
经过以上调整,预计可以将 GitLab 的内存占用从 5-6GB 降低到 2-3GB,你的 8GB 服务器就会有充足的空闲内存用于系统本身和其他任务。
代价:
- Web 请求的并发处理能力会下降(但对于小团队完全足够)。
- 后台任务(如邮件发送、仓库钩子)的处理速度会变慢。
- 监控功能可能被禁用。
这对于一个小型团队或个人使用的 GitLab 实例来说,是完全可接受的 trade-off(权衡)。
后续监控
优化后,使用以下命令检查内存使用情况:
bash
shell
# 查看总体内存
free -h
# 查看具体是 GitLab 的哪些进程在占用内存
sudo gitlab-ctl status
# 或者用 top/htop 按内存排序查看
htop
如果发现某个特定组件仍然占用过高,可以进一步针对性地调整其配置。但上述方案已经能解决 90% 的内存问题。