为了减少内存使用,Puma 派生 worker 进程。每次创建 worker 时,它都会与主进程共享内存。Worker 仅在更改或添加到其内存页面时才使用额外的内存。随着 worker 处理额外的网络请求,这可能会导致 Puma worker 随着时间的推移使用更多的物理内存。随着时间的推移使用的内存量取决于极狐GitLab 的使用情况。极狐GitLab 用户使用的功能越多,随着时间的推移,预期的内存使用量就越高。
为了阻止不受控制的内存增长,Rails 应用程序运行一个 supervision 线程,如果他们在一定时间内超过给定的驻留集大小 (RSS) 阈值,该线程会自动重启 worker。
极狐GitLab 为内存限制设置了默认值 1200Mb。要覆盖默认值,请将
per_worker_max_memory_mb
设置为新的 RSS 限制(以兆字节为单位):
编辑
/etc/gitlab/gitlab.rb
:
puma['per_worker_max_memory_mb'] = 1024 # 1GB
重新配置极狐GitLab:
sudo gitlab-ctl reconfigure
当 worker 重新启动时,运行极狐GitLab 的能力会在短时间内降低。如果 worker 更换得太频繁,请将 per_worker_max_memory_mb
设置为更高的值。
Worker 计数是根据 CPU 内核计算的。如果 worker 过于频繁地重新启动(每分钟一次或更多次),具有 4-8 个 worker 的小型部署可能会遇到性能问题。
如果服务器有空闲内存,则建议设置 1200
或更高的值。
默认 Puma 超时为 60 秒。
puma['worker_timeout']
没有设置最大请求持续时间。
要将 worker 超时更改为 600 秒:
编辑
/etc/gitlab/gitlab.rb
:
gitlab_rails['env'] = {
'GITLAB_RAILS_RACK_TIMEOUT' => 600
重新配置极狐GitLab:
sudo gitlab-ctl reconfigure
这是一个实验性的 Alpha 功能,如有更改,恕不另行通知。该功能尚未准备好用于生产用途。如果您想使用此功能,我们建议您先使用非生产数据进行测试。有关更多详细信息,请参阅 已知问题。
在可用 RAM 少于 4GB 的内存受限环境中,请考虑禁用 Puma
集群模式
。
将
workers
的数量设置为
0
以减少数百 MB 的内存使用量:
编辑
/etc/gitlab/gitlab.rb
:
puma['worker_processes'] = 0
重新配置极狐GitLab:
编辑
/etc/gitlab/gitlab.rb
:
puma['ssl_listen'] = '127.0.0.1'
puma['ssl_port'] = 9111
puma['ssl_certificate'] = '<path_to_certificate>'
puma['ssl_certificate_key'] = '<path_to_key>'
# Disable UNIX socket
puma['socket'] = ""
重新配置极狐GitLab:
sudo gitlab-ctl reconfigure
除了 Unix 套接字,Puma 还在端口 8080 上侦听 HTTP,提供要被 Prometheus 抓取的指标。目前不可能让 Prometheus 通过 HTTPS 抓取它们。因此,从技术上讲,在不丢失 Prometheus 指标的情况下关闭此 HTTP 侦听器是不可能的。
从 Unicorn 切换到 Puma
对于基于 Helm 的部署,请参阅
webservice
chart 文档
。
从 13.0 版本开始,Puma 是默认的 Web 服务器,并且 Unicorn 已被禁用。
在 14.0 版本中,Unicorn 已从 Linux 包中删除,不再受支持。
Puma 采用多线程架构,与 Unicorn 等多进程应用服务器相比,它使用的内存更少。大多数 Rails 应用程序请求通常包含一定比例的 I/O 等待时间。
在 I/O 等待期间,MRI Ruby 将 GVL 释放给其它线程。因此,多线程 Puma 仍然可以处理比单个进程更多的请求。
当切换到 Puma 时,由于两个应用程序服务器之间的差异,任何 Unicorn 服务器配置都不会自动继承。
从 Unicorn 切换到 Puma:
确定合适的 Puma
worker 和 thread 设置
。
在
/etc/gitlab/gitlab.rb
中,将任何自定义 Unicorn 设置转换为 Puma。
下表总结了在使用 Linux 包时,哪些 Unicorn 配置键与 Puma 中的配置键对应,哪些没有对应的配置键。