5.2. Puma Tunings
Puma 是一个 ruby 应用服务器,用于为客户端提供 Foreman 相关请求。对于任何应当处理大量客户端或频繁操作的 Satellite 配置,务必要相应地调整 Puma。
5.2.1. Puma Threads
Puma 线程数量(每个 Puma worker)使用两个值进行配置: threads_min
和 threads_max
。
threads_min
值决定了每个 worker 启动时都会生成的线程数。然后,随着并发请求进入和需要更多线程,worker 将生成更多 worker,最多为 threads_max
限制。
我们建议将 thread_min
设置为与 less Puma 线程数量相同的 threads_max
值,从而导致卫星服务器上的内存用量较高。
例如,我们使用并发注册测试比较这两个设置:
带有 8 个 CPU 的 Satellite 虚拟机, 40 GiB RAM | 带有 8 个 CPU 的 Satellite 虚拟机, 40 GiB RAM |
---|---|
|
|
|
|
|
|
与 threads_min=0
相比,将最小 Puma 线程设置为 16
会导致内存用量少 12%。
5.2.2. Puma Workers 和 Threads Auto-Tuning
如果没有为 satellite-installer
提供任何 Puma worker 和 thread 值,或者您的 Satellite 配置中不存在它们,则 satellite-installer
配置平衡的 worker。它遵循以下公式:
min(CPU_COUNT * 1.5, RAM_IN_GB - 1.5)
在大多数情况下,这应该很有效,但某些使用模式调整需要限制专用于 Puma 的资源数量(因此,其他 Satellite 组件可以使用这些)或任何其他原因。每个 Puma worker 都消耗大约 1 GiB RAM。
查看您当前的卫星服务器设置
# cat /etc/systemd/system/foreman.service.d/installer.conf
查看当前活跃的 Puma worker
# systemctl status foreman
5.2.3. 手动调整 Puma worker 和线程数
如果您决定不依赖于 第 5.2.2 节 “Puma Workers 和 Threads Auto-Tuning”,您可以为这些可调项应用自定义号。在以下示例中,我们使用 2 个 worker、5 和 5 个线程:
# satellite-installer \ --foreman-foreman-service-puma-workers=2 \ --foreman-foreman-service-puma-threads-min=5 \ --foreman-foreman-service-puma-threads-max=5
将您的更改应用到卫星服务器。更多信息请参阅 第 5.1 节 “应用配置”。
5.2.4. Puma Workers 和 Threads Recommendations
要为不同的调优配置文件推荐线程和 worker 配置,我们使用不同的调优配置文件在 Satellite 上进行 Puma 调优测试。此测试中使用的主测试是并发注册,其组合包括不同的 worker 和线程数量。我们的建议仅基于并发注册性能,因此可能无法反映您的确切用例。例如,如果您的设置非常面向发布和提升内容,您可能想限制 Puma 消耗的资源,并取代 Pulp 和 PostgreSQL。
Name | 受管主机数量 | RAM | 内核 | 推荐的 Puma Threads (min 和 max) | 推荐的 Puma Workers |
---|---|---|---|---|---|
default | 0 – 5000 | 20 GiB | 4 | 16 | 4 – 6 |
中 | 5000 – 10000 | 32 GiB | 8 | 16 | 8 – 12 |
大 | 10000 – 20000 | 64 GiB | 16 | 16 | 12 – 18 |
extra-large | 20000 – 60000 | 128 GiB | 32 | 16 | 16 – 24 |
extra-extra-large | 60000+ | 256 GiB+ | 48+ | 16 | 20 – 26 |
对工作程序进行调优是,在一些情况下,我们可以提高 52% 的性能。虽然安装程序默认使用 5 分钟/最大线程,但我们建议在上表中使用所有调优配置文件的 16 个线程。这是因为,与 4 个线程设置相比,与设置 4 个线程相比,我们看到的 16 个线程性能增加了 23%(14%,84% 的 10%)。
要查明这些建议,我们使用了并发注册测试案例,这是一个非常具体的用例。它在卫星上可能会有所不同,它可能具有更平衡的用例(不仅仅是注册)。另外,保留默认 5 分钟/最大线程是很好的选择。
以下是导致我们提出这些建议的一些测量信息:
4 个 worker、4 个线程 | 4 个 worker、8 个线程 | 4 个 worker、16 个线程 | 4 个 worker, 32 个线程 | |
---|---|---|---|---|
改进 | 0% | 14% | 23% | 10% |
在默认设置(4 个 CPU)上使用 4 个关闭 worker - 与 2 个 worker 相比,与 2 个 worker 相比,与 5 个 worker 相比,与 8 个 worker 的性能更高,但 8% 的性能降低 8 个 worker - 参见下表:
2 个 worker、16 个线程 | 4 个 worker、16 个线程 | 6 个 worker、16 个线程 | 8 个 worker、16 个线程 | |
---|---|---|---|---|
改进 | 0% | 26% | 22% | -8% |
在 Medium setup (8 CPU)中使用 8049-的 worker - 请参考下表:
2 个 worker、16 个线程 | 4 个 worker、16 个线程 | 8 个 worker、16 个线程 | 12 个 worker、16 个线程 | 16 个 worker、16 个线程 | |
---|---|---|---|---|---|
改进 | 0% | 51% | 52% | 52% | 42% |
使用 32 个 CPU 设置上的 16 个关闭程序(这是在 90 GiB RAM 计算机上测试,且内存关闭为因系统开始交换)的一个因子,对于我们测试的超大的线程数量较高,所以我们测试的并发级别较高,因此不建议它。
4 个 worker、16 个线程 | 8 个 worker、16 个线程 | 16 个 worker、16 个线程 | 24 个 worker、16 个线程 | 32 个 worker、16 个线程 | 48 个 worker、16 个线程 | |
---|---|---|---|---|---|---|
改进 | 0% | 37% | 44% | 52% | 太多故障 | 太多故障 |
5.2.5. 配置 Puma Workers
如果有足够的 CPU,增加更多 worker 会增加性能。例如,我们已将 Satellite 设置与 8 和 16 个 CPU 进行比较:
带有 8 个 CPU 的 Satellite 虚拟机, 40 GiB RAM | 带有 16 个 CPU 的 Satellite VM, 40 GiB RAM |
---|---|
|
|
|
|
|
|
在 8 CPU 设置中,将 worker 数从 2 改为 16,可将并发注册时间提高 36%。在 16 个 CPU 设置中,同样的更改会导致 55% 的改进。
增加更多 worker 可以帮助处理总注册并发卫星。在我们的测量中,使用 2 个 worker 设置可以处理多达 480 个并发注册,但增加了更多的 worker。
手动调整
您可以将 worker 数量设置为 2,将线程数量设置为 5:
# satellite-installer \ --foreman-foreman-service-puma-threads-max=5 --foreman-foreman-service-puma-threads-min=5 \ --foreman-foreman-service-puma-workers=2 \
5.2.6. 配置 Puma Threads
更多线程允许更短的时间并行注册主机。例如,我们比较了这两个设置:
带有 8 个 CPU 的 Satellite 虚拟机, 40 GiB RAM | 带有 8 个 CPU 的 Satellite 虚拟机, 40 GiB RAM |
---|---|
|
|
|
|
|
|
在高度并发注册方案中,使用更多 worker 和相同线程总数可产生大约 11% 的速度。此外,添加更多工作程序不会消耗更多 CPU 和 RAM,但会获得更好的性能。
5.2.7. 配置 Puma DB Pool
$db_pool
的有效值自动设置为等于 $foreman::foreman_service_puma_threads_max
。它是 $foreman::db_pool
和 $foreman::foreman_service_puma_max
的最大值,但两者的默认值为 5,因此对最多 5 数量的增加都会自动增加数据库连接池。
如果您遇到 ActiveRecord::ConnectionTimeoutError: 在 5.000 秒内从池中获取连接(等待的 5.006 秒),则所有池连接都在
错误,您可能需要提高这个值。
/var/log/foreman/production.log
中使用
查看当前的 db_pool 设置
# grep pool /etc/foreman/database.yml pool: 5
5.2.8. 手动调优 db_pool
如果您决定不依赖于自动配置的值,您可以应用类似如下的自定义号:
# satellite-installer --foreman-db-pool 10
将您的更改应用到卫星服务器。更多信息请参阅 第 5.1 节 “应用配置”。