Linux单机TCP并发连接

Netty实战三-如何让单机下Netty支持百万长连接? 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。可使用ulimit命令查看系统允许当前用户进程打开的文件数限制:$ ulimit -n 1024。 阅读详情
总结下服务端对于tcp连接的限制与提高tcp连接数的方法,可能工作中永远不会用到,但对于网络知识理解会有帮助。
1.服务端与16位的端口号(最大65535)没什么关系

服务端ip+port(监听端口) + 客户端ip+port 决定了一条连接,客户端连接服务器后,服务端并没有又分配一个物理端口与客户端连接。其实所有的数据还是通过监听端口接收与发送的(不论全双工与半双工,反正都是双工的),只不过多了一个逻辑上的socket。这些都应该是网卡上的事情,当接收到一个字节流的时候,网卡就会回调给操作系统,回调的时候会告诉操作系统客户端ip+port,假如是epoll模型,那么这次可能只接收了几个字节,回调那个新的socket的特定方法。然后下一次从监听端口回调上来的数据可能是另外的一个逻辑上的socket,各自互不影响。

2.内存限制

系统为每个TCP 连接分配一个TCP 控制块(TCP control block or TCB)。一个tcb控制块大概要占用1k多的内存,假如百万连接,1个tcb占用1k内存,那么就需要1G的内存了,这还是理想情况,一般情况下tcb要大于1k内存。当每个连接上在有数据传输的时候,同时需要的内存就更大了。

另外需要设置的tcp参数有tcp的读写缓冲区,默认为86k,都可以改成4k。此外需要修改tcp_mem的值。

  1. tcp_mem(3个INTEGER变量):low, pressure, high  
  2. low:当TCP使用了低于该值的内存页面数时,TCP不会考虑释放内存。  
  3. pressure:当TCP使用了超过该值的内存页面数量时,TCP试图稳定其内存使用,进入pressure模式,当内存消耗低于low值时则退出pressure状态。  
  4. high:允许所有tcp sockets用于排队缓冲数据报的页面量,当内存占用超过此值,系统拒绝分配socket,后台日志输出“TCP:  
  5. too many of orphaned sockets”。  
tcp_mem(3个INTEGER变量):low, pressure, high
low:当TCP使用了低于该值的内存页面数时,TCP不会考虑释放内存。
pressure:当TCP使用了超过该值的内存页面数量时,TCP试图稳定其内存使用,进入pressure模式,当内存消耗低于low值时则退出pressure状态。
high:允许所有tcp sockets用于排队缓冲数据报的页面量,当内存占用超过此值,系统拒绝分配socket,后台日志输出“TCP:
too many of orphaned sockets”。

3.文件句柄限制

每个socket都是一个文件句柄,Linux下文件句柄限制,包括linux允许的最大文件句柄,linux允许的最大同时活动的文件句柄。

4.网卡限制

千兆网卡,上限满负荷工作,大概有600兆左右,单位为b,除以8为75k/单个连接。这个一般可以满足。

参考http://www.blogjava.net/yongboy/archive/2013/04/11/397677.html linux下需要修改的地方有:

[python] view plain copy
print ?
  1. echo “* - nofile 1048576” >> /etc/security/limits.conf   #open file resource limit 是linux中process可以打开的文件句柄数量。  
  2. echo ”fs.file-max = 1048576” >> /etc/sysctl.conf    #系统最大允许的文件描述符   
  3. echo ”net.ipv4.ip_local_port_range = 1024 65535” >> /etc/sysctl.conf   #可以使用的端口范围,主要为了测试时候使用     
  4. echo ”net.ipv4.tcp_mem = 786432 2097152 3145728” >> /etc/sysctl.conf   #见上  
  5. echo ”net.ipv4.tcp_rmem = 4096 4096 16777216” >> /etc/sysctl.conf       
  6. echo ”net.ipv4.tcp_wmem = 4096 4096 16777216” >> /etc/sysctl.conf  
echo "* - nofile 1048576" >> /etc/security/limits.conf   #open file resource limit 是linux中process可以打开的文件句柄数量。
echo "fs.file-max = 1048576" >> /etc/sysctl.conf    #系统最大允许的文件描述符 
echo "net.ipv4.ip_local_port_range = 1024 65535" >> /etc/sysctl.conf   #可以使用的端口范围,主要为了测试时候使用   
echo "net.ipv4.tcp_mem = 786432 2097152 3145728" >> /etc/sysctl.conf   #见上
echo "net.ipv4.tcp_rmem = 4096 4096 16777216" >> /etc/sysctl.conf     
echo "net.ipv4.tcp_wmem = 4096 4096 16777216" >> /etc/sysctl.conf

在参考文章中,建立100w的连接,大概使用了7500M的内存,每个连接大概7.5k的内存(主要是读写缓冲区,tcb的大小)。

另外,通过修改系统配置达到100w连接并不难,但是要是真正实现并发100w业务的处理还是很困难的。

Linux系列:一台主机上只能保持最多65535个TCP连接?错! 目录 内核一条TCP连接靠什么标识? 一台机器可以提供多少不同端口的TCP服务? 内核一条TCP连接靠什么标识? 四元组(源IP,源PORT,目标IP,目标PORT) 在一台主机上,只要这个四元组不重复,限制连接个数的就是系统配置(各种最大xx数)及系统资源(主要是内存)。 单机并发连接数受内存和网络带宽的限制,但远远超过65535,不然单机服务器的数十万并发连接是如何实现的呢 一台机器可以提供多少不同端口的TCP服务? 一台机器最多能使用的端口也只有65535个 1024以... 阅读详情

相关推荐

ICCompiler II实战:从NDM生成到APR流程的完整避坑指南

本文是一份针对ICCompiler II(ICC II)后端物理实现流程的实战避坑指南。文章详细解析了从NDM库生成、设计初始化、布局规划到时钟树综合与布线的完整APR流程,重点分享了各环节的常见陷阱、精细化配置命令与调试经验,旨在帮助工程师高效达成PPA目标,确保设计一次成功。

p4q5r6s7t的博客 532

短链系统设计-用户自定义短链

实现一个顾客短网址,使得顾客能创立他们自己的短网址。即你需要在前文基础上再实现一个。把一个长网址转换成一个以开头的短网址把一个短网址转换成一个长网址设定一个长网址的短网址为+keylong2Short生成的短网址的key的长度应该等于6 (不算域名和反斜杠)。可以使用的字符只有。如:abcD9E任意两个长的url不会对应成同一个短url,反之亦然如果不能完成用户期望的设定, 那么应该返回"error", 反之如果成功将长网址与短网址对应,应该返回这个短网址。

JavaEdge全是干货的技术号 1288

解决uc浏览器劫持video标签问题

解决uc视频悬浮播放 ,video标签被浏览器劫持 ,vide0适配

smile_y_y的博客 3450

一看就懂系列之 高并发的短链接替换实现方案

转载请附上本文地址:http://blog.youkuaiyun.com/u011957758/article/details/75810039前言是的,相信只要是社交类的app,或多或少会涉及到描述。那么当存在链接的时候,我们不知道链接有多长,所以描述字段就没法准确的用varchar(140)了。 难道用text?好像不行,两方面原因:1.描述肯定要有限制的。2.dba不推荐text,效率你懂的。 所以对

咖啡色的羊驼 8275

论文理解【LLM-OR】——【Step-Opt】Training LLMs for Optimization Modeling via Iterative Data Synthesis and

本文提出 Step-Opt-Instruct 方法,针对用 LLM 做 OR 问题求解任务,用迭代问题生成 + 分步验证机制实习更可靠的训练数据合成,从而微调开源 LLM 得到 Step-Opt。在多个 OR 建模基准提升性能,尤其在复杂问题上提升更明显

佚失的诗篇 806

佳能C3025打印机扫描方法

佳能C3025彩色打印机扫描方法 步骤一、如果打印机处于休眠状态,可按图中标记的按钮唤醒打印机; 然后点击屏幕上的【扫描】 步骤二、扫描类型选择【文件】 步骤三、点击屏幕上的【地址簿】 步骤四、此时屏幕胡看到名字,如果看不到自己的名字,可往下滑动直到看到自己的名字,然后点击自己的名字,再点击右下角的【应用】 步骤五、点击【发送设置】,可看到文件格式为PDF,点击可以选择JPEG的图片格式。...

weixin_46019317的博客 2万+

C语言socket长链接与短连接

长链接------------------心跳: socket模拟网页的报文连接某个网站,创建tcp的socket后,当我socket.connect后,如果在5到7秒钟不socket.send,那么这个链接就失效了。 请问如何长时间的保持这个链接 这是在服务器端的设置的,客户端没法设置,可以发送心跳包。 socket.connect后,每3-4秒用socket.send发送一字节数据(内容随便)...

代码解释生活 7030

遗传算法驱动吃豆人进化:从零构建AI游戏智能体

遗传算法是一种模拟自然选择过程的优化技术,其核心原理是通过选择、交叉和变异等操作,在解空间中迭代搜索最优解。该技术为解决复杂优化问题提供了强大工具,尤其在游戏AI、机器人控制和参数调优等场景中价值显著。在游戏AI领域,遗传算法常被用于训练智能体自主决策,例如在经典游戏《吃豆人》中,通过定义智能体的“基因”(如神经网络权重)和“适应度”(如游戏得分),可以引导其进化出躲避幽灵、高效吃豆等策略。本项目结合Pygame框架与神经网络,构建了一个完整的遗传算法训练沙盒,详细展示了如何通过适应度函数设计和参数调优,实

weixin_30467199的博客 273

单机最大TCP连接数

今天准备写一下epoll_timer(即epoll实现的简单定时器, 后面会分享blog)由于用到epoll的模型,翻出原先的代码跑了一下,看到原来define的最大的处理用户上限,感觉有些不妥,所以决定测试一下我的ubuntu 16.04,1G内存的单机上究竟可以建立多少个连接。虽然网上有很多这方面的案例,但是我还是决定自己测试一下,印象深刻,对问题场景有更深的印象。如果文中有错误或者不全面的地...

lyztyycode的博客 1万+

泛微E9集成登录实战:5分钟搞定第三方系统单点登录配置(附避坑指南)

本文详细解析了泛微E9集成登录的实战配置流程与核心原理。通过理解其基于信任代理的身份传递机制,文章指导用户如何在5-10分钟内完成第三方系统的单点登录对接,涵盖基础配置、核心参数设置、高级表达式应用,并提供了编码问题、账号不一致等常见避坑指南,助力企业快速构建统一身份认证门户。

weixin_29185493的博客 291

时序预测 | MATLAB实现NGM(1,1)多变量灰色时间序列预测

时序预测 | MATLAB实现NGM(1,1)多变量灰色时间序列预测

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 1514

MarioTCP: Multi Libvent TCP Server 一个高性能的TCP服务器

MrioTCP,超级马里奥,顾名思义,他不仅高效,而且超级简易和好玩。同时他可以是一个很简洁的Linux C 开发学习工程。毫不夸张的说,如果全部掌握这一个工程,你会成为一个Linux C的牛人;当然,你也可以通过源码包的mario.c(maritcp服务器示例程序)来学习,可以很快入门上手进行Linux C开发。经过两个多月的测试(编写c++客户端测试及调优系统参数),测试结果得到单机最大带宽吞...

haierboos 521

C#怼倍福TwinCAT3:ADS协议封装实战(附完整读写源码+避坑清单)

变量名大小写敏感:PLC里定义的是GVL.bStart,你写GVL.BStart绝对读不到;数组访问格式:PLC数组是,C#里读单个元素要写,读整个数组不用写索引;句柄要释放:用创建的句柄,一定要用using包起来,否则会占着资源;PLC必须运行:哪怕变量定义对了,PLC没Run(只是Login)也读不到数据;路由配置:如果上位机和PLC不在一个网段,要在TwinCAT3里添加路由(Router→Edit Routes)。倍福ADS通信其实不难,核心就是“配置对+变量名写对+数据类型匹配”。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 950

单台服务器并发TCP连接数到底可以有多少

http://www.cnblogs.com/zhangkele/articles/8955051.html 常识一:文件句柄限制 在linux下编写网络服务器程序的朋友肯定都知道每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给我们的错误是“Socket/File:Can't open so many files”。 这时你需要明白操作系统对可以打开的最大...

Likes的博客 2572

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

详解Linux服务器最大tcp连接数 网络编程 在tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三路握手后建立tcp连接。那么对单机,其最大并发tcp连接数是多少?

详解Linux服务器最大tcp连接数 网络编程 在tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三路握手后建立tcp连接。那么对单机,其最大并发tcp连接数是多少? 如何标识一个TCP连接 在确定最大连接数之前,先来看看系统如何标识一个tcp连接。系统用一个4四元组来唯一标识一个TCP连接:{local ip, local port,rem

u014659211的专栏 910

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

MarioTCP:一个可单机支持千万并发连接的TCP服务器

请注意: 过去几年有不少朋友加我,心想对不住大家了,建个群聚聚大家伙,请大家群里畅所欲言…请加QQ群:564994650, 里面有不少linux c的研发同学。 GitHub项目地址:https://github.com/johanvon/mariotcp MrioTCP,超级马里奥,顾名思义,他不仅高效,而且超级简易和好玩。同时他可以是一个很简洁的Linux C 开发学习工程。毫不...

JohanFong 2万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Linux高并发学习---epoll单机百万并发实现

使用epoll的reactor模式实现单机百万并发

hjlogzw的博客 1193

Workflow性能之巅:单机百万并发连接调优实践

在高并发网络编程领域,C10K(单机1万并发连接)曾是难以逾越的鸿沟,而如今C10M(单机千万并发)已成为新的性能标杆。Workflow作为一款C++并行计算与异步网络框架,凭借其高效的事件驱动模型和精细的资源管理,能够帮助开发者轻松实现单机百万并发连接。本文将从内核参数配置、框架参数调优、连接池管理和内存优化四个维度,全面剖析Workflow框架下的高并发调优实践。 ### 为什么选择Work...

gitblog_01099的博客 523

服务器最大TCP连接数及调优汇总

单机最大tcp连接数 在tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三路握手后建立tcp连接。那么对单机,其最大并发tcp连接数是多少? 如何标识一个TCP连接 在确定最大连接数之前,先来看看系统如何标识一个tcp连接。系统用一个4四元组来唯一标识一个TCP连接:{local ip, local port,remote ip,remote port}。 client最大tcp连接数 client每次发起tcp连接请求时,除非绑定端口,通常会让系统选取一个空闲的本

走向程序的康庄大道 1万+

单机百万TCP连接优化实战与Linux网络调优

TCP连接作为网络通信的基础协议,其性能优化直接影响高并发服务的质量。通过调整Linux内核参数和应用层设计,可以突破单机文件描述符限制、优化内存使用效率。在物联网和实时通信场景中,实现单机百万级TCP长连接能显著降低服务器成本。本文以Ubuntu系统为例,详细解析如何通过修改fs.file-max、tcp_mem等核心参数,配合epoll边缘触发模式,解决高并发下的Too many open files问题。实验证明,经过系统级调优后,单机可稳定维持百万连接,内存消耗控制在4GB以内,为IM服务器、金融交

weixin_30768881的博客 273

Linux:Nginx高并发之服务器最大TCP连接数及调优汇总(转载)

Linux TCP连接数优化及调优 一、背景描述 本篇文章主要探讨一台Nginx服务器最大可以承受多少高并发,通过度娘可知服务器可以承受多少高并发主要受以下几个点影响。 ①、tcp连接优化 ②、系统最大文件描述符 ③、服务器硬件(cpu、内存) 接下来我们来一一分解。 二、tcp连接优化 client最大tcp连接数 client每次发起tcp连接请求时,除非绑定端口,通常会让系统选取一个空闲的本地端口(local port),该端口是独占的,不能和其他tcp连接共享。tcp端口的数据类型是unsigned

那个那个 8826

视频教程-19年架构师系列之高并发Netty教程打造单机百万连接架构视频-Java

19年架构师系列之高并发Netty教程打造单机百万连接架构视频 7年的开发架...

weixin_31855955的博客 429

Linux 内核调优复盘:单机百万连接场景下的协议栈瓶颈击穿记录

先改 ulimitnofile限制是所有后续优化的前提,建议设为 200 万;再调连接队列somaxconn和决定连接建立的成功率,默认值在百万级长连接下严重不足;TCP 内存和 KeepAlive 是稳定性的保障tcp_mem不给够会导致内部丢包,KeepAlive 配置则直接影响连接清理效率;端口范围和 epoll 是最后的边际优化:它们在百万级连接下才能体现出价值,但不调会卡在 99% 的最后一公里。禁用场景在 NAT 环境下可能导致连接混乱,建议仅在内网可控环境启用。

iymei4986533030的博客 4642
上一篇: Linux下查看及修改进程打开的文件句柄数量
下一篇: 协程 及 Libco 介绍
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值