百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Linux下各种连接数配置及高并发Nginx优化

off999 2025-01-16 20:30 27 浏览 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


相关推荐

模拟器安卓版(ios模拟器安卓版)
  • 模拟器安卓版(ios模拟器安卓版)
  • 模拟器安卓版(ios模拟器安卓版)
  • 模拟器安卓版(ios模拟器安卓版)
  • 模拟器安卓版(ios模拟器安卓版)
移动硬盘强制格式化(移动硬盘强制格式化工具)

格式化移动硬盘可以通过以下步骤进行格式化:a)按Win+R唤醒运行面板,输入“diskmgmt.msc”,并按下回车键。b)找到移动硬盘对应的磁盘卷标,右键点击该磁盘卷标,然后点击“格式化”选项。...

电脑显卡在哪看(电脑显卡在哪看win10)
电脑显卡在哪看(电脑显卡在哪看win10)

在电脑上桌面中查看显卡:如果我们电脑使用的是独立显卡,显卡位置是在机箱内主板的显卡插口上;而如果我们的电脑是集成显卡的话,那么显卡的位置就在主板上,是和CPU在一起封装的。在电脑上桌面中查看显卡:可以通过桌面的我的电脑右键,点击设备管理器,...

2026-01-05 18:51 off999

tmp是什么意思(tmp的含义)

TPM(TrustedPlatformModule)安全芯片,是指符合TPM(可信赖平台模块)标准的安全芯片,它能有效地保护PC、防止非法用户访问。为了数据安全的考虑,不少笔记本都集成了安全芯片...

u盘分区工具中文版(u盘 分区表)

可以,只要是连接电脑的磁盘设备都能找到看在什么系统下做的,我以前在win7下做的,但是怎么弄都不成功,最后在xp系统下才做成了,还有就是,大白菜是一键傻瓜式的pe优盘制作工具,点击一键制作为pe启动盘...

tplink路由器wan口未连接(tp-link wan口未连接)

第一步,在新的天翼网关中关闭WIFI第二步,用一根跳线连接无线路由器,网关接到无线路由器的WAN口,然后电脑的网线可以插到无线路由器的LAN口,第三步,设置你的无线路由,如果你的网关是192.168....

华为路由器wifi6(华为路由器wifi6上不了网)

华为WiFi6路由器的设置步骤如下:1.首先,将电缆连接到WAN端口并插入网络电缆。将路由器插头插入电源插座,并打开电源开关。2.手机或电脑连接华为路由器的Wi-Fi热点,输入Wi...

主板品牌型号(主板品牌型号价格)

华硕第一(不过它的低端主板质量很差,返修率高)技嘉第二(我的主板就是技嘉的。。安全运行5年多一直没坏)微星第三(这个我不太熟悉,不过我朋友用的是微星。。也是很耐用很不错)还有EVGA主板(是美...

下载安装支付宝(苹果手机怎么下载安装支付宝)

1、首先在手机桌面上点击打开“软件商店”应用程序。2、然后在“软件商店”应用程序的搜索栏内输入“支付宝”,然后在搜索出来的选项中点击选择“支付宝”选项。3、接着在此页面可看见下载选项,然后点击下载,等...

驱动人生下载限速解除(驱动人生限速解除最简单方法)

可以设置双工模式试试:在桌面右键网上邻居,单击属性,跳出对话框,再右键本地连接,单击属性,在跳出的对话框中单击配置选项卡,再单击高级选项,在属性对话框中选中“连接速度和双工模式,”在右面值的对话框中选...

电脑运行慢换什么配件(电脑特别慢换什么硬件)

  要提高电脑游戏性能,应提升cpu、内存、显卡的配置,硬盘也是系统的一个瓶颈,因此升级建议如下:  1、cpu可升级为翼龙2四核x495595wTDP功耗;  2、内存可添加2Gddr3...

免费的微信数据恢复软件(免费的微信数据恢复软件下载)

可靠,微信数据恢复管家是一款非常好用的数据恢复软件,用户们能够在这里自由的恢复手机中的数据,包括了各种微信聊天数据、图片、短视频等等,非常的可靠。可靠。微信聊天记录恢复软件是真的。 有备份:...

windowsinstaller重装(window 重装)

原因:安装的版本起了冲突。1、测试时候电脑已安装office2016-zh-cn,准备安装visio2016。先右键点击visio2016版本,选择管理员模式进行安装。2、安装时候就会提示各种问题...

iso镜像如何安装win7(iso镜像安装教程)

可采用以下两种方法:方法1,进入BIOS,关闭SecureBoot,启动CSM或者是选择LACY引导。用U盘带的分区工具,以MBR模式进行分区,把你的WIN7镜像GHOST到活动分区。不过你的WIN...

win7模拟器破解版(win7模拟器.apk)

启动模拟器之后,找到设置图标点击进入。2点击显示。3取消自动旋转屏幕的勾选。因为在电脑上使用android模拟器,不存在自动旋转屏幕的效果的模拟,所以这个功能对于模拟器是什么用的。而且如果模拟...

取消回复欢迎 发表评论: