Nginx / postgres不使用所有内核

我有一个Nginx + Postgres服务器与8个CPU核心。 我注意到,在负载下CPU只能使用高达〜60%。

我看着top ,这里是一个截图:

顶部的截图

事实certificate,只有5个进程实际上并行运行。 什么可能导致这个封盖?

我看着postgresconfiguration。 我没有注意到任何设置都会封锁它,设置并不是真正的限制,例如:

 max_connections = 100 

然后我检查了Nginxconfiguration。 这些设置似乎相关(但在这种情况下,似乎并没有限制):

 worker_processes auto; worker_connections 768; 

在PHP的设置,我看着这个设置,似乎是可疑的:

 pm.max_children 

pm设置为dynamic 。 这可能是限制因素(我不能盲目testing各种设置更改,并重新启动此服务器进行试验)? 如果是这样,我应该如何select价值? 设置它等于核心数量还是更多?

NGINX在这里pipe理PHP-FPM的5个连接。 PHP-FPM为每个连接dynamic分配worker。 一切看起来不错。

PostgreSQL使用99%的CPU和1%的内存。 如果你给它更多的资源,可能会有更快的方法来执行查询。

  • 在调整任何东西之前,请熟悉PostgreSQL如何使用CPU 。
  • 调整您的硬件和预期负载(连接/客户端)的configuration。 你可以使用pgtune获得一些球场号码。
  • 如果你的工作负载涉及UPDATEDELETE你(或者自动真空守护进程)需要对数据库进行VACUUM删除死元组。

  • 如果您可以承受一些停机时间,并且您有足够的磁盘空间,那么在投入太多时间之前,我build议您使用VACUUM FULL ANALYZE

  • 如果您使用的是9.0以前版本的PostgreSQL,则可能需要在VACUUM之后进行REINDEX

  • 既然您已经inheritance了这个系统,那么查看正在运行的查询types以及所有CPU的耗用量是一个好主意。 pgbadger将规范化并将您的查询分组在一起。 您可能能够手动调整一些查询或索引。

  • 有许多不同types的索引,你可能以前没有见过。 您可以对expression式,BRIN,GIN等进行部分索引,索引。Heroku 有效地使用了索引。

  • 你也一定要确保你没有locking问题 。

  • 考虑检查邮件列表存档或发布到列表中。 IRC也有一个非常好的社区。