本文详解高并发场景下backlog的配置和作用

TCP listen backlog 参数深度解析:从默认值 5 到高并发场景的 3 种调优策略 本文深入解析TCP协议中`listen`函数的`backlog`参数,揭示其在高并发场景下的关键作用。通过实验数据和性能对比,详细介绍了全连接队列与半连接队列的工作原理,并针对短连接服务、长连接服务和防御SYN Flood攻击三种典型场景,提供了具体的调优策略和配置示例,帮助开发者优化服务器性能。 阅读详情

 

 

环境介绍: PHP 7.3.5 +nginx/1.16.0 +Linux VM_0_15_centos 3.10.0-514.26.2.el7.x86_64

 

backlog定义:

 

已连接但未进行accept处理的SOCKET队列大小,并非syn的SOCKET队列。如果这个队列满了,将会发送一个ECONNREFUSED错误信息给到客户端,即 linux 头文件 /usr/include/asm-generic/errno.h中定义的“Connection refused”

 

在linux 2.2以前:

在底层维护一个由backlog指定大小的队列。服务端收到SYN后,返回一个SYN/ACK,并把连接放入队列中,此时这个连接的状态是SYN_RECEIVED。当客户端返回ACK后,此连接的状态变为ESTABLISHED。队列中只有ESTABLISHED状态的连接能够交由应用处理。第一种实现方式可以简单概括为:一个队列,两种状态。

 

linux 2.2以后:

在底层维护一个SYN_RECEIVED队列和一个ESTABLISHED队列,当SYN_RECEIVED队列中的连接返回ACK后,将被移动到ESTABLISHED队列中。backlog指的是ESTABLISHED队列的大小。SYN_RECEIVED队列的大小由/proc/sys/net/ipv4/tcp_max_syn_backlog系统参数指定,ESTABLISHED队列由backlog和/proc/sys/net/core/somaxconn中较小的指定。

 

当前最流行的DoS(拒绝服务)与DDos(分布式拒绝服务)的方式之一,这是一种利用TCP协议缺陷,导致服务器保持大量的SYN_RECV状态的“半链接”,并且会重试默认的5次回应第二个握手包,塞满TCP等待连接队列,耗尽资源(CPU满负载或内存不足),让正常的业务请求连接不进来。

 

TCP 3次握手
可分为4步

1 客户端发起connect(),发送SYN j
2 服务器从半链接队列(syn queue)中建立条目,响应SYN k, ACK J+1
3 客户端connect()成功返回,响应ACK K+1,服务器将socket从半链接队列(syn queue)移入全连接队列(accept queue),accept()成功返回
如何观察socket overflow 和 socket droped。

如果应用处理全连接队列(accept queue)过慢则会导致socket overflow

影响半连接队列(syn queue)溢出而导致socket dropped

[root@VM_0_15_centos ~]# netstat -s | grep -i listen    
62678 times the listen queue of a socket overflowed
65640 SYNs to LISTEN sockets dropped
如果SYN socket overflow和socket droped急剧增加的话则说明,TCP的三次握手是存在很大的问题的。

验证

查看全连接队列(accept queue)溢出之后,OS处理设置:

0:表示如果三次握手第三步的时候全连接队列满了那么server扔掉client发过来的ack(在server端则会认为连接没有建立起来),server过一段时间再次发送syn+ack给client(也就是重新走握手的第二步),如果client超时等待比较短,client就很容易异常了。

1:表示如果三次握手第三步的时候全连接队列满了,server端就会发送一个reset包给client端,表示废弃这个握手过程和这个链接。(在server端也会认为连接没有建立起来)

cat /proc/sys/net/ipv4/tcp_abort_on_overflow

设置tcp_abort_on_overflow为1

echo 1 > /proc/sys/net/ipv4/tcp_abort_on_overflow

查看server端的web服务是否存在许多的connection reset peer错误。

​

 

在使用listen函数时,内核会根据传入参数的backlog跟系统配置参数/proc/sys/net/core/somaxconn中,二者取最小值,作为“ESTABLISHED状态之后,完成TCP连接,等待服务程序ACCEPT”的队列大小。在kernel 2.4.25之前,是写死在代码常量SOMAXCONN,默认值是128。在kernel 2.4.25之后,在配置文件/proc/sys/net/core/somaxconn (即 /etc/sysctl.conf 之类 )中可以修改。

[root@VM_0_15_centos ~]# cat /proc/sys/net/core/somaxconn
32768
[root@VM_0_15_centos ~]# cat /usr/local/php/etc/php-fpm.conf |grep backlog
listen.backlog = 1024
[root@VM_0_15_centos ~]# ss -ln |grep -E 'php|Netid'
Netid  State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
u_str  LISTEN     0      1024   /dev/shm/php-cgi.sock 79785144              * 0
 

可见: 内核会根据传入参数的backlog跟系统配置参数/proc/sys/net/core/somaxconn中,二者取最小值

我这里php-fpm 配置的 listen = /dev/shm/php-cgi.sock ,如果你配置的 tcp监听9000,应该用如下命令验证

[root@VM_0_15_centos ~]# ss -lt
State      Recv-Q Send-Q Local Address:Port             Peer Address:Port                
LISTEN     0      1024   0.0.0.0:9000               *:*
 

backlog大小设置为多少合适?

 

1、backlog太大了,导致php-fpm处理不过来,nginx那边等待超时,断开连接,报504 gateway timeout错。同时php-fpm处理完准备write 数据给nginx时,发现TCP连接断开了,报“Broken pipe”。

2、php-fpm的backlog太小的话,nginx之类的client请求,根本进入不了php-fpm的accept queue,报“502 Bad Gateway”错。所以,这还得去根据php-fpm的QPS来决定backlog的大小。计算方式最好为QPS=backlog。建议设置在1024以上,最好是2的幂值(因为内核会调整成2的n次幂)

 

SYN queue长度由tcp_max_syn_backlog指定,accept queue则由net.core.somaxconn决定,listen(fd, backlog)的backlog上限由somaxconn决定.


 

php-fpm下backlog配置

php-fpm.conf进行配置

listen.backlog = 1024  默认值是 511 ,是在2014年7月22日修改的, Set FPM_BACKLOG_DEFAULT to 511
 

其中理由是“backlog值为65535太大了。会导致前面的nginx(或者其他客户端)超时”,假设FPM的QPS为5000,那么65535个请求全部处理完需要13s的样子。但nginx(或其他客户端)已经等待超时,关闭了这个连接。当FPM处理完之后,再往这个SOCKET ID 写数据时,却发现连接已关闭,得到的是“error: Broken Pipe”,在nginx、redis、apache里,默认的backlog值都是511。故这里也建议改为511。

 

 

nginx下backlog配置

/etc/nginx/nginx.conf进行配置

 

listen       80 backlog=8192; # 默认为511
 

linux下backlog配置

 

/etc/sysctl.conf 进行配置

 

net.core.somaxconn = 1048576 # 默认为128
net.core.netdev_max_backlog = 1048576 # 默认为1000
net.ipv4.tcp_max_syn_backlog = 1048576 # 默认为1024
 
 

Netty核心参数调优实战:从线上事故到高并发场景配置指南 在高性能网络编程中,参数调优是保障系统稳定性和性能的关键环节。Netty作为Java领域广泛应用的异步事件驱动框架,其底层基于Reactor多线程模型和零拷贝技术,通过精细化的参数配置可以实现高效的连接管理和内存利用。理解Netty的核心参数原理,能够帮助开发者在高并发场景下避免连接队列积压、内存泄漏等典型问题,从而提升系统的吞吐量和可靠性。本文聚焦于Netty的SO_BACKLOG和WRITE_BUFFER_WATER_MARK等关键参数,结合线上事故案例,深入解析其在高并发推送服务、RPC服务等不同应用 阅读详情

相关推荐

用户故事驱动的敏捷开发 – 2. 创建backlog

本系列的第一篇【用户故事驱动的敏捷开发 – 1. 规划篇】跟大家分享了如何使用用户故事来帮助团队创建需求的过程,在这一篇中,我们来看看如何使用这些用户故事和功能点形成产品backlog。产品backlog是敏捷开发中用来管理需求列表,排定优先级,形成迭代计划,组织开发/测试和交付过程的工具。可以说,产品backlog是一个敏捷团队管理开发过程的核心,所有的活动和交付物都围绕backlog来进行。一

徐磊 - 新浪微博@北京的201个蓝天 1万+

backlog配置_Linux Centos7 初始化配置脚本

安装Linux 操作系统之后,一般都会进行一个简单的初始化配置。我的这个脚本,一般是适合自己的一个配置,跟大家分享一下,具体个人的情况可以参考下面一些简单的介绍来进行修改。#!/bin/bashif [ -n "$1" ] || [ -n "$2" ]then idelse echo "Usage: ./centosinit.sh newhostname whatfor" exi...

weixin_34331737的博客 268

linux内核协议栈 listen 系统调用

目录 1. listen功能概述 2. TCP监听套接字的管理listening_hash 3. listen内核实现 3.1 sys_listen() 3.1 inet_listen() 3.2 inet_csk_listen_start() 3.2.1 创建连接请求队列 request_sock_queue(核心) 3.2.2 注册监听套接字到TCP全局监听hash表(核心) 1. listen功能概述 创建传入的backlog创建请求队列:半连接队列,全连接队列 将套接字的状..

1589

理解 Linux backlog/somaxconn 内核参数

即半连接队列长度 = min(backlog, 内核参数 net.core.somaxconn,内核参数 tcp_max_syn_backlog)。如果 backlog 大于内核参数 net.core.somaxconn,则以 net.core.somaxconn 为准,即全连接队列长度 = min(backlog, 内核参数 net.core.somaxconn),net.core.somaxconn 默认为 128。对于一个经常处理新连接的高负载 web服务环境来说,默认的 128 太小了。

HSJ0170的博客 507

ego-planner启动参数深度解析:从配置到实战避障应用

本文深入解析EGO-Planner启动参数的配置与实战应用,重点探讨无人机自主导航中的避障性能优化。通过环境感知、运动约束和算法控制三类参数的详细说明,结合ROS和RViz工具,提供从基础配置到高级调优的完整指南,帮助开发者提升无人机在复杂场景下的规划效率和安全性。

rum55的博客 246

从数学到机床:RTCP背后的几何变换与工业实现

本文深入解析RTCP(Rotary Tool Center Point)技术在五轴数控加工中的核心作用,通过几何变换与运动学原理实现刀尖点跟随,确保加工精度。从数学基础到工业实现,详细探讨了算法架构、机床结构适配及精度保障方法,为数控系统开发和高效加工提供关键技术支撑。

jump7的博客 258

博文推荐|Apache Pulsar 客户端应用程序最佳实践

本文翻译自 StreamNative 博客《Apache Pulsar Client Application Best Practices》,作者 Ioannis Polyzos。译者简介何城波,就职于深信服 PaaS 平台部门,从事 Kafka、Pulsar 等消息中间件基础设施建设。本篇博文将深入分析 Apache Pulsar 生产者和消费者的内部细节,列举一些应用...

Apache Pulsar 1247

图自编码器(GAE)与变分图自编码器(VGAE)

在学习图自编码器之前先了解一下自编码器与变分自编码器。

小鱼的小窝 1万+

backlog配置_详解linux中的backlog

什么是backlogbacklog是linux下socket函数之listen的参数,当应用程序调用listen系统调用让一个socket进入LISTEN状态时,需要指定一个backlog参数。这个参数经常被描述为,新连接队列的长度限制。由于TCP建立连接需要进行3次握手,一个新连接在到达ESTABLISHED状态可以被accept系统调用返回给应用程序前,必须经过一个中间状态SYN RECEIV...

weixin_39548733的博客 1974

基于MATLAB的井筒多相流模拟

井筒多相流的模拟可以基于不同的数学模型和计算方法。其中,最常用的模型之一是多相流模型,它基于质量守恒、动量守恒和能量守恒等原理,描述了流体在井筒中的流动行为。对于井筒多相流的模拟和分析可以帮助我们理解和优化油气田开发过程中的流体行为,从而提高产量和效率。在本文中,我们将介绍如何使用MATLAB进行井筒多相流的模拟,并提供相应的源代码。需要注意的是,以上示例是一个简化的模拟,仅用于演示如何使用MATLAB进行井筒多相流模拟。实际应用中,我们需要考虑更多的物理过程和参数,并使用更复杂的数值方法和模型进行模拟。

AtdiHtml的博客 706

《网络摄像机实战⑦:嵌入式端AWS KVS IoT SDK 库编译与测试全流程-君正/瑞芯微/全志(超详细指南)》

本文介绍了AWS音视频和物联网解决方案的核心组件与集成方法。主要内容包括:1)Amazon Kinesis Video Streams(KVS)提供的WebRTC托管服务,支持实时音视频流传输与双向交互;2)AWS IoT云服务实现设备连接与集成;3)详细说明了KVS WebRTC库的编译过程,包括源代码下载、CMake配置和依赖库生成;4)KVS Producer库的集成方法,重点阐述了存储空间调整和mbedtls版本适配等关键修改点。文章为开发者提供了AWS音视频和物联网服务的技术实现指南,特别针对嵌入

lvj_158的专栏 109

如何配置PHP-FPM以实现高并发性能?

PHP-FPM(PHP FastCGI Process Manager)是一个PHP FastCGI 管理器,它对于高负载环境特别有用。为了实现高并发性能,你需要调整几个关键的配置项。

长风破浪会有时的博客 57

【某音电商】protobuf聊天协议逆向

某音电商私信、聊天消息protobuf协议逆向分析与解析

吴秋霖的博客 2315

高并发场景下backlog详解

参考:https://www.phpmianshi.com/?id=96 本文详解高并发场景下backlog的配置和作用 环境介绍: PHP 7.3.5 +nginx/1.16.0 +Linux VM_0_15_centos 3.10.0-514.26.2.el7.x86_64 backlog定义: 已连接但未进行accept处理的SOCKET队列大小,并非syn的SOCKET队列。如果这个队列满了,将会发送一个ECONNREFUSED错误信息给到客户端,即 linux 头文...

tiancityycf的专栏 2462

DeepLens是一个用于计算镜头设计的可微光线追踪器

若安装过程中遇到网络问题导致安装失败,可尝试更换pip源,例如使用国内的镜像源,修改pip配置文件(Windows系统在。

max500600的博客 1142

【零基础学习CAPL】——CAN报文的发送(CRC——ChecSum值)

本章主要介绍带有CRC值的报文发送一般报文可使用CANoe的IG模块直接发送,但带有CRC值的报文就只能编写脚本进行发送,以下详细讲解在配合Panel面板情况下,如何进行带有循环冗余码的报文进行报文的发送。

LOVE135149的博客 1913

php backlog,高并发场景下backlog详解

参考:https://www.phpmianshi.com/?id=96本文详解高并发场景下backlog的配置和作用环境介绍: PHP 7.3.5 +nginx/1.16.0 +Linux VM_0_15_centos 3.10.0-514.26.2.el7.x86_64backlog定义:已连接但未进行accept处理的SOCKET队列大小,并非syn的SOCKET队列。如果这个队列满了,将会...

weixin_30205357的博客 583

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

php设置backlog,高并发调优backlog多大合适?

么对于nginx,对于php-fpm,backlog应该设置多大,是越大越好吗?backlog怎么设置合适?这是上篇文章中遗留的几个问题接着上篇文章Nginx高并发调优中常被忽略的参数中,最后部分,通过查看nginx源码发现nginx源码中定义backlog为511,其实在php-fpm配置文件中,同样默认backlog是511包括redis,在默认配置文件中也有backlog配置,默认也是511...

weixin_35737757的博客 838

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

TCP参数之backlog

运维同学的一个问题直接问的我蒙圈:请问你们dubbo的backlog参数设置的是多少? 我是谁,我在哪,我在干什么? backlog参数含义 backlog参数为socket套接字监听端口时,内核为该套接字分配的一个队列大小,在服务端还没有来得及处理请求时暂时缓存请求所用的队列。如果队列已经被客户端socket占满了,还有新的连接过来,那么ServerSocket会拒绝新的连接。backlog提供了容量限制功能,避免太多的客户端socket占用太多服务器资源。 注意如果连接处于休眠状态即没有数据传输是不属于

阿呆的专栏 4284

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Netty中BackLog参数的用法、机制与实践

本文深入解析Netty中BackLog参数的底层机制与使用实践。首先从TCP三次握手原理切入,阐明BackLog控制的是操作系统的全连接队列(ESTABLISHED状态)大小,与半连接队列(SYN_RCVD)区分管理。Netty通过ServerBootstrap.option()配置该参数,默认继承操作系统somaxconn值,最终传递给内核控制连接队列上限。需注意BackLog并非越大越好,应结合系统限制(如Linux的somaxconn)和应用处理能力合理设置(建议为处理能力的2-3倍),避免队列过长导

1411

《Linux 服务器 TCP 队列溢出问题:backlog 参数作用与连接拒绝的解决方案》

TCP 队列溢出问题主要由 Accept 队列满导致,核心是。

2501_93897734的博客 591

Salvo框架中实现TCP连接backlog控制的技术解析

在现代Web服务的高并发场景中,TCP连接管理是一个至关重要的技术环节。当大量客户端同时发起连接请求时,如果服务器无法有效处理这些连接,就会导致连接超时、服务不可用等问题。Salvo框架作为Rust生态中的高性能Web后端框架,提供了精细化的TCP连接backlog控制机制,帮助开发者构建稳定可靠的高并发服务。 > **读完本文你将掌握:** > - TCP backlog的核心概念和工作原理 ...

gitblog_01410的博客 371

Java netty的option(ChannelOption.SO_BACKLOG, backLog)什么意思

这个都是socket的标准参数,并不是netty自己的。 具体为: ChannelOption.SO_BACKLOG,1024 BACKLOG用于构造服务端套接字ServerSocket对象,标识当服务器请求处理线程全满时,用于临时存放已完成三次握手的请求的队列的最大长度。如果未设置或所设置的值小于1,Java将使用默认值50。 ChannelOption.SO_KEEPALIVE,true 是否启用心跳保活机制。在双方TCP套接字建立连接后(...

JAVA程序哥 1278

Linux之内核参数——backlog/somaxconn

https://jaminzhang.github.io/linux/understand-Linux-backlog-and-somaxconn-kernel-arguments/ 各参数的含义:https://www.alibabacloud.com/help/zh/faq-detail/41334.htm 引言 之前负载均衡超时问题这篇博...

weixin_30274627的博客 457

关于listen的第二个参数backlog的一些问答见解

Q: 网络编程中listen()函数backlog的理解? A:根据实际经验, 在大量并发连接的服务器上, 这个参数必须设置得比较大, 如1024或者10240或者更大, 否则客户端会频繁收到connection refused的错误. 有时候, 我们情愿客户端排队等待几秒钟, 而不是让客户端立即报一个连接失败的错误. 所以, 大部分情况下backlog参数要设置得比较大, 而不是使用默认的

diaolingle的专栏 601
上一篇: 浅谈tcp socket的backlog参数
下一篇: 高并发TCP连接数目问题
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值