在内存受限环境中运行极狐GitLab
Tier: 基础版,专业版,旗舰版
Offering: 私有化部署
极狐GitLab 在启用所有功能时需要大量内存。有些情况下,比如在较小的安装中运行极狐GitLab 时,并不需要所有功能。示例包括:
- 为个人使用或非常小的团队运行极狐GitLab。
- 在云供应商上使用小型实例以节省成本。
- 使用资源受限的设备,如 Raspberry PI。
通过一些调整,极狐GitLab 可以在比最低要求或参考架构中描述的规格低得多的环境中舒适地运行。
以下部分包含允许极狐GitLab 在不满足最低要求的环境中运行的建议。虽然大多数极狐GitLab 部分在这些设置下应该是功能正常的,但您可能会遇到产品功能和性能的意外下降。您应该能够在最多 5 名开发人员,单个 Git 项目不超过 100 MB 的情况下运行极狐GitLab。
受限环境的最低要求
极狐GitLab 可以运行的最低规格是:
- 基于 Linux 的系统(理想情况下基于 Debian 或 RedHat)
- ARM7/ARM64 架构的 4 个 CPU 核心或 AMD64 架构的 1 个 CPU 核心
- 最低 2 GB 的 RAM + 1 GB 的 SWAP,最佳为 2.5 GB 的 RAM + 1 GB 的 swap
- 20 GB 的可用存储
- 具有良好随机 I/O 性能的存储,优先顺序为:
- SSD
- eMMC
- HDD
- 高性能 A1 型 SD 卡
在上述列表中,CPU 的单核性能和存储的随机 I/O 性能影响最大。存储尤其重要,因为在受限环境中我们预计会发生一些内存交换,这会对使用的磁盘施加更大的压力。小平台性能受限的常见问题是非常慢的磁盘存储,这会导致系统范围的瓶颈。
在这些最低设置下,系统应该在正常操作期间使用交换。由于不是所有组件同时使用,它应该提供可接受的性能。
验证系统性能
有很多工具可以验证您的 Linux 系统的性能。其中一个可以帮助检查系统性能的项目是 sbc-bench。它描述了系统测试的所有警示以及不同行为对系统性能的影响,这在嵌入式系统中运行极狐GitLab 时尤其重要。它可以用来验证您的系统性能是否足够好,以在受限环境中运行极狐GitLab。
这些系统提供了足够的性能来运行小型极狐GitLab 安装:
- Raspberry PI 4 2GB。
- DigitalOcean Basic 2GB with SSD。
- Scaleway DEV1-S 2GB/20GB。
- GCS e2-small。
配置交换空间
在安装极狐GitLab 之前,您需要配置交换空间。交换空间是在物理 RAM 满时使用的磁盘上的专用空间。当 Linux 系统用完 RAM 时,非活动页面会从 RAM 移动到交换空间。
交换使用通常被认为是一个问题,因为它会增加延迟。然而,由于极狐GitLab 的功能,分配的大部分内存并不经常访问。使用交换允许应用程序正常运行,并仅偶尔使用交换。
一般指南是将交换配置为可用内存的 50% 左右。对于内存受限的环境,建议为系统配置至少 1GB 的交换空间。有很多指南可以帮助您做到这一点:
- 如何在 Ubuntu 20.04 上添加交换空间
- 如何在 CentOS 7 上添加交换空间
配置完成后,您应该验证交换是否已正确启用:
shellfree -h total used free shared buff/cache available Mem: 1.9Gi 115Mi 1.4Gi 0.0Ki 475Mi 1.6Gi Swap: 1.0Gi 0B 1.0Gi
您还可以通过调整 /proc/sys/vm/swappiness 配置系统使用交换空间的频率。Swappiness 范围在 0 到 100 之间。默认值是 60。较低的值减少了 Linux 将匿名内存页面释放并写入交换的偏好,但增加了它对文件支持页面执行相同操作的偏好:
-
在当前会话中配置它:
shellsudo sysctl vm.swappiness=10 -
编辑 /etc/sysctl.conf 以使其永久化:
shellvm.swappiness=10
安装极狐GitLab
在内存受限的环境中,您应该考虑哪个极狐GitLab 发行版适合您。
极狐GitLab 专业版和旗舰版 附带的功能显著多于极狐GitLab 基础版,但所有这些附加功能都会增加计算和内存需求。
优化 Puma
极狐GitLab 默认运行的配置旨在处理许多并发连接。
对于不需要高吞吐量的小型安装,请考虑禁用Puma 集群模式。这样,只有一个 Puma 进程会服务于应用程序。
在 /etc/gitlab/gitlab.rb 中:
rubypuma['worker_processes'] = 0
我们观察到通过这种方式配置 Puma 可以减少 100-400MB 的内存使用。
优化 Sidekiq
Sidekiq 是一个后台处理守护程序。当与极狐GitLab 一起配置时,它默认以 20 的并发模式运行。这会影响它在特定时间可以分配多少内存。建议将其配置为使用明显较小的值 5 或 10(首选)。
在 /etc/gitlab/gitlab.rb 中:
rubysidekiq['concurrency'] = 10
优化 Gitaly
Gitaly 是一个存储服务,允许高效访问基于 Git 的存储库。建议配置 Gitaly 强制执行的最大并发性和内存限制。
在 /etc/gitlab/gitlab.rb 中:
ruby1gitaly['configuration'] = { 2 concurrency: [ 3 { 4 'rpc' => "/gitaly.SmartHTTPService/PostReceivePack", 5 'max_per_repo' => 3, 6 }, { 7 'rpc' => "/gitaly.SSHService/SSHUploadPack", 8 'max_per_repo' => 3, 9 }, 10 ], 11 cgroups: { 12 repositories: { 13 count: 2, 14 }, 15 mountpoint: '/sys/fs/cgroup', 16 hierarchy_root: 'gitaly', 17 memory_bytes: 500000, 18 cpu_shares: 512, 19 }, 20} 21 22gitaly['env'] = { 23 'GITALY_COMMAND_SPAWN_MAX_PARALLEL' => '2' 24}
禁用监控
极狐GitLab 默认启用所有服务,以提供完整的 DevOps 解决方案,而无需任何额外配置。有些默认服务,如监控,对于极狐GitLab 的功能不是必需的,可以禁用以节省内存。
在 /etc/gitlab/gitlab.rb 中:
rubyprometheus_monitoring['enable'] = false
我们观察到通过这种方式配置极狐GitLab 可以减少 200MB 的内存使用。
配置极狐GitLab 如何处理内存
极狐GitLab 由多个组件组成(用 Ruby 和 Go 编写),其中极狐GitLab Rails 是最大的一个,消耗最多的内存。
极狐GitLab Rails 使用 jemalloc 作为内存分配器。jemalloc 预分配内存以更大的块形式,并在更长时间内保持以提高性能。您可以配置极狐GitLab 以在不再需要时立即释放内存,而不是长时间保持它,以换取一些性能损失。
在 /etc/gitlab/gitlab.rb 中:
ruby1gitlab_rails['env'] = { 2 'MALLOC_CONF' => 'dirty_decay_ms:1000,muzzy_decay_ms:1000' 3} 4 5gitaly['env'] = { 6 'MALLOC_CONF' => 'dirty_decay_ms:1000,muzzy_decay_ms:1000' 7}
我们观察到在应用程序执行期间内存使用更加稳定。
禁用额外的应用内监控
极狐GitLab 使用内部数据结构来测量自身的不同方面。如果禁用了监控,这些功能不再需要。
要禁用这些功能,您需要进入极狐GitLab 的管理区域并禁用 Prometheus Metrics 功能:
- 在左侧边栏底部,选择 管理区域。
- 选择 设置 > 指标和分析。
- 展开 指标 - Prometheus。
- 禁用 启用 Prometheus 指标。
- 选择 保存更改。
包含所有更改的配置
-
如果您应用了到目前为止描述的所有内容,您的 /etc/gitlab/gitlab.rb 文件应该包含以下配置:
ruby1puma['worker_processes'] = 0 2 3sidekiq['concurrency'] = 10 4 5prometheus_monitoring['enable'] = false 6 7gitlab_rails['env'] = { 8 'MALLOC_CONF' => 'dirty_decay_ms:1000,muzzy_decay_ms:1000' 9} 10 11gitaly['configuration'] = { 12 concurrency: [ 13 { 14 'rpc' => "/gitaly.SmartHTTPService/PostReceivePack", 15 'max_per_repo' => 3, 16 }, { 17 'rpc' => "/gitaly.SSHService/SSHUploadPack", 18 'max_per_repo' => 3, 19 }, 20 ], 21 cgroups: { 22 repositories: { 23 count: 2, 24 }, 25 mountpoint: '/sys/fs/cgroup', 26 hierarchy_root: 'gitaly', 27 memory_bytes: 500000, 28 cpu_shares: 512, 29 }, 30} 31gitaly['env'] = { 32 'MALLOC_CONF' => 'dirty_decay_ms:1000,muzzy_decay_ms:1000', 33 'GITALY_COMMAND_SPAWN_MAX_PARALLEL' => '2' 34} -
在您进行所有这些更改后,重新配置极狐GitLab 以使用新设置:
shellsudo gitlab-ctl reconfigure由于极狐GitLab 在此之前没有使用内存节约设置,因此该操作可能需要一段时间。
性能结果
应用上述配置后,您可以期望以下内存使用情况:
plaintexttotal used free shared buff/cache available Mem: 1.9Gi 1.7Gi 151Mi 31Mi 132Mi 102Mi Swap: 1.0Gi 153Mi 870Mi