高性能网络编程(一):单台服务器并发TCP连接数到底可以有多少?
引言
曾几何时我们还在寻求网络编程中C10K问题(有关C10K问题请见文章《The C10K problem(英文在线阅读、英文PDF版下载、中文译文)》)的解决方案,但是现在从硬件和操作系统支持来看单台服务器支持上万并发连接已经没有多少挑战性了。
我们先假设单台服务器最多只能支持万级并发连接,其实对绝大多数应用来说已经远远足够了,但是对于一些拥有很大用户基数的互联网公司,往往面临的并发连接数是百万、千万、甚至腾讯的上亿(注:QQ默认用的UDP协议,具体请见讨论贴《为什么QQ用的是UDP协议而不是TCP协议?》)。
虽然现在的集群,分布式技术可以为我们将并发负载分担在多台服务器上,那我们只需要扩展出数十台电脑就可以解决问题,但是我们更希望能更大的挖掘单台服务器的资源,先努力垂直扩展,再进行水平扩展,这样可以有效的节省服务器相关的开支(硬件资源、机房、运维人力、电力其实也是一笔不小的开支)。
那么到底一台服务器能够支持多少TCP并发连接呢?这就是本文要讨论的问题。
文件句柄限制
在linux下编写网络服务器程序的朋友肯定都知道每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给我们的错误是“Socket/File:Can't open so many files”。
这时你需要明白操作系统对可以打开的最大文件数的限制。
进程限制
执行 ulimit -n 输出 1024,说明对于一个进程而言最多只能打开1024个文件,所以你要采用此默认配置最多也就可以并发上千个TCP连接。临时修改:ulimit -n 1000000,但是这种临时修改只对当前登录用户目前的使用环境有效,系统重启或用户退出后就会失效。
重启后失效的修改(不过我在CentOS 6.5下测试,重启后未发现失效),编辑 /etc/security/limits.conf 文件, 修改后内容为:
- soft nofile 1000000
- hard nofile 1000000
永久修改:编辑/etc/rc.local,在其后添加如下内容:
- ulimit -SHn 1000000
全局限制
执行 cat /proc/sys/fs/file-nr 输出 9344 0 592026,分别为:
- 1. 已经分配的文件句柄数,
- 2. 已经分配但没有使用的文件句柄数,
- 3. 最大文件句柄数。
但在kernel 2.6版本中第二项的值总为0,这并不是一个错误,它实际上意味着已经分配的文件描述符无一浪费的都已经被使用了 。
我们可以把这个数值改大些,用 root 权限修改 /etc/sysctl.conf 文件:
- fs.file-max = 1000000
- net.ipv4.ip_conntrack_max = 1000000
- net.ipv4.netfilter.ip_conntrack_max = 1000000
端口号范围限制?
操作系统上端口号1024以下是系统保留的,从1024-65535是用户使用的。由于每个TCP连接都要占一个端口号,所以我们最多可以有60000多个并发连接。我想有这种错误思路朋友不在少数吧?(其中我过去就一直这么认为)
我们来分析一下吧。
如何标识一个TCP连接:
系统用一个4四元组来唯一标识一个TCP连接:{local ip, local port,remote ip,remote port}。好吧,我们拿出《UNIX网络编程:卷一》第四章中对accept的讲解来看看概念性的东西,第二个参数cliaddr代表了客户端的ip地址和端口号。而我们作为服务端实际只使用了bind时这一个端口,说明端口号65535并不是并发量的限制。
server最大tcp连接数:
server通常固定在某个本地端口上监听,等待client的连接请求。不考虑地址重用(unix的SO_REUSEADDR选项)的情况下,即使server端有多个ip,本地监听端口也是独占的,因此server端tcp连接4元组中只有remote ip(也就是client ip)和remote port(客户端port)是可变的,因此最大tcp连接为客户端ip数×客户端port数,对IPV4,不考虑ip地址分类等因素,最大tcp连接数约为2的32次方(ip数)×2的16次方(port数),也就是server端单机最大tcp连接数约为2的48次方。
小结
上面给出的结论都是理论上的单机TCP并发连接数,实际上单机并发连接数肯定要受硬件资源(内存)、网络资源(带宽)的限制,至少对我们的需求现在可以做到数十万级的并发了,你的呢?
C10K问题系列文章
本文是C10K问题系列文章中的第1篇,总目录如下:
- 《高性能网络编程(一):单台服务器并发TCP连接数到底可以有多少》(本文)
- 《高性能网络编程(二):上一个10年,著名的C10K并发连接问题》
- 《高性能网络编程(三):下一个10年,是时候考虑C10M并发问题了》
- 《高性能网络编程(四):从C10K到C10M高性能网络应用的理论探索》
- 《高性能网络编程(五):一文读懂高性能网络编程中的I/O模型》
- 《高性能网络编程(六):一文读懂高性能网络编程中的线程模型》
- 《高性能网络编程经典:《The C10K problem(英文)》[附件下载]》
参考文章
- 《TCP/IP详解 - 第11章·UDP:用户数据报协议》
- 《TCP/IP详解 - 第17章·TCP:传输控制协议》
- 《TCP/IP详解 - 第18章·TCP连接的建立与终止》
- 《TCP/IP详解 - 第21章·TCP的超时与重传》
- 《技术往事:改变世界的TCP/IP协议(珍贵多图、手机慎点)》
- 《通俗易懂-深入理解TCP协议(上):理论基础》
- 《通俗易懂-深入理解TCP协议(下):RTT、滑动窗口、拥塞处理》
- 《理论经典:TCP协议的3次握手与4次挥手过程详解》
- 《理论联系实际:Wireshark抓包分析TCP 3次握手、4次挥手过程》
- 《计算机网络通讯协议关系图(中文珍藏版)》
- 《UDP中一个包的大小最大能多大?》
- 《P2P技术详解(一):NAT详解——详细原理、P2P简介》
- 《P2P技术详解(二):P2P中的NAT穿越(打洞)方案详解》
- 《P2P技术详解(三):P2P技术之STUN、TURN、ICE详解》
- 《通俗易懂:快速理解P2P技术中的NAT穿透原理》
- 《高性能网络编程(一):单台服务器并发TCP连接数到底可以有多少》
- 《高性能网络编程(二):上一个10年,著名的C10K并发连接问题》
- 《高性能网络编程(三):下一个10年,是时候考虑C10M并发问题了》
- 《高性能网络编程(四):从C10K到C10M高性能网络应用的理论探索》
- 《不为人知的网络编程(一):浅析TCP协议中的疑难杂症(上篇)》
- 《不为人知的网络编程(二):浅析TCP协议中的疑难杂症(下篇)》
- 《不为人知的网络编程(三):关闭TCP连接时为什么会TIME_WAIT、CLOSE_WAIT》
- 《不为人知的网络编程(四):深入研究分析TCP的异常关闭》
- 《不为人知的网络编程(五):UDP的连接性和负载均衡》
- 《不为人知的网络编程(六):深入地理解UDP协议并用好它》
- 《不为人知的网络编程(七):如何让不可靠的UDP变的可靠?》
- 《网络编程懒人入门(一):快速理解网络通信协议(上篇)》
- 《网络编程懒人入门(二):快速理解网络通信协议(下篇)》
- 《网络编程懒人入门(三):快速理解TCP协议一篇就够》
- 《网络编程懒人入门(四):快速理解TCP和UDP的差异》
- 《网络编程懒人入门(五):快速理解为什么说UDP有时比TCP更有优势》
- 《技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解》
- 《让互联网更快:新一代QUIC协议在腾讯的技术实践分享》
- 《现代移动端网络短连接的优化手段总结:请求速度、弱网适应、安全保障》
- 《聊聊iOS中网络编程长连接的那些事》
- 《移动端IM开发者必读(一):通俗易懂,理解移动网络的“弱”和“慢”》
- 《移动端IM开发者必读(二):史上最全移动弱网络优化方法总结》
- 《IPv6技术详解:基本概念、应用现状、技术实践(上篇)》
- 《IPv6技术详解:基本概念、应用现状、技术实践(下篇)》
- 《脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手》
- 《脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?》
- 《脑残式网络编程入门(三):HTTP协议必知必会的一些知识》
- 更多同类文章 ……
高性能网络编程(一):单台服务器并发TCP连接数到底可以有多少?相关推荐
- 高性能网络编程(一):单台服务器并发TCP连接数到底可以有多少
前言 曾几何时我们还在寻求网络编程中C10K问题(有关C10K问题请见文章<The C10K problem(英文在线阅读.英文PDF版下载.中文译文)>)的解决方案,但是现在从硬件和操作 ...
- 面试官给我挖坑:单台服务器并发TCP连接数到底可以有多少 ?
点击上方"朱小厮的博客",选择"设为星标" 后台回复"k8s"领取阿里云<深入浅出k8s.pdf> 欢迎跳转到本文的原文链接:h ...
- 网络编程释疑之:单台服务器上的并发TCP连接数可以有多少
曾几何时我们还在寻求网络编程中C10K问题的解决方案,但是现在从硬件和操作系统支持来看单台服务器支持上万并发连接已经没有多少挑战性了. 我们先假设单台服务器最多只能支持万级并发连接,其实对绝大多数应用 ...
- 【 Linux 】单台服务器上并发TCP连接数(转)
单台服务器上并发TCP连接数 问题:一台服务器到底能够支持多少TCP并发连接呢? 1. 文件描述符限制: 对于服务器来说,每一个TCP连接都要占用一个文件描述符,一旦文件描述符使用完 ...
- 如何扩容单台服务器的存储容量?
作者个人研发的在高并发场景下,提供的简单.稳定.可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能.自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验 ...
- SCOM 2012系列⑨单台服务器拓扑监控
为了更直观的展示出我们的服务器健康状况与各应用程序的运行状况,我们看图说话总是最直观有效的,所以我们就把服务器的各组件情况分成拓扑图似的模样给我们直观展示出来吧: 1 单台服务器拓扑图监控 首先打开& ...
- 渗透测试流程(单台服务器)
渗透测试流程(单台服务器) 转载于:https://www.cnblogs.com/sky--/p/5781432.html
- 进阶!基于CentOS7系统使用cobbler实现单台服务器批量自动化安装不同版本系统(week3_day5_part2)-技术流ken...
前言 在上一篇博文<cobbler批量安装系统使用详解-技术流ken>中已经详细讲解了cobbler的使用以及安装,本篇博文将会使用单台cobbler实现自动化批量安装不同版本的操作系统. ...
- 超融合架构提升单台服务器性能,浅谈超融合架构
超融合架构是什么? 超融合架构是基于标准通用的硬件平台,通过软件定义实现计算.存储.网络融合,实现以虚拟化为中心的软件定义数据中心的技术架构.其主要特征是: (1)软件定义 独立于硬件,采用商业通用标 ...
- Linux:Nginx高并发之服务器最大TCP连接数及调优汇总(转载)
Linux TCP连接数优化及调优 启动线程数: 启动线程数=[任务执行时间/(任务执行时间-IO等待时间)]*CPU内核数 最佳启动线程数和CPU内核数量成正比,和IO阻塞时间成反比.如果任务都是C ...
最新文章
- iOS开展——全球应对MotionEvent
- python爬去百度文库_利用Python语言轻松爬取数据[精品文档]
- maven项目配置定时任务
- 第一夜 主公说啥俺做啥
- vc c语言坐标图,VC++6.0下C语言画图编程问题
- 《结对-贪吃蛇-设计文档》
- Nginx+Php-fpm+MySQL+Redis源代码编译安装指南
- webpack分离打包css和less
- 一起学习R软件吧——R软件的使用
- GSM网络识别参数-移动国家号(MCC)|移动网号(MNC)|位置区码(LAC)|小区识别(CI/cellid)...
- 国外服务器 虚拟主机,虚拟主机国内国外什么区别
- 怎样把计算机里的W0rd放到电脑桌面,电脑怎么把Word图标放到桌面?把Word图标放到桌面的设置方法...
- IDEA打包时clean报错Failed to delete
- python 文件缓存
- 2021年 江南大学研究生考试 算法与程序设计 题目
- 106短信群发如何在移动信息时代下实现精准营销
- 睢宁县微服务平台_微服务(Weifuwu)国内微信公众服务平台
- [go学习笔记.第十六章.TCP编程] 3.项目-海量用户即时通讯系统-redis介入,用户登录,注册
- 深度学习之Linux学习
- 用户名密码等信息用星号显示
热门文章
- 二、安装配置java和hadoop程序
- 单元测试、黑盒测试、白盒测试
- DOS BAT脚本批量打开Edge网页
- pandas将df赋值到另一个df_pandas基础
- 所有图形得面积和周长公式
- 十八岁白帽子与“攻陷五角大楼”众测计划
- 【2018华科机试】十二进制
- 重大好消息,郑州社保卡将逆天,不看你将损失一大笔钱!
- 开源H5盲盒商城源码系统4.0-vue+TP5php框架开发开源网站
- 怎么把excel文件转成dta_dta数据格式在excel表格中打开-怎么才能把excel文件格式转化为dat格式?...