单机tcp并发连接

原创 2015年07月09日 14:51:43

单机tcp并发连接

突然想起面试时候面试官对我说的“我们服务器已经可以做到单机百万连接了”。当时也不是很明白有什么了不起的,三年了还记得他说过这句话。总结下服务端对于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的值。

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下需要修改的地方有:

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业务的处理还是很困难的。

参考:

100万并发连接服务器笔记之准备篇
http://www.blogjava.net/yongboy/archive/2013/04/09/397559.html
100万并发连接服务器笔记之测试端就绪
http://www.blogjava.net/yongboy/archive/2013/04/10/397631.html
100万并发连接服务器笔记之1M并发连接目标达成
http://www.blogjava.net/yongboy/archive/2013/04/11/397677.html

C1000k测试服务器支持的tcp连接数

首先需要检查一下服务器进程可以打开的文件数目: ulimit -n 如果数目过小则在测试中会报文件数目不够的错误,此处可以先临时修改一下: ulimit -n 200000 此...
  • u010472499
  • u010472499
  • 2016年12月16日 18:18
  • 1053

模拟百万级TCP并发

TCP并发是指一个服务器同时“hold住”的连接数量,确切的说就是指服务器端看到的“ESTABLISHED”状态的TCP连接数量。通过netstat -n|grep ^tcp|awk '{print ...
  • u011001084
  • u011001084
  • 2017年01月05日 09:16
  • 943

socket跟TCP/IP 的关系,单台服务器上的并发TCP连接数可以有多少

常识一:文件句柄限制 在linux下编写网络服务器程序的朋友肯定都知道每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给我们的错误是“Socket/File:Can'...
  • huangjin0507
  • huangjin0507
  • 2016年09月01日 10:04
  • 9840

Linux网络编程——tcp并发服务器(多线程)

tcp多线程并发服务器 多线程服务器是对多进程服务器的改进,由于多进程服务器在创建进程时要消耗较大的系统资源,所以用线程来取代进程,这样服务处理程序可以较快的创建。据统计,创建线程与创建进程要快 ...
  • lianghe_work
  • lianghe_work
  • 2015年06月15日 15:27
  • 8261

高性能网络编程(一):单台服务器并发TCP连接数到底可以有多少

前言 曾几何时我们还在寻求网络编程中C10K问题(有关C10K问题请见文章《The C10K problem(英文在线阅读、英文PDF版下载、中文译文)》)的解决方案,但是现在从硬件和操作系统支...
  • u013954399
  • u013954399
  • 2017年01月17日 19:45
  • 4107

实现TCP并发服务器之一(多进程)

下面用多进程方式实现一个TCP并发服务器,每当一个新的客户端连接时fork一个子进程去和它通信。(各种主流的web服务器都不是纯粹的多进程方式运行,比如apache在每个进程中都用多路复用方式,直到连...
  • ciaos
  • ciaos
  • 2012年07月04日 08:05
  • 1693

关于 TCP 并发连接的几个思考题与试验

陈硕 (giantchen AT gmail)blog.csdn.net/Solstice前几天我在新浪微博上出了两道有关 TCP 的思考题,引发了一场讨论 http://weibo.com/1701...
  • Solstice
  • Solstice
  • 2011年07月01日 12:51
  • 71504

慎用TCP的选项SO_LINGER

1               慎用TCP的选项SO_LINGER最近有一次性能测试,通讯程序出现错误,表现为服务器处理速度明显降低,检查发现服务器的很多句柄出于TIME_WAIT状态,Justin这...
  • fullsail
  • fullsail
  • 2009年08月08日 01:01
  • 18740

tcp短连接TIME_WAIT问题解决方法大全(2)——SO_LINGER

SO_LINGER是一个socket选项,通过setsockopt API进行设置,使用起来比较简单,但其实现机制比较复杂,且字面意思上比较难理解。 解释最清楚的当属《Unix网络编程卷1》中的说明(...
  • yah99_wolf
  • yah99_wolf
  • 2012年11月04日 21:48
  • 10753

setsockopt :SO_LINGER 选项设置

 setsockopt 设置 SO_LINGER 选项    此选项指定函数close对面向连接的协议如何操作(如TCP)。内核缺省close操作是立即返回,如果有数据残留在套接口缓冲区中则系统将试着...
  • factor2000
  • factor2000
  • 2009年02月23日 17:55
  • 60985
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:单机tcp并发连接
举报原因:
原因补充:

(最多只允许输入30个字)