[OS/Linux] Linux核心参数:net.core.somaxconn(高并发场景核心参数)

这篇具有很好参考价值的文章主要介绍了[OS/Linux] Linux核心参数:net.core.somaxconn(高并发场景核心参数)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0 序言

  • 近期工作在搞压力测试,我负责开发维护的、基于sring-cloud-gateway大数据网关微服务,其底层是基于spring-webflux-->reactor-netty-->netty
  • 在压测过程中(200并发-->1000并发),发现大数据网关屡报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

  • 环境信息
linux os : Alpine Linux 3.17.3 - 一个社区开发的、面向安全应用的、基于Musl libc和busybox的轻量级Linux发行版
    https://gitlab.alpinelinux.org/alpine/
    NAME="Alpine Linux"
    ID=alpine
    VERSION_ID=3.17.3
    PRETTY_NAME="Alpine Linux v3.17"
    HOME_URL="https://alpinelinux.org/"
    BUG_REPORT_URL="https://gitlab.alpinelinux.org/alpine/aports/-/issues"

spring-cloud-gateway:2.2.9.RELEASE
spring-cloud-starter:2.2.9.RELEASE
spring-cloud-alibaba:2.2.7.RELEASE
spring-cloud:Hoxton.SR12
spring-boot:2.3.12.RELEASE
spring:5.2.15.RELEASE

1 参数定义

  • net.core.somaxconn
  • Linux 操作系统全局参数,每个 TCP连接 监听端口的队列长度
  • 官方定义: TCP variables : somaxconn - Linux Kernel

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

[OS/Linux] Linux核心参数:net.core.somaxconn(高并发场景核心参数)

3 不同应用的配置建议

3.1 Oracle WebLogic Server

https://docs.oracle.com/communications/E96856-01/doc.74/e96850/installing-and-configuring-weblogic-server-cluster1.htm#OSMIG-GUID-87BEF43B-4673-4062-8451-228E436D421D

  • 客户端数:设置 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

Tuning the Operating System - Nginx.com

net.core.somaxconn 内核参数的值从其默认值 (128) 增加到足以容纳大量流量突发的值。在此示例中,它增加到 4096

sudo sysctl -w net.core.somaxconn=4096
...

[OS/Linux] Linux核心参数:net.core.somaxconn(高并发场景核心参数)

3.5 Netty

推荐文献

  • NetUtil can prevent using Netty due to SecurityManager denial - github/netty 【推荐】
Caused by: io.netty.channel.ChannelException: Unable to create Channel from class class io.netty.channel.socket.nio.NioSocketChannel
...
  • Netty-源码学习(1)-BACKLOG参数 - 掘金 【推荐】

优化建议

  • 默认情况下,Netty 的SO_BACKLOG的值等于操作系统的somaxconn的值
ChannelOption.SO_BACKLOG` = `io.netty.util.NetUtil#SOMAXCONN
  • 在面对高并发场景下时,应当适当增大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 日志开关打开?

[OS/Linux] Linux核心参数:net.core.somaxconn(高并发场景核心参数)

如下是: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

[OS/Linux] Linux核心参数:net.core.somaxconn(高并发场景核心参数)
[OS/Linux] Linux核心参数:net.core.somaxconn(高并发场景核心参数)文章来源地址https://www.toymoban.com/news/detail-440415.html

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

X 推荐文献

  • Netty ChannelOption.SO_BACKLOG配置 - CSDN

到了这里,关于[OS/Linux] Linux核心参数:net.core.somaxconn(高并发场景核心参数)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 从程序员到架构师:大数据量、缓存、高并发、微服务、多团队协同等核心场景实战书籍

    相信大家都对未来的职业发展有着憧憬和规划,要做架构师、要做技术总监、要做CTO。对于如何实现自己的职业规划也都信心满满,努力工作、好好学习、不断提升自己。 相信成为一名优秀的架构师是很多程序员的目标,架构师的工作包罗万象,从开发基础框架到设计软件架

    2024年02月05日
    浏览(45)
  • 【送书福利-第四期】从程序员到架构师:大数据量、缓存、高并发、微服务、多团队协同等核心场景实战书籍

    大家好,我是洲洲,欢迎关注,一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大家在CSDN后台私信我! 今天给大家介绍一本好书:从程序员到架构师 大数据量 缓存 高并发 微服务

    2024年02月06日
    浏览(72)
  • ASP.NET Core MVC通过IActionFilter.OnActionExecuting方法,获取Controller的Action方法参数值

    用过ASP.NET Core MVC中IActionFilter拦截器的开发人员,都知道这是一个非常强大的MVC拦截器。最近才发现IActionFilter的OnActionExecuting方法,甚至可以获取Controller的Action方法参数值。 假如我们在ASP.NET Core MVC项目中有一个HomeController,其中有一个Action方法叫Login,该方法有一个LoginRequ

    2023年04月21日
    浏览(57)
  • ASP.NET Core MVC中的IActionFilter.OnActionExecuting方法,可以获取Controller的Action方法参数值

    用过ASP.NET Core MVC中IActionFilter拦截器的开发人员,都知道这是一个非常强大的MVC拦截器。最近才发现IActionFilter的OnActionExecuting方法,甚至可以获取Controller的Action方法参数值。 假如我们在ASP.NET Core MVC项目中有一个HomeController,其中有一个Action方法叫Login,该方法有一个LoginRequ

    2023年04月20日
    浏览(68)
  • .net core 项目部署linux系统全过程

      使用Xshell远程连接阿里云服务器 - 程序员大本营 使用Xshell远程连接阿里云服务器,程序员大本营,技术文章内容聚合第一站。 https://www.pianshen.com/article/2750375233/      配置完之后 绑定密钥对。   保存密钥文件到桌面。   家庭/学校免费 - NetSarang Website https://www.xshell.com/z

    2024年02月05日
    浏览(40)
  • asp.net core webapi接收application/x-www-form-urlencoded和form-data参数

    框架:asp.net core webapi asp.net core webapi接收参数,请求变量设置 Post ([FromForm]TokenRequestInput user) 可以接收发送类型为multipart/form-data、application/x-www-form-urlencoded的数据 请求地址 http://localhost:5170/api/User/GetToken?code=22222 IFormFile file这个参数是接收文件,mimeType=multipart/form-data 参数use

    2024年04月15日
    浏览(37)
  • 将 .net core 项目部署到 Linux服务器

    目录 1、前言 2、安装 .NET SDK 或 .NET 运行时 3、创建数据库 4、发布项目到Linux环境 5、配置Nigix 6、Nginx配置Https 7、安装Supervisor 1、前言 部署服务器:阿里云的CentOS 7.6 64位 发布项目:.Net Core 5.0 数据库:MySql 5.8  其他:Nginx,Supervisor 2、安装 .NET SDK 或 .NET 运行时 参考官网网址

    2024年02月04日
    浏览(54)
  • .net core控制台应用程序在linux运行

    1)创建.net 6.0控制台应用程序 2)在应用根目录执行cmd命令发布应用:dotnet publish -o .deploy 3)将发布文件上传到服务器    4)运行控制台应用程序(dotnet /home/app/ConsoleApp/ConsoleApp5.dll) 5)如果需要定时执行,可以添加sh文件 参考:linux定时备份(删除)mysql_linux数据库定时备

    2024年02月16日
    浏览(55)
  • 如何部署ASP.NET Core到Linux服务器

    我们开发的最终目的,是将开发后的东西发布网络上,以便自己及其他人使用。 本篇博客介绍如果在 linux 上部署 ASP.NET Core应用,使用nginx+systemd 来管理我们的应用。 Ubuntu 20.04 Nginx .NET SDK 或 Runtime 安装Nginx 安装.NET 配置文件 nginx默认配置会加载 /etc/nginx/sites-enabled 中的网站,

    2024年02月11日
    浏览(41)
  • linux 服务器利用宝塔面板部署.net 6(.net core)服务端程序图文步骤

    随着.net core 跨平台技术的兴起,微软.net拥抱云原生,支持跨平台,可以使基于.net core技术的服务端程序轻松移植到基于Linux的云服务器上,本文以图文的方式介绍如何利用阿里云轻量应用服务器安装宝塔面板部署基于.net core的后端服务器接口程序并正常运行。 步骤 准备一台

    2024年02月14日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包