nginx-性能调优


应用调试好以后,开发做压测,50并发有问题;

access.log日志报错大致如下 500,ip用替换为内网;
192.168.2.18 - - [25/Dec/2025:15:32:17 +0800] “GET //v1/… HTTP/1.1” 500 170 “-“ “k6/1.0.0-rc1”
error日志报错:
2025/12/25 15:33:36 [alert] 3044#3044: *91843 socket() failed (24: Too many open files) while connecting to upstream,
2025/12/25 15:33:33 [alert] 3045#3045: *91614 socket() failed (24: Too many open files) while connecting to upstream, client: 192.168.2.18, server: 192.168.2.17, request: “GET /v1/…
2025/12/25 15:33:36 [crit] 3044#3044: accept4() failed (24: Too many open files)

ulimit  -a
real-time non-blocking time  (microseconds, -R) unlimited
core file size              (blocks, -c) unlimited
data seg size               (kbytes, -d) unlimited
scheduling priority                 (-e) 0
file size                   (blocks, -f) unlimited
pending signals                     (-i) 14251
max locked memory           (kbytes, -l) 460576
max memory size             (kbytes, -m) unlimited
open files                          (-n) 65535
pipe size                (512 bytes, -p) 8
POSIX message queues         (bytes, -q) 819200
real-time priority                  (-r) 0
stack size                  (kbytes, -s) 8192
cpu time                   (seconds, -t) unlimited
max user processes                  (-u) 14251
virtual memory              (kbytes, -v) unlimited
file locks                          (-x) unlimited
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

TIME_WAIT 610
FIN_WAIT_1 2
ESTABLISHED 3
LAST_ACK 1

TIME_WAIT 表示收到了对方的 FIN 报文,并发送出了 ACK 报文。
FIN_WAIT_1 当 SOCKET 在 ESTABLISHED 状态时,它想主动关闭连接,向对方发送了 FIN 报文,此时该 SOCKET 进入到 FIN _WAIT_1状态。
而当对方回应 ACK 报文后,则进入到 FIN WAIT_2状态。
ESTABLISHED 表示 TCP 连接已经成功建立。
LAST_ACK 当被动关闭的一方在发送 FIN 报文后,等待对方的 ACK 报文的时候,就处于 LAST
ACK 状态。

ps -ef | grep nginx
root 338195 0.0 0.0 56384 1608 ? Ss 16:22 0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 338196 0.0 0.2 60872 9280 ? S 16:22 0:00 nginx: worker process
www-data 338197 0.0 0.2 60872 9280 ? S 16:22 0:00 nginx: worker process
root 339678 0.0 0.0 6240 648 pts/0 S+ 16:59 0:00 grep nginx

#cat /proc/<pid>/limits
cat /proc/338196/limits
Limit                     Soft Limit           Hard Limit           Units     
Max cpu time              unlimited            unlimited            seconds   
Max file size             unlimited            unlimited            bytes     
Max data size             unlimited            unlimited            bytes     
Max stack size            8388608              unlimited            bytes     
Max core file size        0                    unlimited            bytes     
Max resident set          unlimited            unlimited            bytes     
Max processes             14251                14251                processes 
Max open files            1024                1024                files     
Max locked memory         65536                65536                bytes     
Max address space         unlimited            unlimited            bytes     
Max file locks            unlimited            unlimited            locks     
Max pending signals       14251                14251                signals   
Max msgqueue size         819200               819200               bytes     
Max nice priority         0                    0                    
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us    

在 Nginx 的配置文件中,worker_rlimit_nofile 指令用于设置工作进程可以打开的最大文件描述符数量。如果你在 /etc/nginx/nginx.conf 或者其他包含文件的上下文中遇到了错误信息,比如“worker_rlimit_nofile directive is not allowed here”,这通常意味着该指令的使用位置不正确。

正确使用 worker_rlimit_nofile
worker_rlimit_nofile 应该直接在主配置文件(通常是 /etc/nginx/nginx.conf)或者在包含的配置文件中使用,而不是在 http、server 或者 location 块内部。正确的使用方式应该类似于以下示例:

示例配置
确保 worker_rlimit_nofile 位于主配置文件的顶层或者任何全局的包含文件中,而不是在 http、server 或 location 块中。例如:

vim /etc/nginx/nginx.conf

user www-data;
worker_processes auto;
pid /run/nginx.pid;
worker_rlimit_nofile 131072;
include /etc/nginx/modules-enabled/*.conf;

events {
       
    worker_connections  65535;
    use epoll;
    accept_mutex off;
    multi_accept on;
    reuse_port on;

}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    server {
        listen       80;
        server_name  localhost;
    
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }
    }

}


sudo nginx -t
sudo nginx -s reload
sudo systemctl restart nginx

随手整理了网上的一些调优的参数,大家可以一起学习一下:

1、work_processes

worker_processes表示worker线程的数量,每个worker进程都是单线程的进程,他们会调用各个模块以实现多重多样的功能。一般来每一个请求就会有一个线程。而线程在并发情况下会在不同的cpu上执行代码,所以说有多少个cpu就有多少个worker进程。在没有阻塞的情况下,也就是各个请求不相互影响,那么有多少个cpu就可配置多少个worker进程。如果有阻塞的情况,根据多核cpu执行代码的整体效率来说,就应该多配置一下worker进程,这样cpu的吞吐率就会提升上去。

2、woker_connections

worker_connections表示每个worker进程的最大连接数,默认是1024个,通过使用worker_processes和worker_connections可以设置nginx的总体最大连接数,也就是两个值的乘积。

3、worker_cpu_affinity

worker_cpu_affinity表示绑定nginx的worker进程到指定cpu内核。为什么要绑定worker进程到指定的cpu内核?假设每一个worker进程都是非常繁忙,如果发生多个worker进程抢同一个cpu,那么就会出现同步问题,如果每一个worker进程都独占一个cpu,那么就没有这种问题。

比如有4核cpu,就可以这样配置。

worker_processes 4;
worker_cpu_affinity 1000, 0100,0010,0001

这里要注意worker_cpu_affinity配置仅仅对linux操作系统有效。

4、worker_priority

worker_priority表示nginxworker进程的优先级,默认为0,。优先级由静态优先级和内核根据进程执行情况所做的动态调整(目前只有±5的调整)共同决定。nice值是进程的静态优先级,它的取值范围是–20~+19,–20是最高优先级,+19是最低优先级。因此,如果用户希望Nginx占有更多的系统资源,那么可以把nice值配置得更小一些,但不建议比内核进程的nice值(通常为–5)还要小。

5、worker_rlimit_nofile

表示nginx的worker进程可以打开最大句柄描述符的个数,更改worker进程的最大打开文件数限制,如果没有设置的话,这个值为操作系统限制。设置后你的操作系统和nginx可以处理比Ulimit -a更多的文件,所以把这个值设置的高,nginx就不会有too many open files的问题了。

6、 accept_mutex

accept_mutex表示是否打开accept锁,accept_mutex是nginx的负载均衡锁,当某一个worker进程建立的连接数达到worker_connections配置的最大连接数的7/8时,会大大减小该worker进程试图建立新tcp连接的机会,accept锁默认是打开的,如果关闭它,那么建立tcp连接的耗时会更短,但是worker进程之间的负载会非常不平衡。

7、 accept_mutex_delay

accept_mutex_delay表示accept锁表示accept锁后到真正建立链接之间的延迟时间,默认为500ms,在使用accept锁后,同一时间只有一个worker进程能够取得accept锁。这个accept锁不是阻塞锁,如果取不到会立即返回,如果只有一个worker进程视图取锁而没有取到,他至少要等待accept_mutex_delay定义的时间才能再次取锁。


文章作者: 云上的小雨滴
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 云上的小雨滴 !
评论
  目录