提高单机短连接QPS到20万

2023-11-14

提高单机短连接QPS到20万
转载于http://weibo.com/ttarticle/p/show?id=2309404037884855362229。
      

一般的通讯协议在设计上都避免服务器端主动发起TCP连接关闭,让客户端来发起close socket,避免服务器端端口和内存的资源消耗

默认情况下,客户端关闭TCP连接后本地的临时端口会长时间进入TIME_WAIT状态(默认120s),TIME_WAIT状态是为了保护TCP协议的正确性,避免端口发生复用后老的TCP连接残留在网络上的报文进入新的连接里。但这也引入了一个问题,临时端口数量有限,耗尽后,新建连接就会报错EADDRNOTAVAIL

首先要增加临时端口的数量,增加可被消耗的临时端口资源
sysctl -w "net.ipv4.ip_local_port_range=1024 65535”

然后要加速临时端口回收

第一种方法是启用tw_reuse,tw_reuse能加速TIME_WAIT状态端口在几秒时间内安全的回收
sysctl -w net.ipv4.tcp_timestamps=1
sysctl -w net.ipv4.tcp_tw_reuse=1
2.6.32内核下启动tw_reuse短连接可以达到2w,性能并不稳定;

第二种方法更激进些,启用tw_recycle,tw_recycle允许在两个RTT。当多个客户端处于NAT后时,在服务器端开启tw_recycle会引起丢包问题,如果丢SYN包,就会造成新建连接失败
sysctl -w net.ipv4.tcp_timestamps=1
sysctl -w net.ipv4.tcp_tw_recycle=1
2.6.32内核下启动tw_recycle短连接可以达到6w,比较稳定;

第三种方法是给socket配置SO_LINGER,on设为1,linger设为0,这样关闭连接后TCP状态从ESTAB直接进入CLOSED,向服务器发rst包而不是fin包来关闭连接。这种方法风险最高,会丢弃buffer里未发送完的数据,不过通过设计协议(客户端和服务器协议上协商后再关闭TCP连接)可以规避这个问题,使用需要小心,选择合适的场景。
这个方法可以完全解掉TIME_WAIT问题,短连接达到20w,很稳定

短连接QPS达到20w后,网卡pps接近百万,耗时主要在软中断,内核spin_lock和网卡驱动里,也基本让内核态网络协议栈负载饱和了。

背景资料补充:

SO_LINGER作用
设置函数close()关闭TCP连接时的行为。缺省close()的行为是,如果有数据残留在socket发送缓冲区中则系统将继续发送这些数据给对方,等待被确认,然后返回。

利用此选项,可以将此缺省行为设置为以下两种
  a.立即关闭该连接,通过发送RST分组(而不是用正常的FIN|ACK|FIN|ACK四个分组)来关闭该连接。至于发送缓冲区中如果有未发送完的数据,则丢弃。主动关闭一方的TCP状态则跳过TIMEWAIT,直接进入CLOSED。网上很多人想利用这一点来解决服务器上出现大量的TIMEWAIT状态的socket的问题,但是,这并不是一个好主意,这种关闭方式的用途并不在这儿,实际用途在于服务器在应用层的需求。
  b.
将连接的关闭设置一个超时。如果socket发送缓冲区中仍残留数据,进程进入睡眠,内核进入定时状态去尽量去发送这些数据。
    在超时之前,如果所有数据都发送完且被对方确认,内核用正常的FIN|ACK|FIN|ACK四个分组来关闭该连接,close()成功返回。
    如果超时之时,数据仍然未能成功发送及被确认,用上述a方式来关闭此连接。close()返回EWOULDBLOCK。


SO_LINGER选项使用如下结构:

struct linger {

     int l_onoff;

     int l_linger;

};


l_onoff为0,则该选项关闭,l_linger的值被忽略,close()用上述缺省方式关闭连接。

l_onoff非0,l_linger为0,close()用上述a方式关闭连接。

l_onoff非0,l_linger非0,close()用上述b方式关闭连接。

值得一说的是,不管你用什么方式使用SO_LINGER,都需要大量耐心的测试来确保你的服务器程序确实是按照你的意愿在跑,因为这个选项对服务器处理小量请求的行为影响非常细微,简单的功能测试很难验证它的行为,上线后量大的情况下可能会出问题,让你的服务器马上下线,大并发量的模拟实际场景压测才能保证其正确性:)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

提高单机短连接QPS到20万 的相关文章

  • Linux内网环境安装nginx,离线安装nginx教程

    说明 本教程针对内网环境 没有互联网环境 安装nginx 安装前测试 nginx未安装时 无法访问 curl http localhost 80 第一步 请参考教程 本地yum源安装 教程连接如下 https note youdao com
  • 让程序在screen模式下运行

    让程序在screen模式下运行 screen S yourname gt 新建一个叫yourname的session 然后输入你要执行的命令 screen ls gt 列出当前所有的session screen r yourname gt
  • 分布式系统failover测试之拔盘插盘操作

    分布式系统failover测试之拔盘插盘操作 拔盘 echo scsi remove single device 1 0 0 0 gt proc scsi scsi echo scsi remove single device 2 0 0
  • 如何设置ntp出现漂移的问题

    如何设置ntp出现漂移的问题 1 执行date命令 查看该host机器时间是否正常 2 找到ntp服务器 执行ntpdate time ntp org 3 在crontab中添加 0 12 usr sbin ntpdate
  • Docker+Linux_Centos(内核:3.10.0-957.1.3.el7.x86_64)安装

    前言声明 如果您有更好的技术与作者分享 或者商业合作 请访问作者个人网站 http www esqabc com view message html 留言给作者 如果该案例触犯您的专利 请在这里 http www esqabc com vi
  • 使用Docker实现持续集成

    使用Docker实现持续集成 基于Docker的特征 现在常见的利用Docker进行持续集成的流程如下 开发者提交代码 触发镜像构建 构建镜像上传至私有仓库 镜像下载至执行机器 镜像运行 其基本拓扑结构如图1所示
  • FastCGI技术

    FastCGI技术 by ahuner 1 FastCGI介绍 FastCGI 快速通用网关接口 Fast Common Gateway Interface FastCGI 是一种让交互程序与Web服务器通信的协议 FastCGI像是一个常
  • python打包列表文件到一个包

    python打包列表文件到一个包 def tar file tarfile list ret os system tar pzcvf x tar gz s join tarfile list if ret 0 return True els
  • Linux上搭建Jenkins

    Linux上搭建Jenkins 下面给出Linux上搭建Jenkins的环境 教你一步步搭建起来 1 Jenkins下载 Jenkins 下载网址 Download Jenkins Jenkins 最新版本 jenkins 1 514 al
  • SSH常用参数

    SSH常用参数 ssh o ConnectTimeout 3 o ConnectionAttempts 5 o PasswordAuthentication no o StrictHostKeyChecking no ip command
  • linux xargs命令使用

    linux xargs命令使用 基本的命令是 command xargs I 选项 格式 xargs I rep str comand rep srt 其中rep str 为代替传递给xargs参数 可以使 等符号 其主要作用是当xargs
  • 提高单机短连接QPS到20万

    提高单机短连接QPS到20万 转载于http weibo com ttarticle p show id 2309404037884855362229 一般的通讯协议在设计上都避免服务器端主动发起TCP连接关闭 让客户端来发起close s
  • 平时积累

    平时积累 1 相关命令 1 ll ltr 排序查看文件 2 grep r vim 3 pstack pid vim 显示每个进程的栈跟踪 4 ps auxf 5 gdb binary c core文件 查看core文件 gdb binary
  • 分布式系统全链路监控方案设计

    分布式系统全链路监控方案设计 在分布式系统中 全链路监控系统 跟踪requestid经过了哪些server 方便定位log的位置 能在一定程度上缓解维护压力 下面给出我们团队的架构设计图
  • 网络QoS解决方案

    网络QoS解决方案 在网络带宽不足时 对网络流量做区别服务 优先传输那些重要的 要求网络延迟小的 如果丢弃会导致更大业务代价的数据 并对不同应用的数据做合理的带宽分配与控制 如果一定需要丢弃一些数据 则丢弃那些代价比较低的 这就是网络 Qo
  • SO_LINGER选项

    SO LINGER选项 SO LINGER选项用于控制close系统调用在关闭TCP连接时的行为 默认情况下 当我们使用close系统调用来关闭一个socket时 close将立即返回 TCP模块负责把该socket对应的TCP发送缓冲区中
  • Linux下获取磁盘空间利用率方式

    Linux下获取磁盘空间利用率方式 下面使用python语言来讲解如何获取磁盘空间利用率的问题 1 os statvfs path 方法用于返回包含文件描述符fd的文件的文件系统的信息 其中path表示文件路径
  • DNS在架构设计中的巧用

    DNS在架构设计中的巧用 一 缘起 一个http请求从客户端到服务端 整个执行流程是怎么样的呢 一个典型流程如上 1 客户端通过域名daojia com请求dns server 2 dns server返回域名对应的外网ip 1 2 3 4
  • TCP连接阻塞的监控和处理

    TCP连接阻塞的监控和处理 那么 什么样的TCP连接属于上述发生阻塞的异常连接呢 结合线上运维经验 我们整理出符合该类异常的特征如下 该连接的Recv Q的值特别大 超过3M 该连接的Recv Q的值持续上涨 造成堆积 在一定滑动时间窗口内
  • vim如何选中多行后批量缩进

    vim如何选中多行后批量缩进 1 shift v 选中行 2 使用 进行缩进

随机推荐

  • SIFT特征提取-应用篇

    SIFT特征具有缩放 旋转特征不变性 下载了大牛的matlab版SIFT特征提取代码 解释如下 1 调用方法 将文件加入matlab目录后 在主程序中有两种操作 op1 寻找图像中的Sift特征 image descrips locs si
  • 最全iOS 应用上架流程(提交到AppStore)

    一 上架基本需求资料 1 苹果开发者账号 公司已有可以不用申请 需要开通开发者功能 每年 99 美元 2 开发好的APP 借助辅助工具appuploader创建证书跟描述文件 二 证书 描述文件 借助辅助工具appuploader 上架版本
  • django runserver开启服务(开启外网访问与ipv6访问)

    首先setting要设置 ALLOWED HOSTS 然后在启动时 使用 python manage py runserver 8000 或是 python manage py runserver 8000 这样 开启外网访问 ipv4与i
  • numpy中argsort()排序函数的使用

    argsort 函数返回的是数组从小到大的索引值 直接上例子 一 对于一维数组 1 升序排列 默认是升序 import numpy as np 一维数组升序排列 data np array 3 5 1 np argsort data 输出结
  • 数据库原理-关系模式的规范化

    关系数据库的规范化理论是数据库逻辑设计的工具 一个关系只要其分量都是不可分的数据项 它就是规范化的关系 但这只是最基本的规范化 规范化程度可以有6个不同的级别 即6个范式 规范化程度过低的关系不一定能够很好地描述现实世界 可能会存在插入异
  • 通过WIndows命令行访问MySQL数据库

    在cmd命令行里输入mysql h127 0 0 1 uroot p用户密码 这样就可以连接了 使用 show databases 这个命令可以显示出所有的database表以方便我们查看 输入 quit 退出
  • @vant/weapp

    文章目录 一 介绍 二 安装 1 cd 到项目文件目录 2 使用 npm 安装 3 修改项目配置 4 构建 5 其他文件 三 使用 四 参考 微信小程序使用 vant weapp组件 一 介绍 Vant 是一个开源的移动端组件库 在微信小程
  • 基本的tcp套接口编程

    基本的tcp套接口编程 1 socket函数 为了执行网络I O 一个进程必须做的第一件事情是调用socket函数 指定期望的通信协议类型 include
  • 基于dlib的目标追踪

    之前都在做目标检测 训练自己的检测器做检测 缺点就是电脑性能稍微差点的话 预测一次的时间就会稍久 我做的又正好是视频预测 所以连续播放都卡成PPT了 无奈之下选择抽帧检测 于是那闪烁效果堪比蹦迪现场的灯光 最后拍板定案的方法就是目标追踪了
  • 软件开发项目流程 - 立项

    引言 在互联网行业从事开发工作三年余 虽然时间不长 但对于开发流程也有一定的认识 写一篇关于这方面的内容 以记录自己的成长历程 引言 目的 立项流程 标准项目管理 总结 目的 当我们发现市场上有一个项目有利可图 且我们有能力做的时候 发起的
  • 实用的Qt窗口标志(Qt::WindowFlags)

    窗口标志枚举类型用于指定小部件的各种窗口系统属性 其中一些标志取决于底层窗口管理器是否支持它们 以下是一些比较实用的窗口标志 1 Qt Widget 这是QWidget的默认类型 如果有父窗口则为子窗口小部件 如果没有父窗口则为独立窗口小部
  • 微积分基础知识

    微积分基础知识 前言 在信息学算法竞赛中 常有些数学类问题需用到微积分 或用到微积分的算法 如母函数 HNOI2012排队 这里本人总结了一下竞赛中常用的微积分基础知识 供大家参考 有写得不好的地方请多多包涵 感谢学长帮助修改审校 若有错误
  • 技术篇之蓝牙Mesh设备是如何加入网络中

    概述 配网 Provisioning 流程属于蓝牙Mesh网络中的重要一环 正是通过配网流程 才使得蓝牙Mesh设备 Device 变成网络中的一个节点 Node 因此 本文将着重讲解配网流程及其相关概念 希望能够给读者以清晰的理解 名词解
  • SOA和伪技术

    中国的造假之风 已经成为整个国家整个社会的一个老大难问题 从最开始的假烟假酒 到后来的假名牌假新闻 从最个人化的假球迷假学历 到严重社会化的假文凭假鸡蛋 可以说是 长江后假推前假 一代新假换旧假 沉舟侧畔有千假 病树前头有十假 科学领域的造
  • 跨站脚本攻击(XSS) 漏洞原理及防御方法

    注 转载请注明出自 https blog csdn net qq 36711453 article details 83745195 XSS跨站脚本攻击 两种情况 一种通过外部输入然后直接在浏览器端触发 即反射型XSS 还有一种则是先把利用
  • react组件在页面切换时,如果页面组件已经被销毁,终止已销毁页面的请求的解决方案

    就比如说下面这个请求时间太长了 在它还没有请求成功就切换了页面 销毁了页面组件 useEffect就会给它设置成true 抛弃这个请求 const ignore useRef false useEffect gt return gt ign
  • 【STM32实战】机械臂快递分拣系统(二)——机械臂控制程序(上位机)编写

    STM32实战 机械臂快递分拣系统 二 机械臂控制程序 上位机 编写 前言 题目分析 蓝牙模块的使用 上位机程序的编写 连接阿里云 测试 前言 近期回校上最后一门课 刚好是做机械臂有关的题目 所以写文记录一下 主要实现的是可以自动识别获取快
  • 线与逻辑与OC门、OD门关系

    线与逻辑 两个或多个输出信号连接在一起可以实现逻辑 与 的功能 以下图为例 当与非门G1和G2输出都为1时 输出L才为1 只要有一个输出为0 则输出L为0 在硬件上 要用OC门 三极管 集电极开路 或OD门 NMOS 漏极开路 来实现 另外
  • Qt5打包——利用自带的windeployqt.exe和工具Enigma Virtual Box

    目录 运行 添加依赖 发布成单一exe形式 运行 选择Release版本 运行一次 Release 运行后会发现多了Release版本 里面有exe 但是双击时会发现缺少一些动态链接库 直接点击后缺少动态链接库 添加依赖 在你的Qt的安装包
  • 提高单机短连接QPS到20万

    提高单机短连接QPS到20万 转载于http weibo com ttarticle p show id 2309404037884855362229 一般的通讯协议在设计上都避免服务器端主动发起TCP连接关闭 让客户端来发起close s