Nginx worker_rlimit_nofile

Eli*_*ock 7 nginx

如何设置worker_rlimit_nofile更高的数字以及它可以或建议的最大值是多少?

我正在尝试遵循以下建议:

大多数人遇到的第二大限制也与您的操作系统有关.打开一个shell,su给用户nginx运行,然后运行命令ulimit -a.这些值都是nginx不能超过的限制.在许多默认系统中,打开的文件值相当有限,在我刚检查的系统上设置为1024.如果nginx遇到它达到此限制的情况,它将记录错误(24:太多打开的文件)并返回给客户一个错误.当然nginx可以处理超过1024个文件,你的操作系统也可能.您可以安全地增加此值.

要执行此操作,您可以使用ulimit设置限制,也可以使用worker_rlimit_nofile定义所需的打开文件描述符限制.

来自:https://blog.martinfjordvald.com/2011/04/optimizing-nginx-for-high-traffic-loads/

Zst*_*ack 12

在设置worker_rlimit_nofile参数时,您应该同时考虑worker_connectionsworker_processes。您可能希望首先使用:检查操作系统的文件描述符ulimit -Hnulimit -Sn这将分别为您提供每个用户的硬文件和软文件限制。您可以使用 systemctl 更改操作系统限制:

sudo sysctl -w fs.file-max=$VAL
Run Code Online (Sandbox Code Playgroud)

其中 $VAL 是您要设置的数字。然后,您可以使用以下方法进行验证:

cat /proc/sys/fs/file-max
Run Code Online (Sandbox Code Playgroud)

如果您要自动化配置,很容易将 worker_rlimit_nofile 设置为:

worker_rlimit_nofile = worker_connections*2
Run Code Online (Sandbox Code Playgroud)

worker_processes 默认设置为 1,但是,您可以将其设置为小于或等于服务器上的内核数的数字:

grep -c ^processor /proc/cpuinfo
Run Code Online (Sandbox Code Playgroud)

编辑: 最新版本的 nginx set worker_processes: auto默认情况下,它设置为机器中可用的处理器数量。因此,重要的是要知道为什么要真正改变它。

通常,将其设置为最高值或所有可用处理器并不总是能将性能提高到一定限度:通过将其设置为 24 与 32 处理器,您可能会获得相同的性能。一些内核/TCP 堆栈参数也可以帮助缓解瓶颈。

而在微服务部署 (kubernetes) 中,在设置这些配置时考虑 pod 资源请求/限制非常重要。

要检查 nginx 产生了多少工作进程,您可以运行ps -lfC nginx。例如,在我的机器上,我得到了以下信息,因为我的机器有 12 个处理器,nginx 产生了 12 个工作进程。

$ ps -lfC nginx
F S UID          PID    PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
5 S root       70488       1  0  80   0 - 14332 -      Jan15 ?        00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
5 S www-data   70489   70488  0  80   0 - 14526 -      Jan15 ?        00:08:24 nginx: worker process
5 S www-data   70490   70488  0  80   0 - 14525 -      Jan15 ?        00:08:41 nginx: worker process
5 S www-data   70491   70488  0  80   0 - 14450 -      Jan15 ?        00:08:49 nginx: worker process
5 S www-data   70492   70488  0  80   0 - 14433 -      Jan15 ?        00:08:37 nginx: worker process
5 S www-data   70493   70488  0  80   0 - 14447 -      Jan15 ?        00:08:44 nginx: worker process
5 S www-data   70494   70488  0  80   0 - 14433 -      Jan15 ?        00:08:46 nginx: worker process
5 S www-data   70495   70488  0  80   0 - 14433 -      Jan15 ?        00:08:34 nginx: worker process
5 S www-data   70496   70488  0  80   0 - 14433 -      Jan15 ?        00:08:31 nginx: worker process
5 S www-data   70498   70488  0  80   0 - 14433 -      Jan15 ?        00:08:46 nginx: worker process
5 S www-data   70499   70488  0  80   0 - 14449 -      Jan15 ?        00:08:50 nginx: worker process
5 S www-data   70500   70488  0  80   0 - 14433 -      Jan15 ?        00:08:39 nginx: worker process
5 S www-data   70501   70488  0  80   0 - 14433 -      Jan15 ?        00:08:41 nginx: worker process
Run Code Online (Sandbox Code Playgroud)

要打印确切的计数,您可以使用 UID(例如,对于我的设置,它的 UUID 是 www-data。它在 nginx.conf 中配置为用户 www-data;)

$ ps -lfC nginx | awk '/nginx:/ && /www-data/{count++} END{print count}'
12
Run Code Online (Sandbox Code Playgroud)

在 kubernetes 中,nginx 默认根据 pod 的资源请求生成工作进程。例如,如果您的部署中有以下内容:

resources:
  requests:
    memory: 2048Mi
    cpu: 2000m
Run Code Online (Sandbox Code Playgroud)

然后 nginx 会产生 2 个工作进程(2000 毫 cpu = 2 cpu)

  • 不确定公式是否正确:`worker_rlimit_nofile = (worker_connections * worker_processes) * 2`。人们似乎普遍认为阿扎德的答案中的公式才是正确的公式。如果 nginx 只有 1 个工作进程,则此答案中的公式会意外产生正确的结果。 (2认同)
  • @Manuel 同意,事实上,只有当工作进程设置为 1(曾经是默认值)时,这才有效。我更新了答案,谢谢。 (2认同)

小智 10

worker_rlimit_nofile = worker_connections*worker_processes

  • 尽管[nginx docs](http://nginx.org/en/docs/ngx_core_module.html#worker_rlimit_nofile)并未100%明确,但似乎`worker_rlimit_nofile`是[应用于每个工作者](https: //www.masv.io/boost-nginx-connection-limits/).因此,与"worker_processes"相乘是没有意义的.但是你可能需要乘以2,因为一个worker需要每个连接2个文件描述符 - 一个用于客户端,一个用于服务文件(或上游,代理......). (7认同)
  • 根据[nginx文档](http://nginx.org/en/docs/ngx_core_module.html#worker_connections),您不需要乘以2,因为worker_connections应该已经包含两种类型的连接(下游和上游)。 (3认同)

ROH*_*DJE 5

worker_rlimit_nofile = worker_connections *2

因为每个连接打开两个 fd,一个用于客户端,一个用于代理服务器。