应用调试好以后,开发做压测,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) unlimitednetstat -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 1TIME_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定义的时间才能再次取锁。