网络编程释疑之:单台服务器上的并发TCP连接数可以有多少

曾几何时我们还在寻求网络编程中C10K问题的解决方案,但是现在从硬件和操作系统支持来看单台服务器支持上万并发连接已经没有多少挑战性了。我们先假设单台服务器最多只能支持万级并发连接,其实对绝大多数应用来说已经远远足够了,但是对于一些拥有很大用户基数的互联网公司,往往面临的并发连接数是百万,千万,甚至腾讯的上亿(注:QQ默认用的UDP协议)。虽然现在的集群,分布式技术可以为我们将并发负载分担在多台服务器上,那我们只需要扩展出数十台电脑就可以解决问题,但是我们更希望能更大的挖掘单台服务器的资源,先努力垂直扩展,再进行水平扩展,这样可以有效的节省服务器相关的开支(硬件资源,机房,运维,电力其实也是一笔不小的开支)。那么到底一台服务器能够支持多少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并发连接数,实际上单机并发连接数肯定要受硬件资源(内存)、网络资源(带宽)的限制,至少对我们的需求现在可以做到数十万级的并发了,你的呢?

 

本文出自 “永远的朋友” 博客,请务必保留此出处http://yaocoder.blog.51cto.com/2668309/1312821

转载于:https://www.cnblogs.com/rexy/p/5544366.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357184.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

垂直和水平装饰

装饰器模式是在不更改其接口的情况下向对象添加功能的最佳方法之一。 我经常使用可组合装饰器,并且总是会问自己在功能列表必须可配置时如何正确设计它们。 我不确定我的答案是否正确,但是这里有一些值得深思的地方。 公寓(1960)…

cygwin配置git

对于windows用户来说,使用git bash经常会出现乱码情况,那么一款优质高尚的软件,值得推荐一下了,那就是cygwin 下载cygwin后,在安装过程中,安装git,安装vim编辑器 然后会在安装目录下看到类linux…

《鸿蒙理论知识06》HarmonyOS概述之应用开发基础知识

目录 APP Ability 库文件 资源文件 配置文件 pack.info HAR APP HarmonyOS 的应用软件包以 APP Pack(Application Package)形式发布

C#中FuncT,TResult的用法和Lambda表达式

在C#3.0中引用了Limbda表达式&#xff0c;Limbda表达式实际上就是一个方法&#xff0c;只不过该方法是匿名方法&#xff08;即没有名称的方法&#xff09;代码片段&#xff1a; Func<int,string,string> t(int x, string b) > (x.ToString() b);就等于如下&#xff1…

前端代码规范网址导航(总结)

在大公司代码规范是非常重要的一件事情,多人协作,还有代码评审。所以能写出漂亮的代码非常重要。 这就好比你自己在家,无论是穿大裤衩子,还是背心,甚至是光膀子,都没人管你。但你要出门去约会,就要把最好的一面展现给别人。这是对别人的尊重,也是给自己的背书。所以遵…

SCI/EI期刊投稿 Reply Letter 常用格式总结

SCI/EI期刊投稿Reply Letter常用格式总结整个论文投稿的过程中&#xff0c;会遇到各种问题&#xff0c;需要我们向主编询问或是回复。下面主要总结了responses to the comments&#xff0c;以及催稿信的模板。1、回复信&#xff08;Response Letter&#xff09;在期刊投稿中&am…

rabbitmq 传递文件_RabbitMQ:计划邮件传递

rabbitmq 传递文件本月初&#xff0c;我在ComoRichWeb上的RabbitMQ上做了一个演讲&#xff0c;与会人员提出的一个问题是“是否可以发布一条消息供以后使用&#xff1f;” 我回答说&#xff0c;就我所知&#xff0c;这是不可能的&#xff0c;但是可能会有一些技巧来实现它。 好…

《01》ECMAScript 6 简介

ECMAScript 6.0&#xff08;以下简称 ES6&#xff09;是 JavaScript 语言的下一代标准&#xff0c;已经在 2015 年 6 月正式发布了。它的目标&#xff0c;是使得 JavaScript 语言可以用来编写复杂的大型应用程序&#xff0c;成为企业级开发语言。 目录 1.ECMAScript 和 JavaScr…

BZOJ4562: [Haoi2016]食物链

Description 如图所示为某生态系统的食物网示意图&#xff0c;据图回答第1小题现在给你n个物种和m条能量流动关系&#xff0c;求其中的食物链条数。物种的名称为从1到n编号M条能量流动关系形如a1 b1a2 b2a3 b3......am-1 bm-1am bm其中ai bi表示能量从物种ai流向物种bi,注意单独…

JLupin Next Server乍一看

JEE基础结构现在有了一个新的管理解决方案– JLupin Next Server。 它为应用程序实现提供了另一种方法。 它提供什么&#xff1f; 用于实现JEE应用程序的现有解决方案受到限制。 通过新的应用程序管理方式&#xff0c;JLupin Next Server打破了所有障碍。 JEE的足迹 良好实践…

《02》let 和 const 命令

目录 1.let命令 基本用法 暂时性死区 不允许重复声明 2.块级作用域 3.const 命令 基本用法 本质 1.let命令 基本用法 ES6 新增了let命令&#xff0c;用来声明变量。它的用法类似于var&#xff0c;但是所声明的变量&#xff0c;只在let命令所在的代码块内有效。 <…

在线支付模块小结

一、概述 在所有的电子商务网站中都提供了在线支付功能&#xff0c;用户可以将在网上选购的商品生成订单后通过网站提供的在线支付功能进行结算。网站开发者可以直接使用银行提供的接口实现在线支付&#xff0c;也可以使用第三方支付平台来实现。使用银行接口需要自行开发程序&…

《03》JavaScript编码风格

探讨如何将 ES6 的新语法&#xff0c;运用到编码实践之中&#xff0c;与传统的 JavaScript 语法结合在一起&#xff0c;写出合理的、易于阅读和维护的JavaScript 风格规范代码。 目录 1.块级作用域 &#xff08;1&#xff09;let 取代 var &#xff08;2&#xff09;全局常量…

js 闭包作用域和作用域链_Java:伪造工厂的闭包以创建域对象

js 闭包作用域和作用域链最近&#xff0c;我们想创建一个域对象&#xff0c;该对象需要具有外部依赖关系才能进行计算&#xff0c;并且希望能够在测试中解决该依赖关系。 最初&#xff0c;我们只是在领域类中引入依赖关系&#xff0c;但这使得无法在测试中控制其值。 同样&…

读《第一次把事情做对》有感

上班的时候&#xff0c;领导在群里发了一个PDF书籍《第一次把事情做对》&#xff0c;被这个书籍名称吸引住了&#xff0c;因为作为程序员每天有开发新任务&#xff0c;解决旧任务的BUG&#xff0c;第一次就把事情做的完全正确几乎不可能呀&#xff0c;觉得很有看的必要&#xf…

Centos配置国内yum源

网易&#xff08;163&#xff09;yum源是国内最好的yum源之一 &#xff0c;无论是速度还是软件版本&#xff0c;都非常的不错&#xff0c;将yum源设置为163yum&#xff0c;可以提升软件包安装和更新的速度&#xff0c;同时避免一些常见软件版本无法找到。具体设置方法如下&…

做了三年前端,你才知道10分钟就能实现一个PC版魔方游戏

导读&#xff1a;最近手头有点紧&#xff0c;看到很多小朋友都在玩魔方&#xff0c;又没有money买&#xff0c;只能自己用JavaScriptcss实现一个&#xff0c;在电脑端就能开启魔方之旅。 目录 项目启动演示 项目目录 ​源码地址 项目启动演示 前端使用JavaScript和纯CSS实现…

UVA 2474 - Balloons in a Box 爆搜

2474 - Balloons in a Box题目连接&#xff1a; https://icpcarchive.ecs.baylor.edu/index.php?optioncom_onlinejudge&Itemid99999999&pageshow_problem&category36&problem475&mosmsgSubmissionreceivedwithID1967446 Description You must write a pr…

15K的前端应届毕业生,就因为掌握了这些知识点!(前端企业级开发必备)

目录 1.前端开发 下载安装VScode 优化配置 2、插件安装 3、设置字体大小 4、开启完整的Emmet语法支持 5、视图 2.Node.js 入门 2.1、什么是Node.js 2.2、Node.js有什么用 2.3、安装 下载&#xff1a; 2.4、快速入门 2.5、服务器端应用开发 3、ES6入门 3.2、let声…

[Training Video - 1] [Selenium Basics] [Download and Install Selenium]

Download Selenium Jars Configure jars in eclipse Webdriver http://docs.seleniumhq.org/download/ Selenium RC http://code.google.com/p/selenium/downloads/detail?nameselenium-remote-control-1.0.3.zip&can2&q转载于:https://www.cnblogs.com/MasterMonkInT…