为了减少内存使用,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:
sudo gitlab-ctl reconfigure
对于使用 NFS 存储 Git 仓库的部署,极狐GitLab 通过 Rugged 使用直接 Git 访问来提高性能。
如果直接 Git 访问可用并且 Puma 正在单线程运行,则会自动启用 Rugged 的使用,除非它被功能标志禁用。
MRI Ruby 使用全局 VM 锁 (GVL)。 GVL 允许 MRI Ruby 是多线程的,但最多只能在单个内核上运行。
Git 包括密集的 I/O 操作。当 Rugged 长时间使用一个线程时,可能正在处理请求的其他线程可能会饿死。在单线程模式下运行的 Puma 没有这个问题,因为最多同时处理一个请求。
目前正在努力移除 Rugged 的使用。尽管目前没有 Rugged 的性能是可以接受的,但在某些情况下,使用它运行可能仍然有益。
鉴于使用多线程 Puma 运行 Rugged 的警告以及 Gitaly 可接受的性能,如果使用 Puma 多线程(当 Puma 配置为使用多个线程运行时),我们将禁用 Rugged 使用。
在某些情况下,此默认行为可能不是最佳配置。如果 Rugged 在您的部署中发挥重要作用,我们建议您进行基准测试以找到最佳配置:
最安全的选择是从单线程 Puma 开始。
要强制 Rugged 与多线程 Puma 一起使用,您可以使用功能标志。
编辑
/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 侦听器是不可能的。
从 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 中的配置键对应,哪些没有对应的配置键。