Linux下各种连接数配置及高并发Nginx优化
sinye56 2024-12-15 16:36 11 浏览 0 评论
前言
在性能测试过程中,经常会接触到链接数相关的问题,那就是一台服务器最多能支持多少链接数呢?
有的朋友可能会说是65535,因为操作系统有65535个端口,那么这个答案准确吗?
首先先了解下如何标识一个链接,操作系统是通过一个四元组来标识一个TCP链接:
{本地ip,本地port,远程ip,远程port}
这四个要素唯一确定一个TCP链接,任意一个要素不相同,就认为是一个不同的链接。
在Linux系统中,一切皆文件,每一个TCP链接都要占用一个文件句柄,系统允许创建的链接数取决于句柄数的上限。超过这个值再创建链接就会报这样的错误:
Can’t open so many files
内核文件描述符
查看及修改内核文件描述符的最大限制
查看
1
more /proc/sys/fs/file-max
临时生效
1
echo 3195430 > /proc/sys/fs/file-max
立即生效,永久生效
1
2
echo "fs.file-max = 3195430" >> /etc/sysctl.conf
sysctl -p
系统连接数
查看
1
ulimit -n
参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-S use the soft resource limit # 设置软限制
-H use the hard resource limit # 设置硬限制
-a all current limits are reported# 显示所有的配置。
-b the socket buffer size # 设置socket buffer 的最大值。
-c the maximum size of core files created # 设置core文件的最大值.
-d the maximum size of a process's data segment # 设置线程数据段的最大值
-e the maximum scheduling priority ('nice') # 设置最大调度优先级
-f the maximum size of files written by the shell and its children # 创建文件的最大值。
-i the maximum number of pending signals # 设置最大的等待信号
-l the maximum size a process may lock into memory #设置在内存中锁定进程的最大值
-m the maximum resident set size
-n the maximum number of open file descriptors # 设置最大可以的打开文件描述符。
-p the pipe buffer size
-q the maximum number of bytes in POSIX message queues
-r the maximum real-time scheduling priority
-s the maximum stack size
-t the maximum amount of cpu time in seconds
-u the maximum number of user processes # 设置用户可以创建的最大进程数.
-v the size of virtual memory # 设置虚拟内存的最大值
-x the maximum number of file locks
临时生效
1
ulimit -HSn 65535
永久生效
1
cat /etc/security/limits.conf
配置如下
1
2
3
4
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
通过
1
sysctl -p
使得配置生效,可用通过ulimit -a查看file配置是否生效,临时设置也可用通过ulimit -u 65535 配置。
查看系统当前的连接数
1
netstat -ant | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
结果
LAST_ACK 54
SYN_RECV 5
ESTABLISHED 4636
FIN_WAIT1 52
FIN_WAIT2 299
CLOSING 3
TIME_WAIT 1344
解析:
LAST_ACK //等待所有分组死掉
SYN_RECV //一个连接请求已经到达,等待确认
ESTABLISHED //正常数据传输状态/当前并发连接数
FIN_WAIT1 //应用说它已经完成
FIN_WAIT2 //另一边已同意释放
CLOSING //两边同时尝试关闭
TIME_WAIT //另一边已初始化一个释放
单独查看TIME_WAIT
1
ss -nat | grep TIME-WAIT
这里看到大部分都是9001和9011端口的服务占用的
我们查询一下数量
1
2
ss -nat | grep TIME-WAIT | grep 9001 | wc -l
ss -nat | grep TIME-WAIT | grep 9011 | wc -l
内核参数的优化
查看内核参数
1
sysctl -a
注意
调整内核参数后,内核处于不稳定状态,请务必重启实例。
打开配置文件
1
vi /etc/sysctl.conf
修改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 打开文件句柄数量
fs.file-max = 655360
# 最大ip跟踪数
net.nf_conntrack_max = 655360
#表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为2分钟。
net.netfilter.nf_conntrack_tcp_timeout_established = 120
# 允许系统打开的端口范围,扩大端口数
net.ipv4.ip_local_port_range = 10000 65535
# 用来限制监听(LISTEN)队列最大数据包的数量,超过这个数量就会导致链接超时或者触发重传机制,
net.core.somaxconn = 65535
# 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
net.core.netdev_max_backlog = 262144
# TIME_WAIT相关
# TIME_WAIT 最高的队列数
net.ipv4.tcp_max_tw_buckets = 262144
# timeout状态时间
net.ipv4.tcp_fin_timeout = 15
# 开启时就是同一个源IP来连接同一个目的端口的数据包时间戳必须是递增的,否则就丢弃
net.ipv4.tcp_timestamps = 1
# 开启重用。允许将TIME-WAIT sockets 重新用于新的TCP 连接。
net.ipv4.tcp_tw_reuse = 1
# 是否启用timewait 快速回收。如果服务器身处NAT环境,tcp_timestamps为1,安全起见,要禁止
net.ipv4.tcp_tw_recycle = 0
net.ipv4.ip_conntrack_max = 10240
# 系统中最多有多少个TCP 套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。
net.ipv4.tcp_max_orphans = 262144
# 是指定所能接受SYN同步包的最大客户端数量。
net.ipv4.tcp_max_syn_backlog = 262144
# 为了打开对端的连接,内核需要发送一个SYN,以确认收到上一个 SYN连接请求包。也就是所谓三次握手中的第二次握手。
# 这个设置决定了内核放弃连接之前发送SYN+ACK 包的数量。
net.ipv4.tcp_synack_retries = 1
# 对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃,测试感觉两个更稳定
net.ipv4.tcp_syn_retries = 2
# 开启SYN Cookies,当出现SYN 等待队列溢出时,启用cookies 来处理,目的是为了防止syn flood攻击。合法用户的高负载应该调整tcp_max_syn_backlog、tcp_synack_retries属性,
net.ipv4.tcp_syncookies = 0
使得配置生效
1
sysctl -p
跟TIME_WAIT有关的配置
1
2
# TIME_WAIT 最高的队列数
net.ipv4.tcp_max_tw_buckets = 262144
调整次参数的同时,要调整TIME_WAIT_2到TIME_WAIT的超时时间,默认是60s,优化到30s:
1
2
# TIME_WAIT_2到TIME_WAIT的超时时间
net.ipv4.tcp_fin_timeout = 30
其它TCP本身的配合参数类似与synack重传次数、syn重传次数等以后介绍,优化后也是有所益处的。
1
2
3
4
# 开启时就是同一个源IP来连接同一个目的端口的数据包时间戳必须是递增的,否则就丢弃
net.ipv4.tcp_timestamps = 1
# 开启重用。允许将TIME-WAIT sockets 重新用于新的TCP 连接。
net.ipv4.tcp_tw_reuse = 1
机器作为客户端时起作用,开启后time_wait在一秒内回收
不要开启,现在互联网NAT结构很多,可能直接无法三次握手
1
2
# 不要开启,现在互联网NAT结构很多,可能直接无法三次握手
net.ipv4.tcp_tw_recycle = 0
Nginx连接数
查看连接数
查看Nginx并发连接数
1
netstat -apn|grep 'nginx: worker'|wc -l
CPU相关信息查看
1
2
3
4
5
6
7
8
# 逻辑CPU个数:
cat /proc/cpuinfo | grep "processor" | wc -l
# 物理CPU个数:
cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
# 每个物理CPU中Core的个数:
cat /proc/cpuinfo | grep "cpu cores" | wc -l
配置连接数
Nginx总并发连接数 = worker数量 * worker_connections
一般建立连接的角度:客户并发连接为1.
nginx作为http服务器的时候:
max_clients = worker_processes * worker_connections
nginx作为反向代理服务器的时候:
max_clients = worker_processes * worker_connections/2
nginx做反向代理时,和客户端之间保持一个连接,和后端服务器保持一个连接。
但是怎样合理的设置worker_processes与worker_connections这两个参数?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
user nginx;
worker_processes auto;
worker_rlimit_nofile 256000;
events {
use epoll;
worker_connections 65535;
multi_accept on;
}
http {
}
根节点配置
1
2
3
worker_processes auto;
worker_rlimit_nofile 65535;
worker_cpu_affinity 0001 0010 0100 1000;
worker_processes
worker角色的进程个数(nginx启动后有多少个worker处理http请求。master不处理请求,而是根据相应配置文件信息管理worker进程. master进程主要负责对外揽活(即接收客户端的请求),并将活儿合理的分配给多个worker,每个worker进程主要负责干活(处理请求))。
nginx运行工作进程个数,一般设置cpu的核心或者核心数x2,如:worker_processes 4;
可以设置为auto,auto这个参数值是从nginx 1.3.8和nginx 1.2.5 开始进行支持的,自动参数可以自动检测 cpu cores 并设置 worker_processes 参数 。
1
worker_processes auto;
worker_processes最多开启8个,8个以上性能就不会再提升了,而且稳定性会变的更低,因此8个进程够用了。
查看nginx当前进程数:
1
ps -aux | grep nginx |grep -v grep
worker_rlimit_nofile
Nginx最多可以打开文件数,与ulimit -n保持一致,如:worker_rlimit_nofile 65535;
为nginx工作进程改变打开最多文件描述符数目的限制。用来在不重启主进程的情况下增加限制。
worker_cpu_affinity
运行CPU亲和力,与worker_processes对应,如:worker_cpu_affinity 0001 0010 0100 1000;
2核cpu,开启2个进程
1
2
worker_processes 2;
worker_cpu_affinity 01 10;
解释:01表示启用第一个CPU内核,10表示启用第二个CPU内核
worker_cpu_affinity 01 10;表示开启两个进程,第一个进程对应着第一个CPU内核,第二个进程对应着第二个CPU内核。
2核cpu,开启4个进程
1
2
worker_processes 4;
worker_cpu_affinity 01 10 01 10;
解释:开启了四个进程,它们分别对应着开启2个CPU内核
4个cpu,开启4个进程
1
2
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
解释:0001表示启用第一个CPU内核,0010表示启用第二个CPU内核,依此类推
4核cpu,开启2个进程
1
2
worker_processes 2;
worker_cpu_affinity 0101 1010;
解释:0101表示开启第一个和第三个内核,1010表示开启第二个和第四个内核;2个进程对应着四个内核;worker_cpu_affinity配置是写在/etc/nginx/nginx.conf里面的;2核是 01,四核是0001,8核是00000001,有多少个核,就有几位数,1表示该内核开启,0表示该内核关闭。
8核cpu,开启8个进程
1
2
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
解释:0001表示启用第一个CPU内核,0010表示启用第二个CPU内核,依此类推;worker_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了。
配置完之后可以重启nginx,用ab工具或者wrk工具,可以进行性能测试。
在服务器上执行top,然后按1,就可以多个CPU工作情况,如果多个CPU内核的利用率差不多,就证明Nginx已经成功利用了多核CPU。
events
事件处理模型。
1
2
3
4
5
events {
use epoll;
worker_connections 65535;
multi_accept on;
}
use epoll:nginx采用epoll事件模型,处理效率高
work_connections:是单个worker进程允许客户端最大连接数,这个数值一般根据服务器性能和内存来制定,实际最大值就是worker进程数乘以work_connections,实际我们填入一个65535,足够了,这些都算并发值,一个网站的并发达到这么大的数量,也算一个大站了!
multi_accept :告诉nginx收到一个新连接通知后接受尽可能多的连接,默认是on,设置为on后,多个worker按串行方式来处理连接,也就是一个连接只有一个worker被唤醒,其他的处于休眠状态,设置为off后,多个worker按并行方式来处理连接,也就是一个连接会唤醒所有的worker,直到连接分配完毕,没有取得连接的继续休眠。当你的服务器连接数不多时,开启这个参数会让负载有一定的降低,但是当服务器的吞吐量很大时,为了效率,可以关闭这个参数。
重启
检查配置文件是否可用
1
nginx -t
重新加载配置文件
1
service nginx reload
或者重启
1
service nginx restart
进程信息
查看进程连接数
总连接数
1
ps -ef |wc -l
查询用户的连接数统计
1
ps -ef |awk '{print $1}' |sort |uniq -c |sort -rn
查看某个进程连接数:
1
2
lsof -i:8|wc -l
lsof -p 12345|wc -l
其中
-p:对应进程的PID
-i:对应进程的端口号
或者使用下面命令也能获取到
1
netstat -nat|grep -i 8018|wc -l
查看进程的线程数
物理内存决定的系统进程数上限
1
cat /proc/sys/kernel/threads-max
系统的进程或线程限制数
这个值表示进程ID的上限。为了兼容旧版,默认为32768(即两个字节)
1
cat /proc/sys/kernel/pid_max
用户最大进程或线程数
使用命令:
1
ulimit -u
ps -ef只打印进程,而ps -eLf会打印所有的线程
1
ps -eLf | grep java
ps -eLf各字段含义
UID:用户ID
PID:process id 进程id
PPID: parent process id 父进程id
LWP:表示这是个线程;要么是主线程(进程),要么是线程
NLWP: num of light weight process 轻量级进程数量,即线程数量
STIME: start time 启动时间
TIME: 占用的CPU总时间
TTY:该进程是在哪个终端运行的;pts/0255代表虚拟终端,一般是远程连接的终端;tty1tty7 代表本地控制台终端
CMD:进程的启动命令
查看pid
1
lsof -i:8018
假如pid为26281
查询线程
1
2
3
top -H -p ${pid}
# 或者
top -p ${pid} #然后 shitf + H
查询线程数量
1
cat /proc/${pid}/status
获取线程的PID
1
ls /proc/${pid}/task
树状显示线程
1
pstree -p ${pid}
列表显示线程
1
ps -hH -p ${pid}
进程命令数
查询进程正在运行的命令数
1
lsof |awk '{print $1}' |sort |uniq -c |sort -rn
# linux
相关推荐
- 一个不错的软件版本命名规范!
-
之前写了一篇如何自动生成版本号的文章,《让你的C程序,自动打印版本信息》初衷是让自己的程序在运行时自动打印与版本相关的信息,避免测试时因为版本信息不确定导致的一些功能对应不上去的问题,当时留了一个坑,...
- 国产操作系统迎来发展风口 公务领域更能培育起Linux生态
-
谷歌和微软在俄罗斯市场的一番套路猛如虎,就让我们深刻地意识到了,只有自己的东西才能靠得住。也由此,国内操作系统发展迎来了发展风口。我就看到有朋友就秀出了他们单位采购的纯国产的主机,一款华为的主机,纯国...
- 5个大有“前途”的Linux桌面发行版本
-
ZD至顶网CIO与应用频道08月27日专栏:Linux无处不在。你的服务器里,你的电话、汽车、手表、烤面包机、冰箱……和台式机里都有Linux的身影。虽然在桌面上见到Linux的用户比在自动调温...
- Linux 常用应用软件大全
-
编译自:https://www.fossmint.com/most-used-linux-applications/作者:MartinsD.Okoi译者:HankChow对于许多应用程序...
- Linux 4.1 系列的最大版本 4.1.18 LTS发布,带来大量修改
-
(LCTT译注:这是一则过期的消息,但是为了披露更新内容,还是发布出来给大家参考)著名的内核维护者GregKroah-Hartman貌似正在度假中,因为SashaLevin2016年2月16日的...
- Linux发行版需要杀软吗?卡巴斯基推出免费KVRT病毒扫描清理工具
-
IT之家6月4日消息,你认为使用Linux发行版,需要杀毒软件吗?或许很多用户认为Linux发行版偏小众,因此受到黑客攻击的风险也相对较小,不过卡巴斯基并不这么认为,近期推出了适用于...
- 适合开发人员的 5款 Linux 发行版
-
什么是Linux?Linux是基于Unix的操作系统。由LinusTorvalds开发于1991年首次发布其内核。因为Linux是开源软件,其发行版由不同组织发布,因此不同的发行版具有不同的风格...
- VMware Workstation 17.0 Pro 发布:新增 TPM 2.0 完美兼容Win11
-
IT之家11月18日消息,VMwareWorkstation17.0Pro现已发布,它带来了许多新特性,例如微软Windows11硬性要求:虚拟可信平台模块(TPM)2.0。...
- 你是否需要一个容器专用的Linux发行版本?
-
单单使用容器是不够的,提供商们认为你需要一个容器专用的Linux发行版本。我们可以让容器在不同的操作系统上运行,不同的操作系统都有自己的虚拟化服务,如:SolarisZones、BSDJails、...
- Tizen 3.0版本发布 采用Linux 4.1内核
-
2015-09-2111:31:39作者:马荣【中关村在线软件资讯】9月21日消息:尽管三星靠着Android系统设备在移动市场赚钱,但是仍然没有忘记自家的Tizen开发。现在Tizen3.0版...
- 欧拉操作系统演进:应用累计超130万套 支持鲲鹏、英特尔、飞腾等芯片
-
21世纪经济报道记者倪雨晴深圳报道4月15日,在欧拉开发者大会(openEulerDeveloperDay2022)的主论坛上,欧拉首个数字基础设施全场景长周期版openEuler22.03...
- Papyros:以Material Design为灵感的Linux发行版本
-
项目团队并不希望只是采用传统的桌面主题,而是致敬谷歌Android系统的MaterialDesign设计语言想要打造出某些不同以往足够吸引用户的Linux发行版本,自然该版本还在不断的更新和改进中,...
- 比特网早报:全国空间计量技术委员会成立,银河麒麟操作系统上架微信Linux4.0.0版本
-
2024年11月6日消息,昨夜今晨,科技圈都发生了哪些大事?行业大咖抛出了哪些新的观点?比特网为您带来值得关注的科技资讯:全国空间计量技术委员会在北京成立近日,经市场监管总局批准,全国空间计量技术委员...
- 2024年最稳定的5个Linux发行版,赶紧收藏!
-
Linux是最流行的免费开源平台之一。Linux已被广泛使用,因为它安全、可扩展和灵活。Linux发行版收集开源代码,对其进行编译,并将其组合成一个可以轻松启动和安装的操作系统。它们还提供不同的...
- 彰显Linux生态繁华,Ubuntu、Fedora等四发行版同时发布新版本
-
上周对于开源社区来说是忙碌的一周。EndeavourOS和TrueNASScale于周二(4月16日)发布,Fedora于周三(4月17日)发布,Ubuntu于周四(4月18日)发布。四个新版本中都...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle忘记用户名密码 (59)
- oracle11gr2安装教程 (55)
- mybatis调用oracle存储过程 (67)
- oracle spool的用法 (57)
- oracle asm 磁盘管理 (67)
- 前端 设计模式 (64)
- 前端面试vue (56)
- linux格式化 (55)
- linux图形界面 (62)
- linux文件压缩 (75)
- Linux设置权限 (53)
- linux服务器配置 (62)
- mysql安装linux (71)
- linux启动命令 (59)
- 查看linux磁盘 (72)
- linux用户组 (74)
- linux多线程 (70)
- linux设备驱动 (53)
- linux自启动 (59)
- linux网络命令 (55)
- linux传文件 (60)
- linux打包文件 (58)
- linux查看数据库 (61)
- linux获取ip (64)
- linux进程通信 (63)