单机千万并发连接实战

  c10k,c100k,c1000k等问题大家都已经司空见惯,那么10m(千万)并发连接呢?今天就来一起挑战一下吧。

准备机器

  10m连接,大家的个人电脑肯定无法满足要求,如果不是在大公司任职,弄个实际的物理机对大家是个奢望。那么怎么办?我也面临同样问题。

  现在的云计算这么发达,还可以按小时计费,一小时的费用也就几元,那就试试云计算产品吧。小编先是在阿里云上测试,但阿里云的按需付费主机配置不高,费了不少时间,最终只跑到了3m个连接。阿里云的不行,是主机的配置问题还是程序的问题呢?为了得到最终的结论,我尝试了其他的云产品,最终ucloud的云主机给了我兴奋的答案。

  首先创建ucloud主机

ucloud主机(一共需要两台,一台作为服务器,一台作为客户端):

. 选择主机管理的创建主机

. 系统选择ubuntu14.4 64bit (小编的测试程序是c++11,需要高版本的g++)

. 机型标准版

. 网络增强一定要选择开启 (千万连接是网络IO密集型,网络当然要强大型)

. cpu 16核 内存64G 数据盘0

. 下一步中的网络类型选择基础网络即可,创建主机之后,需要购买弹性ip,并且绑定到主机

. 价格:小编实验时,上述的配置,一台仅需7.2元一小时,两台不到15元

  做实验的时候,大家记得要眼疾手快哦,一小时十几元,获得了自己想要的结果就赶紧释放主机哈

调整参数

  10m并发连接对系统是个挑战,需要调整相关的参数

sysctl -w fs.file-max=10485760 #系统允许的文件描述符数量10m
sysctl -w net.ipv4.tcp_rmem=1024 #每个tcp连接的读取缓冲区1k,一个连接1k,10m只需要10G
sysctl -w net.ipv4.tcp_wmem=1024 #每个tcp连接的写入缓冲区1k
echo ‘* soft nofile 1048576‘ >> /etc/security/limits.conf #用户单进程的最大文件数,用户登录时生效
echo ‘* hard nofile 1048576‘ >> /etc/security/limits.conf #用户单进程的最大文件数,用户登录时生效
ulimit -n 1048576 #用户单进程的最大文件数 当前会话生效

部署测试程序

  下面可以开始部署我们的测试程序了

apt-get update
apt-get install -y screen git make g++ nload iptraf

git clone https://github.com/yedf/handy
cd handy
make -j4
cd examples

运行测试程序

  选取一台主机S作为服务器,运行命令

python 1kw-svr.py 1000 1000 10

  该脚本会以job方式启动十个进程,每个进程监听100个端口,一共监听了1000-2000的1000个端口,每个服务器简单的echo收到的数据

  选取另一台主机C作为客户端,在screen里运行命令(需要填写S的内网ip)

python 1kw-cli.py ip-S 1000 2000 10000000 1000 300

  该脚本会以job启动1000个进程,每个进程会产生1w(10000000/1000)个连接,连接S的1000-2000端口。最后的300表示每300秒往服务器发送一个数据包

  每个进程都会几秒输出一条信息,1000个进程会造成刷屏,表面刷屏数据导致的外网网络流量可能影响ssh,一般观察一小段时间后,小编就detach screen了

  10m连接的创建需要花费不少时间的,如果疯狂的创建连接,导致的结果是很多连接都不成功,于是脚本每启动一个进程,睡眠0.5s,让连接的创建速度保持在2w/s,因此大约需要10分钟的时间才能把所有连接都创建成功。

观察结果

  然后,10m连接的建立就不需要更多的步骤啦,使用命令

watch ss -s

  我们就可以开始观察连接的创建进度啦,看着连接渐渐的往上走,超过10w,100w是不是很有成就感。

更多内容

  还可以通过iptraf,nload等工具来查看系统的网络情况

  系统在上面千万连接运行中,并没有多少的负载,当然啦,一部分负载跑到底层的hypervisor去了

  小编实验的机器上内存占用大约40G,平均一个连接前后一共用了4k,不多不多

  网络发包数量是3w/s,收包数量是6w/s,这是为什么呢?熟悉tcp协议的同学可能已经知道了,C发送数据,S回应数据并带了ACK,C需要对S发送的数据ACK

  大家还可以跑两个发送大量数据的程序,例如

./1kw-cli ip-S 1000 2000 10000 0 1024

  这个程序会打开10000个连接,不断的与S进行数据收发,数据大小为1024Byte

  小编这里启动了两个这样的程序,网卡流量立刻就超过了500MBit/s

  写到这里,顺便给出我测是的ucloud主机的性能参数吧:

  网卡流量最多可以到1.2GBit/s,并非所有时间都到了这么高,并不稳定,一般在800M-1.2G之间波动

  tcp收包发包的最高qps是12w/s,多了就上不去了

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 03:02:33

单机千万并发连接实战的相关文章

千万并发连接实战

c10k,c100k,c1000k等问题大家都已经司空见惯,那么10m(千万)并发连接呢?今天就来一起挑战一下. 准备机器10m连接,大家的个人电脑肯定无法满足要求,如果不是在大公司任职,弄个实际的物理机对大家是个奢望.那么怎么办?我也面临同样问题.现在的云计算这么发达,还可以按小时计费,一小时的费用也就几元,那就试试云计算产品吧.小编先是在阿里云上测试,但阿里云的按需付费主机配置不高,费了不少时间,最终只跑到了3m个连接.阿里云的不行,是主机的配置问题还是程序的问题呢?为了得到最终的结论,我尝

《Java并发编程实战》要点笔记及java.util.concurrent 的结构介绍

买了<java并发编程实战>这本书,看了好几遍都不是很懂,这个还是要在实战中找取其中的要点的,后面看到一篇文章笔记做的很不错分享给大家!! 原文地址:http://blog.csdn.net/cdl2008sky/article/details/26377433 Subsections  1.线程安全(Thread safety) 2.锁(lock) 3.共享对象 4.对象组合 5.基础构建模块 6.任务执行 7.取消和关闭 8.线程池的使用 9.性能与可伸缩性 10.并发程序的测试 11.显

《Java并发编程实战》第十章 避免活跃性危险 读书笔记

一.死锁 所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去. 百科百科 当两个以上的运算单元,双方都在等待对方停止运行,以取得系统资源,但是没有一方提前退出时,这种状况,就称为死锁.维基百科 1. 顺序死锁 最少有两个锁,一个线程获取到A锁需要获取B锁才能进行操作,而另外一个线程获取到了B锁,需要获取A锁才能执行操作,这种情况下容易出现顺序死锁. public class LeftRightDeadlock { priva

《Java并发编程实战》读书笔记

Subsections 线程安全(Thread safety) 锁(lock) 共享对象 对象组合 基础构建模块 任务执行 取消和关闭 线程池的使用 性能与可伸缩性 并发程序的测试 显示锁 原子变量和非阻塞同步机制 一.线程安全(Thread safety) 无论何时,只要多于一个线程访问给定的状态变量.而且其中某个线程会写入该变量,此时必须使用同步来协助线程对该变量的访问. 线程安全是指多个线程在访问一个类时,如果不需要额外的同步,这个类的行为仍然是正确的. 线程安全的实例: (1).一个无状

《环信支持千万并发即使通讯的技术要点》阅读摘要

一天早上起来,偶然机会看到<环信支持千万并发即使通讯的技术要点>演示文档,简单翻阅之后,感觉干货很多,于是快速记下以下笔记. 一.IM协议和IM Server XMPP确实很传统,WhatsApp选用了,同时经过压缩.精简(比如说user字符串使用u字符替代)处理,让XMPP轻量不少. MQTT,如何实现群组.好友呢,这个是业务层面上事情,大家都订阅某一个主题Topic好了,属于业务拓展. SIP,接触少. 微信私有协议ActivitySync,以前在博客上分享过. 正确拼写是WhatsApp

Tomcat(tomcat虚拟主机,Tomcat日志,单机多实例配置实战,JVM设置和连接数设置)

一.配置Tomcat的虚拟主机 一.Tomcat虚拟主机基本配置. 在介绍nginx和apache的时候,我们都有提过虚拟主机,在tomcat中也有这么一说, [[email protected] ~]# vim /usr/local/tomcat/conf/server.xml 搜索/Host,其中<Host>和</Host>之间的配置为虚拟主机配置部分,name定义域名,appBase定义应用的目录,Java的应用通常是一个Jar的压缩包,将jar的压缩包放到appBase目录

[笔记][Java7并发编程实战手册]3.2 资源的并发访问控制Semaphore信号量

[笔记][Java7并发编程实战手册]系列目录 简介 本文学习信号量Semaphore机制. Semaphore 本质是一个共享锁 内部维护一个可用的信号集,获取信号量之前需要先申请获取信号数量:用完之后,则需要释放信号量:如果不释放,那么其他等待线程则一直阻塞直到获取信号量或则被中断为止 本人的理解是:互斥锁是同一时间只能一个线程访问,而在这里,是同一时间允许获取到了信号量的线程并发访问,而没有获取到信号量的则必须等待信号量的释放: 将信号量初始化为 1,使得它在使用时最多只有一个可用的许可,

java并发编程实战学习(3)--基础构建模块

转自:java并发编程实战 5.3阻塞队列和生产者-消费者模式 BlockingQueue阻塞队列提供可阻塞的put和take方法,以及支持定时的offer和poll方法.如果队列已经满了,那么put方法将阻塞直到空间可用:如果队列为空,那么take方法将阻塞直到有元素可用.队列可以是有界的也可以是无界的. 如果生产者生成工作的速率比消费者处理工作的速率款,那么工作项会在队列中累计起来,最终好紧内存.同样,put方法的阻塞特性也极大地简化了生产者的编码.如果使用有界队列,当队列充满时,生产者将阻

[笔记][Java7并发编程实战手册]4.3 创建固定的线程执行器newFixedThreadPool线程池

[笔记][Java7并发编程实战手册]系列目录 简介 newFixedThreadPool(int nThreads, ThreadFactory threadFactory) 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程,在需要时使用提供的 ThreadFactory 创建新线程. newCachedThreadPool()创建的线程池的特性是:自动回收不使用的线程(终止并从缓存中移除那些已有 60 秒钟未被使用的线程),(在无可用线程的情况下)自动的为新来的task创