正确配置 ulimit 和 SYS_RESOURCE 权限后,性能在高并发场景下会更有保障

社区话题 Nginx 容器 setrlimit(RLIMIT_NOFILE) 报错问题分析与解决 正确配置 ulimit 和 SYS_RESOURCE 权限后,性能在高并发场景下会更有保障

#783

追光
管理员

正确配置 ulimit 和 SYS_RESOURCE 权限后,性能在高并发场景下会更有保障,原因如下:


为什么提升 nofile 和允许 setrlimit 能提高性能?

  1. Nginx 高并发依赖文件描述符

    每个 TCP 连接、文件、Socket 都占用一个 FD(文件描述符)。

    默认 ulimit -n = 1024,意味着:

    • 超过 1024 并发连接时,Nginx 会报 Too many open files 错误。

    • Nginx 进程无法处理更多连接,即使系统资源够用。

  2. worker_rlimit_nofile 配置会被忽略

    如果容器权限不足,setrlimit() 失败,Nginx 实际仍然受 1024 限制,性能瓶颈提前出现。

  3. 正确配置后优势

    • –ulimit nofile=65536:65536 → Nginx 允许 65K 文件描述符。

    • –cap-add=SYS_RESOURCE → 让 Nginx 生效 worker_rlimit_nofile,避免报错。


性能差异对比

场景

限制

高并发影响

默认(ulimit 1024)

1024 FD

~1000并发后报错,连接拒绝

优化后(ulimit 65536)

65536 FD

理论支持数万并发,瓶颈在CPU/带宽


推荐值

  • ulimit -n:65536(小型服务),>100000(高并发服务)。

  • worker_connections

worker_connections  8192;
worker_rlimit_nofile 65536;
  • CPU 核心数 × worker_connections ≈ 最大并发连接数。


总结

  • 提升 ulimit 和授予 SYS_RESOURCE必要的性能优化,特别是:

    • 反向代理高并发请求

    • 静态文件服务

    • WebSocket/长连接应用

  • 没有安全隐患(只是允许修改资源限制),但 不要用 –privileged,权限过大。