[OS/Linux] Linux核心参数:net.core.somaxconn(高并发场景核心参数)
0 序言
- 近期工作在搞压力测试,我负责开发维护的、基于
sring-cloud-gateway
的大数据网关微服务,其底层是基于spring-webflux
-->reactor-netty
-->netty
。 - 在压测过程中(200并发),发现大数据网关屡报ConnectException: finishConnect(..) failed: Connection refused错误。
Caused by: java.net.ConnectException: finishConnect(..) failed: Connection refused
at io.netty.channel.unix.Errors.newConnectException0(Errors.java:155) ~[netty-transport-native-unix-common-4.1.65.Final.jar!/:4.1.65.Final]
at io.netty.channel.unix.Errors.handleConnectErrno(Errors.java:128) ~[netty-transport-native-unix-common-4.1.65.Final.jar!/:4.1.65.Final]
at io.netty.channel.unix.Socket.finishConnect(Socket.java:278) ~[netty-transport-native-unix-common-4.1.65.Final.jar!/:4.1.65.Final]
at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.doFinishConnect(AbstractEpollChannel.java:710) [netty-transport-native-epoll-4.1.65.Final-linux-x86_64.jar!/:4.1.65.Final]
关键行:
io.netty.channel.unix.Socket.finishConnect(Socket.java:278) ~[netty-transport-native-unix-common-4.1.65.Final.jar!/:4.1.65.Final]
- 经过长时间、大量的分析(Debug spring-cloud-gateway 源码、观测服务所属主机资源),倾向于本微服务所属主机的
net.core.somaxconn
不足这种原因。
博主的做法:
128 --> 1024
1 参数定义
net.core.somaxconn
- Linux 操作系统全局参数,每个
TCP连接
监听端口的队列长度。
somaxconn
- INTEGER
- Limit of socket listen() backlog,在用户空间中称为 SOMAXCONN。
- 默认值为 4096。(在 linux-128.5 之前是 4)
- 另请参阅
tcp_max_syn_backlog
,了解TCP 套接字
的其他调整。
- 在
CentOS/RHEL
7.9 中,默认值为128
,对于高并发场景
都建议调大该值。
- 在RHEL 6和RHEL 7中,socket结构的
sk_max_ack_backlog
字段被定义为无符号短整型,它将值限制为16位,最大值为65535。- 在 RHEL 8 中,socket结构的
sk_max_ack_backlog
字段定义为 u32,它将值限制为 32 位,最大值为 2147483647。
2 查看方法
2.1 Linux
- 方法1
cat /proc/sys/net/core/somaxconn
- 方法2
sysctl -a | grep somaxconn
3 不同应用的配置建议
3.1 Oracle WebLogic Server
- 客户端数:设置
somaxconn
应至少设置为1024
,以 允许大量客户端服务器连接。
排队的数据包数:将
netdev_max_backlog
设置为至少32768
,以最大程度地减少数据包丢失。
3.2 Apache Zookeeper
Configurable listen socket backlog for the client port - issues.apache.org/zookeeper
在 Linux 上,以下参数: net.core.somaxconn
需要大于“客户端端口积压工作”以上才能正确配置侦听套接字积压工作
3.3 TiDB
https://blog.csdn.net/weixin_43700866/articTiDBle/details/125667286
内核参数 - pingcap.com
- 内核参数
检查各项内核参数的值:
…
`net.core.somaxconn: 32768`
3.4 Nginx
将 net.core.somaxconn
内核参数的值从其默认值 (128
) 增加到足以容纳大量流量突发的值。在此示例中,它增加到 4096
sudo sysctl -w net.core.somaxconn=4096
...
3.5 Netty
推荐文献
Caused by: io.netty.channel.ChannelException: Unable to create Channel from class class io.netty.channel.socket.nio.NioSocketChannel
...
优化建议
- 在面对高并发场景下时,应当适当增大
BACKLOG
的值,使端口可以同时建立更多的TCP请求 - 当服务的QPS不高,且服务端进程响应请求的时间较长时,可以适当减小BACKLOG的值,避免大量连接占据
系统内存资源
。 - 在设置
BACKLOG
参数时,还需要记得修改somaxconn
参数,若设置的BACKLOG
参数超过了系统somaxconn
参数的值时,则无法生效。
netty 源码
netty : 4.1.65
- 默认:
ChannelOption.SO_BACKLOG
=io.netty.util.NetUtil#SOMAXCONN
=/proc/sys/net/core/somaxconn
(Windows中默认值:200,Linux中默认值:128)
io.netty.util.NetUtil
SOMAXCONN
https://github.com/netty/netty/issues/4936
/proc/sys/net/core/somaxconn
io.netty.channel.epoll.EpollServerChannelConfig extends EpollChannelConfig implements ServerSocketChannelConfig
private volatile int backlog = NetUtil.SOMAXCONN;
D:/Program_Data/maven_repository/io/netty/netty-common/4.1.65.Final/netty-common-4.1.65.Final-sources.jar!/io/netty/util/NetUtil.java:134
io.netty.util.NetUtil#SOMAXCONN
static {
...
int somaxconn = PlatformDependent.isWindows() ? 200 : 128;
File file = new File("/proc/sys/net/core/somaxconn");
...
}
//io.netty.util.internal.logging.InternalLogger | 如何将 netty 日志开关打开?
如下是:
gateway-service
[Debug 源码分析] 以本地电脑(8 core cpu)在启动后的1次请求调用为例(与 somaxcon 无关,仅是记录;NioEventLoop 取决于 CPU 核数)
io.netty.bootstrap.Bootstrap#config
reactor.netty.resources.DefaultLoopResources#cacheNioServerLoops
D:/Program_Data/maven_repository/io/projectreactor/netty/reactor-netty/0.9.20.RELEASE/reactor-netty-0.9.20.RELEASE-sources.jar!/reactor/netty/resources/DefaultLoopResources.java:195
reactor.netty.resources.DefaultLoopResources#cacheNioServerLoops
watch reactor.netty.resources.DefaultLoopResources cacheNioServerLoops returnObj
io.netty.channel.nio.NioEventLoopGroup
io.netty.channel.nio.NioEventLoop
4 配置方法
4.1.临时生效
sysctl -w net.core.somaxconn=10240
4.2.永久生效
echo "net.core.somaxconn = 10240" >>/etc/sysctl.conf
sysctl -p
X 参考文献
- Linux net.core.somaxconn 参数详解 - CSDN 【推荐】
- Netty-源码学习(1)-BACKLOG参数 - 掘金 【推荐】
- netty client 连接超时设置 - 博客园 【不推荐/因无关】
/**
* *******************************************************************
* 如果不设置超时,连接会一直占用本地线程,端口,连接客户端一多,阻塞在那里,会导致本地端口用尽及CPU压力
*/
bootstrap.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000);
未设置超时:
30
io.netty.channel.ConnectTimeoutException: connection timed out: /192.168.1.1:8866
at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe$1.run(AbstractNioChannel.java:206)
at io.netty.util.concurrent.PromiseTask$RunnableAdapter.call(PromiseTask.java:38)
at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:123)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:354)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:353)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101)
at java.lang.Thread.run(Thread.java:745)
Process finished with exit code 0
设置后:
5
io.netty.channel.ConnectTimeoutException: connection timed out: /192.168.1.1:8866
at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe$1.run(AbstractNioChannel.java:206)
at io.netty.util.concurrent.PromiseTask$RunnableAdapter.call(PromiseTask.java:38)
at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:123)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:354)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:353)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101)
at java.lang.Thread.run(Thread.java:745)
Process finished with exit code 0
[OS/Linux] Linux核心参数:net.core.somaxconn(高并发场景核心参数)的更多相关文章
- linux中对socket的理解 socket高并发
1.socket是什么? 其实准确的来说,socket并不仅仅用于linux而已,它也应用于TCP/IP中.笼统的来说,socket就是指的“IP地址+端口号”.比如我有一个ssh服务器A,这时候我有 ...
- Linux下配置tomcat+apr+native应对高并发
摘要:在慢速网络上Tomcat线程数开到300以上的水平,不配APR,基本上300个线程狠快就会用满,以后的请求就只好等待.但是配上APR之后,Tomcat将以JNI的形式调用Apache HTTP服 ...
- (转)Linux下配置tomcat+apr+native应对高并发
摘要:在慢速网络上Tomcat线程数开到300以上的水平,不配APR,基本上300个线程狠快就会用满,以后的请求就只好等待.但是配上APR之后,Tomcat将以JNI的形式调用Apache HTTP服 ...
- [svc]高并发场景 LVS DR +KeepAlive高可用实现及ka的persistence_timeout参数
LVS-DR+keepalived模式是一种非常经典的常用生产组合 高可用场景及LVS架构 一般都用一(负载)拖多(Server Array)方式 使用LVS架设的服务器集群系统有三个部分组成: (1 ...
- LVS : Linux Virtual Server 负载均衡,集群,高并发,robust
1 LVS : Linux Virtual Server http://www.linuxvirtualserver.org/ http://www.linuxvirtualserver.org/zh ...
- linux系统多网卡热备实现高并发负载均衡
#nmcli实现bonding #先停止NetworkManagerservice NetworkManager stop chkconfig NetworkManager off //开机自启动 ...
- tomcat高并发优化的参数优化并查看tomcat线程数
在Tomcat配置文件conf下面 server.xml 中的配置中和连接数相关的参数有: minProcessors:最小空闲连接线程数,用于提高系统处理性能,默认值为10 maxProcessor ...
- net.core.somaxconn net.ipv4.tcp_max_syn_backlog
Linux参数-net.core.somaxconn与net.ipv4.tcp_max_syn_backlog_梁海江的博客-CSDN博客_net.ipv4.tcp_max_syn_backlog h ...
- Linux下解决高并发socket最大连接数所受的各种限制(解除IO限制)
linux作为服务器系统,当运行高并发TCP程序时,通常会出现连接建立到一定个数后不能再建立连接的情况 本人在工作时,测试高并发tcp程序(GPS服务器端程序),多次测试,发现每次连接建立到3800左 ...
- Linux系统优化实现高并发
ulimit -SHn 65535内核优化net.ipv4.ip_forward = 1 #开启路由功能net.ipv4.conf.default.rp_filter = 1 ...
随机推荐
- lc.59 螺旋矩阵 II
题目描述 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix . 示例 输入:n = 3 输出:[[1,2,3],[8,9, ...
- Windows下fmt库的链接与使用
下载源码. 使用mingw编译源码.注意设置cmake文件的产生路径.pkgconfig文件的产生路径(windows下用不到产生的pc文件).库的安装路径. make -j8 install. 新建 ...
- 发布jar包到远程仓库 (maven deploy)
背景: 项目有开放服务模块,现有个需求,需要把开放服务提供成一个jar包,用户可以直接对接. 流程: 1.在pom.xml文件添加distributionManagement节点,将项目打包上传到私服 ...
- NDVI批量处理排除值-3000
代码如下: import arcpy from arcpy import env from arcpy.sa import * import sys reload(sys) sys.setdefaul ...
- modbus通讯协议详解
1.Modbus 协议简介 Modbus协议是一种已广泛应用于当今工业控制领域的通用通讯协议.通过此协议,控制器相互之间.或控制器经由网络(如以太网)可以和其它设备之间进行通信.Modbus协议使用 ...
- 个人数据保全计划:(2) NAS基础知识
前言 距离去年国庆入手了NAS至今有好几个月时间了,NAS折腾起来有点麻烦,且实际作用因人而异,并没有想象中的好用,所以说好的这个系列一直没有更新~ 还有另一方面的原因,这些NAS的系统基于Linux ...
- TypeScript 学习笔记 — infer 类型推导、类型兼容 (九)
目录 1.ReturnType 返回值类型 2.Parameters 参数类型 3.InstanceType 实例类型 4.ConstructorParameters 构造函数参数类型 5.infer ...
- .NET应用系统的国际化-基于Roslyn抽取词条、更新代码
上篇文章我们介绍了 VUE+.NET应用系统的国际化-多语言词条服务 系统国际化改造整体设计思路如下: 提供一个工具,识别前后端代码中的中文,形成多语言词条,按语言.界面.模块统一管理多有的多语言词条 ...
- InnoDB 索引深入剖析
InnoDB页 将数据划分为若干个页(page),以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为 16KB.也就是在一般情况下,一次最少从磁盘中读取16KB的内容到内存中,一次最少 ...
- 逍遥自在学C语言 | 关系运算符
前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.构成和表示方式 关系运算符的作用是判断符号两边大小的关系 ...