我有一台 Nginx+Postgres 服务器,有 8 个 CPU 核心。我注意到在负载下 CPU 使用率最多只有 60% 左右。
我查看了top
,以下是屏幕截图:
事实证明,实际上只有 5 个进程是并行运行的。什么原因导致了这种限制?
我查看了 postgres 配置。我没有注意到任何设置会限制它,这些设置实际上并没有限制,例如:
max_connections = 100
然后我检查了 Nginx 配置。这些设置似乎相关(但在这种情况下似乎没有上限):
worker_processes auto;
worker_connections 768;
在 php 设置中我查看了此设置并且它看起来很可疑:
pm.max_children
设置pm
为dynamic
。这可能是限制因素吗(我无法盲目测试各种设置更改并重新启动此服务器进行实验)?如果是这样,我应该如何选择该值?将其设置为等于核心数或更多?
答案1
NGINX 无需费力管理 5 个 PHP-FPM 连接。PHP-FPM 会动态地为每个连接启动工作器。这里一切看起来都很好。
PostgreSQL 占用了 99% 的 CPU 和 1% 的内存。如果为其提供更多资源,可能会有更快的查询执行方式。
- 在调整任何内容之前,请先熟悉PostgreSQL 如何使用 CPU。
- 调整硬件配置和预期负载(连接数/客户端)。您可以使用页面来获取一些大概的数字。
如果你的工作负载涉及
UPDATE
并且DELETE
你(或自动清理守护进程)需要VACUUM
你的数据库删除死元组。如果您可以承受一些停机时间并且有空闲的磁盘空间,我建议您
VACUUM FULL ANALYZE
在投入太多时间之前先进行一下。如果你使用的是 PostgreSQL 9.0 之前的版本,你可能需要
REINDEX
后VACUUM
。既然您继承了这个系统,那么查看正在运行的查询类型以及哪些查询占用了所有 CPU 是一个好主意。普格巴杰将规范化并分组您的查询。您可能能够手动调整一些查询或索引。
有很多不同类型的索引你可能之前没有见过。你可以创建部分索引、表达式索引、BRIN、GIN 等。Heroku 对有效使用索引有一个总结。
你也一定要确保你没有锁定问题。