linux高并发调优

1.修改Linux最大打开文件数

1.1 查看相关参数大小

查看修改前参数的大小

ulimit -n

在这里插入图片描述

查看当前系统当前用户打开的文件数量

lsof | wc -l
watch "lsof | wc -l"

在这里插入图片描述

查看某一进程的打开文件数量

lsof -p pid | wc -l
lsof -p 1 | wc -l

在这里插入图片描述

1.2 修改 limit 中 nofile 值

1.2.1 临时生效

该临时生效只可在当前终端内有效

ulimit -n 128000

在这里插入图片描述

1.2.2 永久生效

第一步:使用vim /etc/security/limits.conf编辑 limits.conf 文件,修改 nofile 值(其中 128000 即为修改的 nofile 值),如下所示:

vim /etc/security/limits.conf #进入文件编辑界面
* soft nofile 128000 
* hard nofile 128000  

其中’*'号表示修改所有用户的限制;soft或hard指定要修改软限制还是硬限制;128000则指定了想要修改的新的限制值,即最大打开文件数(请注意软限制值要小于或等于硬限制)。修改完后保存文件。

注:有的系统需把「*」替换为具体用户名才生效,例如root soft nofile 128000

第二步:修改/etc/pam.d/login文件,在文件中添加如下行:

# vim /etc/pam.d/login
session required /lib/security/pam_limits.so

这是告诉Linux在用户完成系统登录后,应该调用pam_limits.so模块来设置系统对该用户可使用的各种资源数量的最大限制(包括用户可打开的最大文件数限制),而pam_limits.so模块就会从/etc/security/limits.conf文件中读取配置来设置这些限制值。修改完后保存此文件。

第三步:查看Linux系统级的最大打开文件数限制,使用如下命令:

# cat/proc/sys/fs/file-max
200000

在这里插入图片描述

这表明这台Linux系统最多允许同时打开(即包含所有用户打开文件数总和)32568个文件,是Linux系统级硬限制,所有用户级的打开文件数限制都不应超过这个数值。

通常这个系统级硬限制是Linux系统在启动时根据系统硬件资源状况计算出来的最佳的最大同时打开文件数限制,如果没有特殊需要,不应该修改此限制,除非想为用户级打开文件数限制设置超过此限制的值。

查看单个进程打开文件句柄数上限。

# cat/proc/sys/fs/nr_open
1048576

在这里插入图片描述

这表明这台Linux系统单个进程打开文件句柄数上限。

修改这两硬限制的方法是修改/etc/sysctl.conf文件内fs.file-max 和 nr_open c参数,这是让Linux在启动完成后强行将系统级配置修改。修改完后保存此文件。

# vim /etc/sysctl.conf
fs.file-max=200000
fs.nr_open=1200000

第四步:重启系统,一般情况下就可以将Linux系统对指定用户的单一进程允许同时打开的最大文件数限制设为指定的数值。

如果重启后用ulimit-n命令查看用户可打开文件数限制仍然低于上述步骤中设置的最大值,这可能是因为在用户登录脚本/etc/profile中使用ulimit-n命令已经将用户可同时打开的文件数做了限制。

由于通过ulimit-n修改系统对用户可同时打开文件的最大数限制时,新修改的值只能小于或等于上次ulimit-n设置的值,因此想用此命令增大这个限制值是不可能的。

所以,如果有上述问题存在,就只能去打开/etc/profile脚本文件,在文件中查找是否使用了ulimit-n限制了用户可同时打开的最大文件数量,如果找到,则删除这行命令,或者将其设置的值改为合适的值,然后保存文件,用户退出并重新登录系统即可。

通过上述步骤,就为支持高并发TCP连接处理的通讯处理程序解除关于打开文件数量方面的系统限制。

2.修改内核TCP参数方面

Linux系统下,TCP连接断开后,会以TIME_WAIT状态保留一定的时间,然后才会释放端口。当并发请求过多的时候,就会产生大量的TIME_WAIT状态的连接,无法及时断开的话,会占用大量的端口资源和服务器资源。这个时候我们可以优化TCP的内核参数,来及时将TIME_WAIT状态的端口清理掉。

2.1 让系统更快的释放TIME_WAIT连接。

下面介绍的方法只对拥有大量TIME_WAIT状态的连接导致系统资源消耗有效,如果不是这种情况下,效果可能不明显。可以使用netstat命令去查TIME_WAIT状态的连接状态,输入下面的组合命令,查看当前TCP连接的状态和对应的连接数量:

# netstat-n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’

#这个命令会输出类似下面的结果:
LAST_ACK16
SYN_RECV348
ESTABLISHED70
FIN_WAIT1229
FIN_WAIT230
CLOSING33
TIME_WAIT18098

我们只用关心TIME_WAIT的个数,在这里可以看到,有18000多个TIME_WAIT,这样就占用了18000多个端口。要知道端口的数量只有65535个,占用一个少一个,会严重的影响到后继的新连接。这种情况下,我们就有必要调整下Linux的TCP内核参数,让系统更快的释放TIME_WAIT连接。

编辑配置文件 /etc/sysctl.conf,在这个文件中,加入下面的几行内容:

# vim /etc/sysctl.conf
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_tw_reuse= 1
net.ipv4.tcp_fin_timeout= 30
net.ipv4.ip_local_port_range= 1024 65535

输入下面的命令,让内核参数生效:

# sysctl -p

在这里插入图片描述

简单的说明上面的参数的含义:

net.ipv4.tcp_timestamps = 1
#时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。
#tw_reuse,tw_recycle 必须在客户端和服务端timestamps 开启时才管用(默认打开)
#net.ipv4.tcp_syncookies= 1(Ubuntu 22 不含有该参数)
#表示开启SYNCookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse= 1
#表示开启重用。允许将TIME-WAITsockets重新用于新的TCP连接,默认为0,表示关闭;
#net.ipv4.tcp_tw_recycle= 1(Ubuntu 22 不含有该参数)
#表示开启TCP连接中TIME-WAITsockets的快速回收,默认为0,表示关闭;
net.ipv4.tcp_fin_timeout
#修改系統默认的TIMEOUT 时间。
net.ipv4.ip_local_port_range= 1024 65535
#表示用于向外连接的端口范围。缺省情况下很小,改为1024到65535。

3.参考文献

[1]. segmentfault . Linux 服务器高并发调优实战 . 民工哥 . 2020.10

[2]. fanruan . Linux最大打开文件数 . doreen0813 . 2021-06-04

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值