精华内容
下载资源
问答
  • 那么到底一台服务器能够支持多少TCP并发连接呢? 首先需要考虑文件句柄的限制。在linux下编写网络服务器程序的朋友肯定都知道每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给...

    点击上方蓝色“程序猿DD”,选择“设为星标”

    回复“资源”获取独家整理的学习资料!

    作者 | 朱小厮

    来源 | 公众号「朱小厮的博客」

    曾几何时我们还在寻求网络编程中 C10K 问题的解决方案,但是现在从硬件和操作系统支持来看单台服务器支持上万并发连接已经没有多少挑战性了。有关 C10K(即单机1万个并发连接问题)的信息可以参考《上一个10年,著名的C10K并发连接问题[1]》和《The C10K problem[2]》这两篇文章。

    我们先假设单台服务器最多只能支持万级并发连接,其实对绝大多数应用来说已经远远足够了,但是对于一些拥有很大用户基数的互联网公司,往往面临的并发连接数是百万、千万、甚至上亿。虽然现在的集群,分布式技术可以为我们将并发负载分担在多台服务器上,那我们只需要扩展出数十台电脑就可以解决问题,但是我们更希望能更大的挖掘单台服务器的资源,先努力垂直扩展,再进行水平扩展,这样可以有效的节省服务器相关的开支(硬件资源、机房、运维人力、电力其实也是一笔不小的开支)。

    那么到底一台服务器能够支持多少TCP并发连接呢?

    首先需要考虑文件句柄的限制。在linux下编写网络服务器程序的朋友肯定都知道每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给我们的错误是“Socket/File:Can't open so many files”。这时你需要明白操作系统对可以打开的最大文件数的限制。我们可以通过 ulimit -n命令、/etc/security/limits.conf 文件 以及 /etc/sysctl.conf 文件等来修改文件句柄数。更多细节可以参阅 「朱小厮的博客」里的这篇文章《文件句柄?文件描述符?傻傻分不清楚》。

    其次要考虑的是端口范围的限制。操作系统上端口号1024以下是系统保留的,从1024-65535是用户使用的。由于每个TCP连接都要占一个端口号,所以我们最多可以有60000多个并发连接。我想有这种错误思路朋友不在少数吧?面试官也比较喜欢在这里引导挖坑,类似的问题还有:一个UDP连接可以复用已经被TCP连接占用的端口嘛?(可以在下方留言区留下你的答案。)

    如何标识一个TCP连接? 系统使用一个4四元组来唯一标识一个TCP连接:本地端口号 local port、本地IP地址 local ip、远端端口号 remote port、远端IP地址 remote ip。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并发连接数,实际上单机并发连接数肯定要受硬件资源(内存)、网络资源(带宽)的限制,至少对我们的需求现在可以做到数十万级的并发了。

    参考资料

    [1]

    上一个10年,著名的C10K并发连接问题: http://www.52im.net/thread-566-1-1.html

    [2]

    The C10K problem: http://www.kegel.com/c10k.html

    往期推荐

    轻轻一扫,立刻扣款,付款码背后的原理你不想知道吗?

     Windows 20 概念视频,这才是用户所需要的操作系统?

    同事埋了个坑:Insert into select语句把生产服务器炸了

    相同 SQL 下 Mybatis 查询结果和数据库竟然不一样!

    Star 10.9K!这份Google面试攻略,牛逼了!

    扫一扫,关注我

    一起学习,一起进步

    展开全文
  • 那就是一台服务器最大究竟能支持多少个网络连接?我想我有必要单独发一篇文章来好好说一下这个问题。 很多同学看到这个问题的第一反应是65535。原因是:“听说端口号最多有65535个,那长连接就最多保持65535个了”...

    困惑很多人的并发问题

    在网络开发中,我发现有很多同学对一个基础问题始终是没有彻底搞明白。那就是一台服务器最大究竟能支持多少个网络连接?我想我有必要单独发一篇文章来好好说一下这个问题。

    很多同学看到这个问题的第一反应是65535。原因是:“听说端口号最多有65535个,那长连接就最多保持65535个了”。是这样的吗?还有的人说:“应该受TCP连接里四元组的空间大小限制,算起来是200多万亿个!”

    如果你对这个问题也是理解的不够彻底,那么今天讲个故事讲给你听!

    一次关于服务器端并发的聊天

    图片

    "TCP连接四元组是源IP地址、源端口、目的IP地址和目的端口。任意一个元素发生了改变,那么就代表的是一条完全不同的连接了。拿我的Nginx举例,它的端口是固定使用80。另外我的IP也是固定的,这样目的IP地址、目的端口都是固定的。剩下源IP地址、源端口是可变的。所以理论上我的Nginx上最多可以建立2的32次方(ip数)×2的16次方(port数)个连接。这是两百多万亿的一个大数字!!"

    图片

    "进程每打开一个文件(linux下一切皆文件,包括socket),都会消耗一定的内存资源。如果有不怀好心的人启动一个进程来无限的创建和打开新的文件,会让服务器崩溃。所以linux系统出于安全角度的考虑,在多个位置都限制了可打开的文件描述符的数量,包括系统级、用户级、进程级。这三个限制的含义和修改方式如下:"

    • 系统级:当前系统可打开的最大数量,通过fs.file-max参数可修改

    • 用户级:指定用户可打开的最大数量,修改/etc/security/limits.conf

    • 进程级:单个进程可打开的最大数量,通过fs.nr_open参数可修改

    图片

    "我的接收缓存区大小是可以配置的,通过sysctl命令就可以查看。"

    $ sysctl -a | grep rmem
    net.ipv4.tcp_rmem = 4096 87380 8388608
    net.core.rmem_default = 212992
    net.core.rmem_max = 8388608
    

    "其中在tcp_rmem"中的第一个值是为你们的TCP连接所需分配的最少字节数。该值默认是4K,最大的话8MB之多。也就是说你们有数据发送的时候我需要至少为对应的socket再分配4K内存,甚至可能更大。"

    图片

    "TCP分配发送缓存区的大小受参数net.ipv4.tcp_wmem配置影响。"

    $ sysctl -a | grep wmem
    net.ipv4.tcp_wmem = 4096 65536 8388608
    net.core.wmem_default = 212992
    net.core.wmem_max = 8388608
    

    "在net.ipv4.tcp_wmem"中的第一个值是发送缓存区的最小值,默认也是4K。当然了如果数据很大的话,该缓存区实际分配的也会比默认值大。"

    图片

     

    服务端百万连接达成记

    图片

    “准备啥呢,还记得前面说过Linux对最大文件对象数量有限制,所以要想完成这个实验,得在用户级、系统级、进程级等位置把这个上限加大。我们实验目的是100W,这里都设置成110W,这个很重要!因为得保证做实验的时候其它基础命令例如ps,vi等是可用的。“

    图片

    图片

    活动连接数量确实达到了100W:

    $ ss -n | grep ESTAB | wc -l  
    1000024
    

    当前机器内存总共是3.9GB,其中内核Slab占用了3.2GB之多。MemFree和Buffers加起来也只剩下100多MB了:

    $ cat /proc/meminfo
    MemTotal:        3922956 kB
    MemFree:           96652 kB
    MemAvailable:       6448 kB
    Buffers:           44396 kB
    ......
    Slab:          3241244KB kB
    

    通过slabtop命令可以查看到densty、flip、sock_inode_cache、TCP四个内核对象都分别有100W个:

    图片

    图片

     

    结语

    互联网后端的业务特点之一就是高并发. 但是一台服务器最大究竟能支持多少个TCP连接,这个问题似乎却又在困惑着很多同学。希望今天过后,你能够将这个问题踩在脚下摩擦!

    学习是一件痛苦的事情,尤其咱们号里很多读者朋友都是工作满一天了再来看我的技术号的文章的。我一直都在琢磨到底怎么样组织技术内容形式,能让大家理解起来更能省一点脑细胞呢。这篇服务器的最大并发数的文章是早就想发的,但是写了两三个版本都不满意。今天终于想出了一种让大家更容易理解的方式,算过了自己这关了。

    如果您喜欢我的文章、并觉得它有用,期望您能不吝把它转发到你的朋友圈,技术群。或者哪怕是点个赞,点个再看都可以。触达更多的技术同学并收获大家的反馈将极大地提升彦飞的创作动力!

    本文由  张彦飞allen  授权 饭米粒 发布,转载请注明本来源信息和以下的二维码(长按可识别二维码关注)

    图片

    展开全文
  • 如何在单台服务器上实现百万级长连接,以下是实现该目标进行的一些优化:1.首先需要准备一台大内存的服务器,装上linux系统,比如rehat、centos(内核版本在2.6.25之上)等。 为什么需要大内存,因为每个连接都需要有...

    如何在单台服务器上实现百万级长连接,以下是实现该目标进行的一些优化:

    1.首先需要准备一台大内存的服务器,装上linux系统,比如rehat、centos(内核版本在2.6.25之上)等。

        为什么需要大内存,因为每个连接都需要有读写缓存,具体看第二部内容;

        为什么内核版本要在2.6.25之上,因为2.6.25内核之前有个 宏定义,定义了最大文件描述符大小为1024*1024,正好是100万。可以通过/proc/sys/fs /nr_open来设置该值。

    2.装好系统后,调整一下系统的参数,在/etc/sysctl.conf中

    #定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数,默认值为128
    net.core.somaxconn = 2048  
    #系统读写缓存,默认值
    net.core.rmem_default = 262144  
    net.core.wmem_default = 262144  
    #系统读写缓存
    net.core.rmem_max = 16777216  
    net.core.wmem_max = 16777216  
    net.ipv4.tcp_rmem = 4096 4096 16777216  
    net.ipv4.tcp_wmem = 4096 4096 16777216  
    net.ipv4.tcp_mem = 786432 3145728  4194304
    net.ipv4.tcp_max_syn_backlog = 16384  
    net.core.netdev_max_backlog = 20000  
    net.ipv4.tcp_fin_timeout = 15  
    net.ipv4.tcp_max_syn_backlog = 16384  
    net.ipv4.tcp_tw_reuse = 1  
    net.ipv4.tcp_tw_recycle = 1   

        net.ipv4.tcp_rmem用来配置tcp读缓冲的大小,第一个4096是这个读缓冲的最小值,第三个是最大值,中间的是默认值。zhe在程序中修改读缓冲的大小,但不能超过最小与最大。为了使每个socket所使用的内存数最小,我这里设置默认值为4096。

    net.ipv4.tcp_wmem用来配置写缓冲的大小。读缓冲与写缓冲在大小,直接影响到socket在内核中内存的占用,这就是第一条里说的为什么需要大内存。

        而net.ipv4.tcp_mem则是配置tcp的内存大小,其单位是页,而不是字节。当超过第二个值时,TCP进入 pressure模式,此时TCP尝试稳定其内存的使用,当小于第一个值时,就退出pressure模式。当内存占用超过第三个值时,TCP就拒绝分配 socket了,查看dmesg,会打出很多的日志“TCP: too many of orphaned sockets”。

    另外,服务端需要打开大量的文件描述符,比如200万个,配置如下:

    设置nofile为200万(2.6.25内核及其之后版本),这个值是可以通过/proc/sys/fs /nr_open来设置。

    现在再设置nofile就可以了:

    admin    soft    nofile  2000000  
    admin    hard    nofile  2000000 



    展开全文
  • 曾几何时我们还在寻求网络编程中C10K问题(有关C10K问题请见文章《The C10K problem(英文在线阅读、英文PDF版下载、中文译文)》)的解决方案...硬件和操作系统支持来看单台服务器支持上万并发连接已经没有多少挑战性了...

    前言


    曾几何时我们还在寻求网络编程中C10K问题(有关C10K问题请见文章《The C10K problem(英文在线阅读英文PDF版下载中文译文)》)的解决方案,但是现在从硬件和操作系统支持来看单台服务器支持上万并发连接已经没有多少挑战性了。

    我们先假设单台服务器最多只能支持万级并发连接,其实对绝大多数应用来说已经远远足够了,但是对于一些拥有很大用户基数的互联网公司,往往面临的并发连接数是百万、千万、甚至腾讯的上亿(注:QQ默认用的UDP协议,具体请见讨论贴《为什么QQ用的是UDP协议而不是TCP协议?》)。

    虽然现在的集群,分布式技术可以为我们将并发负载分担在多台服务器上,那我们只需要扩展出数十台电脑就可以解决问题,但是我们更希望能更大的挖掘单台服务器的资源,先努力垂直扩展,再进行水平扩展,这样可以有效的节省服务器相关的开支(硬件资源、机房、运维人力、电力其实也是一笔不小的开支)。

    那么到底一台服务器能够支持多少TCP并发连接呢?这就是本文要讨论的问题。

    C10K问题系列文章


    本文是C10K问题系列文章中的第1篇,总目录如下:

    常识一:文件句柄限制


    在linux下编写网络服务器程序的朋友肯定都知道每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给我们的错误是“Socket/File:Can't open so many files”。

    这时你需要明白操作系统对可以打开的最大文件数的限制。

    1进程限制


    执行 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

    2全局限制


    执行 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://www.52im.net/thread-561-1-1.html

    (原文链接:http://yaocoder.blog.51cto.com/2668309/1312821/,有改动)
    展开全文
  • 因为主程序是上位机做服务器用的,新程序在主程序中提一些数据给用户看报表,因为主程序有比较完善的TCP数据协议,因此信程序做个客户端来提数据,主程序就不用动了。做的过程中比较好奇,没有通过网口收发数据,...
  • 台服务器最大支持多少连接数

    万次阅读 2019-08-20 14:09:20
    在性能测试过程中,经常会接触到链接数相关的问题,有一个问题曾经困扰我好长时间,那就是一台服务器最多能支持多少链接数呢? 有的朋友可能会说是65535,因为操作系统有65535个端口,那么这个答案准确吗? 首先先...
  • 曾几何时我们还在寻求网络编程中C10K问题的解决方案,但是现在从硬件和操作系统支持来看单台服务器支持上万并发连接已经没有多少挑战性了。 我们先假设单台服务器最多只能支持万级并发连接,其实对绝大多数应用来说...
  • 在linux下编写网络服务器程序的朋友肯定都知道每tcp连接都要占个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给我们的错误是“Socket/File:Can'topen so many files”。 这时你需要明白操作...
  • 曾几何时我们还在寻求网络编程中C10K问题的解决方案,但是现在从硬件和操作系统支持来看单台服务器支持上万并发连接已经没有多少挑战性了。我们先假设单台服务器最多只能支持万级并发连接,其实对绝大多数应用来说...
  • http://www.52im.net/thread-561-1-1.html
  • TCP服务器最大能支持多少长连接

    千次阅读 2013-07-01 09:47:25
    服务器、客户端都在一台电脑上,服务器采用IOCP,客户端普通的socket,创建、连接、发送、接收,但不关闭,循环100000次,每次SLEEP(1), 测试环境:WIN XP 32 客户端在第13400左右次连接服务器失败;关闭...
  • 公众号后台回复“面试”,获取精品学习资料扫描下方海报了解专栏详情本文来源:朱小厮的博客《Java工程师面试突击(第3季)》重磅升级,由原来的70讲增至160讲,内容扩充倍多,升级部分内...
  • 刚刚写了个简单的服务器转发功能,没什么难的,大概分享一下服务器的代码,以供有需要的人参考(但请不要直接Copy)。 主要思路是这样的: 建个Map,Socket>存放着ip标示和相应的长连接Socket,需要转发时,从这个...
  • 那么到底一台服务器能够支持多少TCP并发连接呢? 首先需要考虑文件句柄的限制。在linux下编写网络服务器程序的朋友肯定都知道每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给...
  • MarioTCP:个可单机支持千万并发连接的TCP服务器

    万次阅读 多人点赞 2013-09-02 08:58:39
    请注意: 过去几年有不少朋友加我,心想对不住大家了,建个群聚聚大家伙,请大家群里畅所欲言…请加QQ群:564994650, 里面有不少linux c的研发同学。...同时他可以是个很简洁的Linux C 开发学习工程。毫不...
  • 2.1 TCP代理服务器可以隐藏背后真正TCP服务器 2.2 保护TCP服务器免受应用层以下级别的协议栈攻击 2.3 TCP转址机 3、socket透明代理的实现原理? 4、在实现TCP代理服务器时,遵循以下几点原则 5、应用背景 6、...
  • 该“Socket / 套接字”示例为同步的,如果你需要学习Socket...创建两个控制台项目 个为Server / 服务器 另个为Client / 客户端 服务器: namespace Server { using System; using System.Diagnostics; using S
  • 背景:同学公司的传感器设备需要将收集的数据发到服务器上,前期想写个简单的服务器来测试下使用效果,设备收集的数据非常的重要,所以考虑使用TCP协议来实现。 因为只是测试使用,所以采用多线程的方式,毕竟...
  • TCP通信】多客户端连接服务器端总结 Windows下TCP通信,多个客户端连接服务器端。 服务器端流程实现如下: 1、通过socket函数,创建基于流式类型的socket,可名为serverSocket...
  • jmeter测试TCP服务器/模拟发送TCP请求

    千次阅读 2015-03-12 11:49:58
    TCP采样器:打开个到指定服务器TCP / IP连接,然后发送指定文本并等待响应。 jmeter模拟发送TCP请求的方法: 1.新建线程组,然后在线程组中新建TCP采样器 TCP采样器中填写服务器地址、端口和“要发送的文本...
  • 如何用Go实现tcp代理服务器

    千次阅读 2018-07-26 21:36:05
    通过linux和C/C++来实现个代理服务器并不是那么容易,不仅要考虑内存管理和性能,还需要考虑同步和线程/进程管理等问题。为了保证性能,有时候还需要考虑和被代理的服务器保持长连接,这样就需要对链接进行管理。...
  • 如何标识TCP连接 在确定最大连接数之前,先来看看系统如何标识tcp连接。系统用个4四元组来唯一标识TCP连接:{local ip, local port,remote ip,remote port}。 client最大tcp连接数 client每次...
  • 与多台服务器连接我采用的是线程池,但是测试的时候出现一个问题,就是只上来一台服务器上的数据,而其他的服务器的数据没有上来,这个原因是什么?跟端口有关系么?我们采用的协议为Modbus tcp和FTP。
  • MrioTCP,超级马里奥,...当然,你也可以通过源码包的mario.c(maritcp服务器示例程序)来学习,可以很快入门上手进行Linux C开发。 经过两个多月的测试(编写c++客户端测试及调优系统参数),测试结果得到单
  • 服务器的UDP TCP端口的扫描工具 nmap UDP扫描
  • 一台服务器建立多个网站实现

    千次阅读 2006-05-12 10:15:00
    在工作中,不可避免得我们要在一台服务器建立多个Web站点,在IIS中通常有三种实现方式,如下:1、 多端口如上图所示,可以通过设定TCP端口来实现。2、 多IP如下图,点击添加,添加一个IP地址则在网站属性里面可以...
  • 实验目的: 在两电脑上实现个简单的TCP客户/服务器通信实例,使客户端能够想服务器连续发送字符信息。 实验说明:建立WIn32控制台应用程序,使用的是面向连接的TCP协议(SOCK_STREAM); 字符信息为每次任意...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 349,597
精华内容 139,838
关键字:

一台服务器支持多少tcp