1 nginx
1.1 worker_processes,工作进程数
- 1.默认:worker_processes: 1
- 2.调大:worker_processes: CPU核心数,(双核4线程,可以设置为4),不用设置太多,设置太多容易引起502
1.2 worker_connections,单个工作进程可以允许同时建立外部连接的数量
数字越大,能同时处理的连接越多
1.默认:worker_connections: 1024
2.调大:worker_connections: 100000,(调大到10万连接)
worker_connections解析
1.connections不是随便设置的,而是与两个指标有重要关联,一是内存,二是操作系统级别的“进程最大可打开文件数”。
2.内存:每个连接数分别对应一个read_event、一个write_event事件,一个连接数大概占用232字节,2个事件总占用96字节,那么一个连接总共占用328字节,通过数学公式可以算出100000个连接数大概会占用 31M = 100000 * 328 / 1024 / 1024,当然这只是nginx启动时,connections连接数所占用的nginx。
3.进程最大可打开文件数:进程最大可打开文件数受限于操作系统,可通过 ulimit -n 命令查询,以前是1024,现在是65535,
nginx提供了worker_rlimit_nofile指令,这是除了ulimit的一种设置可用的描述符的方式。 该指令与使用ulimit对用户的设置是同样的效果。此指令的值将覆盖ulimit的值,如:worker_rlimit_nofile 20960;
设置ulimits:ulimit -SHn 65535
worker_processes 2;
worker_rlimit_nofile 65535;
#pid logs/nginx.pid;
events {
worker_connections 65535;
}
通过 ps -elf | grep nginx 找到 nginx 的worker进程ID
通过 cat /proc/31613/limits 查看,其中2291是worker进程ID,请注意其中的Max open files
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hz5IFbsH-1655457160845)(nginx%E7%9A%84%E4%BC%98%E5%8C%96.assets/image-20210806090626927-16282119890331.png)]
2 tomcat(springboot)
在springboot-configuration-metadata.json文件下面,有很多属于springboot的属性,以下为tomcat的默认配置属性:
server.tomcat.accept-count:等待队列长度,默认100(队列也做缓冲池用,但也不能无限长, 不但消耗内存,而且出队入队也消耗CPU)
server.tomcat.max-connections:最大可被连接数,默认10000
server.tomcat.max-threads:最大工作线程数,默认200,线程数不是越多越好,要考虑操作系统上下文切换的开销
server.tomcat.min-spare-threads:最小工作线程数,默认10(用来解决突发的容量问题,需要有一些在工作的线程),操作系统可以有充足的时间反应,先用这10个,不够的再开启就可以
注意:
默认配置下,连接超过10000后出现拒绝连接情况
默认配置下,触发的请求超过200+100后拒绝处理
一条来自网上大佬的经验:4核8G内存单进程调度线程800-1000以上之后会花费巨大的时间在CPU调度上
示例:
server:
tomcat:
threads:
max: 400
min-spare: 100
accept-count: 1000
3 查看nginx当前并发请求数量
[root@localhost logs]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
LAST_ACK 9
SYN_RECV 1
ESTABLISHED 2185
FIN_WAIT1 13
FIN_WAIT2 223
TIME_WAIT 294
解析:
CLOSED //无连接是活动的或正在进行
LISTEN //服务器在等待进入呼叫
SYN_RECV //一个连接请求已经到达,等待确认
SYN_SENT //应用已经开始,打开一个连接
ESTABLISHED //正常数据传输状态/当前并发连接数 (正常数据传输状态)
FIN_WAIT1 //应用说它已经完成
FIN_WAIT2 //另一边已同意释放
ITMED_WAIT //等待所有分组死掉
CLOSING //两边同时尝试关闭
TIME_WAIT //另一边已初始化一个释放 (处理完毕,等待超时结束的请求数)
LAST_ACK //等待所有分组死掉 (正在等待处理的请求数)