在同一台机器上运行多个实例时的 Nginx 性能

在同一台机器上运行多个实例时的 Nginx 性能

我想了解在同一台机器上运行多个 nginx 实例 (主服务器) 对性能的影响,而不是将它们全部加载到使用不同服务器块的单个实例中。使用多个 nginx 实例会对 worker_process 和 worker_connections 优化等产生什么影响?

我看到很多建议都表明 worker_process 应该与核心数成正比,最多应该是核心数的两倍。我还了解到 worker_connections 应该与 ulimit 匹配,或者略低于 ulimit。提供太多连接或每个核心有太多工作线程都会影响性能。

我有两个核心和一个 1024 的 ulimit,但我有 4 个 nginx 实例,每个实例都有以下设置:

worker_processes 4;
worker_connections: 1024;

worker_processes 16;这难道不与我执行和 产生同样的效果吗worker_connections 4069;

注意:让我澄清一下,当我说 nginx 实例时,我的意思是有 4 个独立的主 nginx 进程,每个进程都提供具有类似设置的不同配置文件,并且每个进程都有自己的工作进程。

注 2:这种情况是我继承的,并且已经存在。我正在尝试弄清楚是否应该更改 nginx 的配置方式,并为此找到一个合理的理由。

答案1

从系统角度来看,运行 4 个主服务器和 4 个服务器部分,或运行单个主服务器和 16 个服务器部分,两者之间没有本质上的区别。它们实现了相同的架构:并行化基于事件的流程。

如果你有多个主服务器,那么工人/核心服务器的比例必须考虑到所有主服务器的工人总数。这有几个限制:

  • 确保 CPU 没有超载,因此工作器数量应小于等于核心数量
  • 确保并行化和操作系统调度得到最佳利用,因此工作者数量应尽可能高
  • HTTP 服务器工作线程的 CPU 使用率较低,并且大部分时间都在等待 I/O,因此分配 2 到 4 倍核心数实际上是安全的

使用单个主服务器应该会更高效一些,因为一些资源(如 MIME 映射等)只需加载一次。但这只是次要问题。

使用单个主服务器应该会更高效,因为所有服务器共享一个大型工作线程池。如果单个服务器暂时需要大多数工作线程(例如 16 个),它可能会得到它们。在多主服务器配置(例如 4 个主服务器和 4 个工作线程)中,它们最多只能使用它们拥有的:4 个工作线程。另一方面,这可能是预期的效果:严格分为 4 个实例,以确保每个实例始终至少获得主机四分之一的关注。但永远不会更多。

使用 1 个主控(想想:安全更新)应该更容易配置和维护。

它应该具有 4 个主服务器,从而更具弹性:您可以让一个主配置崩溃或完全混乱,而无需触及其他 3 个主配置。

除非您的 4 个主服务器使用不同的 Nginx 版本,否则您将无法从超级优化中受益,例如为每个主服务器编译精确的模块集。

相关内容