linux 高并发内核调优

注意:
在/etc/sysctl.conf 修改的,可以使用sysctl -p 立即生效,使用sysctl -a 查看当前数值。

在/etc/security/limits.conf 修改的,需要重启服务或系统才能生效,或者用ulimit 单独去配置。

最大文件打开句柄数量 - max open files
Linux 下一切皆文件,一般如果遇到文件句柄达到上限时,会碰到”Too many open files”或者Socket/File: Can’t open so many files等错误。

在 linux 中,每个连接都会占用一个文件句柄,所以句柄数量限制同样也会限制最大连接数, 对于像 Nginx 这样的反向代理,对于每个请求,它会与 client 和 upstream server 分别建立一个连接,即占据两个文件句柄,所以理论上来说 Nginx 能同时处理的连接数最多是系统最大文件句柄数限制的一半。

lsof | wc -l

可以查看当前打开文件的数量

系统级和进程级限制、异步 I/O 操作的最大数目
vim /etc/sysctl.conf
fs.file-max = 9223372036854775807
fs.nr_open = 1073741816
fs.aio-max-nr = 1048576
sysctl -p

应用

cat /proc/sys/fs/file-max

查看实时

用户级限制
vim /etc/security/limits.conf

  • soft nofile 1024000
  • hard nofile 1024000
    ulimit -a

需要重启生效

Systemd限制

vim /etc/systemd/system.conf

DefaultLimitCORE=infinity
DefaultLimitNOFILE=1024000
DefaultLimitNPROC=1024000

vim /etc/systemd/user.conf

DefaultLimitCORE=infinity
DefaultLimitNOFILE=1024000
DefaultLimitNPROC=1024000

systemctl daemon-reload

最终还需要重启服务。

消息队列大小

vim /etc/sysctl.conf
kernel.msgmnb = 65536

单个消息队列中单个消息的最大允许大小(以字节为单位)

kernel.msgmax = 65536

用于指定从一个进程发送到另一个进程的消息的最大长度

kernel.shmmax = 18446744073692774399

定义 Linux 进程在其虚拟地址空间中可分配的单个共享内存段的最大字节大小。

kernel.shmall = 18446744073692774399

定义可用于系统范围的共享内存页面总数。要使用整个主内存,kernel.shmall 参数的值应当为主内存大小总计。

最大用户进程

vim /etc/security/limits.conf

  • soft nproc 127671
  • hard nproc 127671
    ulimit -a
    虚拟内存大小 - vm.max_map_count
    限制一个进程可以拥有的VMA(虚拟内存区域)的数量,常用于 ES集群。

vim /etc/sysctl.conf
vm.max_map_count=655360
sysctl -p
sysctl -a|grep vm.max_map_count
调整stack size的大小
Linux系统初始的堆栈大小

vim /etc/security/limits.conf

  • soft stack 262140
  • hard stack 262140
    网络相关
    调整网络设备积压队列以避免数据包丢弃

vim /etc/sysctl.conf
net.core.netdev_max_backlog = 25000
TCP TIME_WAIT 连接复用开启
如果短连接并发量较高,它所在 netns 中 TIME_WAIT 状态的连接就比较多,而 TIME_WAIT 连接默认要等 2MSL 时长才释放,长时间占用源端口,当这种状态连接数量累积到超过一定量之后可能会导致无法新建连接。

所以建议开启 TIME_WAIT 复用,即允许将 TIME_WAIT 连接重新用于新的 TCP 连接:

vim /etc/sysctl.conf
net.ipv4.tcp_tw_reuse=1
套字节接受和发送缓冲区

vim /etc/sysctl.conf
net.core.rmem_default=26214400
net.core.wmem_default=26214400
net.core.rmem_max=26214400
net.core.wmem_max=26214400
TCP 接受和发送缓冲区 最低/默认/最大

vim /etc/sysctl.conf
net.ipv4.tcp_rmem=16384 26214400 26214400
net.ipv4.tcp_wmem=32768 26214400 26214400
TCP窗口大小

vim /etc/sysctl.conf
net.ipv4.tcp_window_scaling=1

TCP 窗口大小缩放

调大TCP全连接连接队列的大小

vim /etc/sysctl.conf
net.core.somaxconn=65535
UDP 接受和发送缓冲区
UDP socket 的发送和接收缓冲区是有上限的,如果缓冲区较小,高并发环境可能导致缓冲区满而丢包,从网络计数可以看出来:

vim /etc/sysctl.conf
net.ipv4.udp_mem=374394 26214400 26214400
TCP BBR - 高延迟/高丢包网络优化
介绍文章: https://songxwn.com/TCP_BBR/

vim /etc/sysctl.conf
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr

需要内核4.9以上,BBRv3 需要安装较新的Xanmod内核。

TCP/UDP本地端口新建范围
高并发场景,对于 client 来说会使用大量源端口,源端口范围从 net.ipv4.ip_local_port_range 这个内核参数中定义的区间随机选取,在高并发环境下,端口范围小容易导致源端口耗尽,使得部分连接异常。通常 Pod 源端口范围默认是 32768-60999,建议将其扩大.

vim /etc/sysctl.conf
net.ipv4.ip_local_port_range = 15000 64000

默认是32768 60999 ,注意不要和已有端口冲突。

net.netfilter.nf_conntrack_max 用于控制连接跟踪表的最大大小
.net.netfilter.nf_conntrack_max不是越高越好,通常根据内存大小进行设置。
nf_conntrack_max计算公式(64位)
CONNTRACK_MAX = RAMSIZE (inbytes)/16384/2

例如你的机器是一个64GB 64bit的系统,那么最合适的值是

CONNTRACK_MAX = 6410241024*1024/16384/2 = 2097152

vim /etc/sysctl.conf
net.netfilter.nf_conntrack_max = 1048576
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_established = 3600
net.nf_conntrack_max = 1048576
最终推荐参数
sysctl

cat > /etc/sysctl.conf <<EOF
fs.file-max = 9223372036854775807
fs.nr_open = 1073741816
kernel.msgmnb = 65536
kernel.msgmax = 65536
vm.max_map_count=655360
net.core.netdev_max_backlog = 25000
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_rmem=16384 26214400 26214400
net.ipv4.tcp_wmem=32768 26214400 26214400
net.ipv4.tcp_window_scaling=1
net.core.somaxconn=65535
net.core.rmem_default=26214400
net.core.wmem_default=26214400
net.core.rmem_max=26214400
net.core.wmem_max=26214400
net.ipv4.udp_mem=374394 26214400 26214400
net.ipv4.ip_local_port_range=15000 64000
EOF

配置

sysctl -p

ulimit

cat > /etc/security/limits.conf <<EOF

  • soft nofile 1024000
  • hard nofile 1024000
  • soft nproc 127671
  • hard nproc 127671
  • soft stack 262140
  • hard stack 262140
    EOF

需要重启系统/进程/重新登录才能生效。

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值