单机千万并发链接实战(修订版)

c10k,c100k,c1000k等问题你们都已经司空见惯,那么10m(千万)并发链接呢?今天就来一块儿挑战一下。
下面咱们使用handy库自带的例子程序,来跑出一个单机千万并发链接的实例,先上操做步骤,后面解释。linux

准备机器nginx

10m链接,你们的我的电脑确定没法知足要求,若是不是在大公司任职,弄个实际的物理机对你们是个奢望。那么怎么办?我也面临一样问题。
如今的云计算这么发达,还能够按小时计费,一小时的费用也就几元,那就试试云计算产品吧。小编先是在阿里云上测试,但阿里云的按需付费主机配置不高,费了很多时间,最终只跑到了3m个链接。阿里云的不行,是主机的配置问题仍是程序的问题呢?为了获得最终的结论,我尝试了其余的云产品,最终ucloud的云主机给了我兴奋的答案。c++

首先建立ucloud主机
ucloud主机(一共须要两台,一台做为服务器,一台做为客户端):
. 选择主机管理的建立主机
. 系统选择ubuntu14.4 64bit (小编的测试程序是c++11,须要高版本的g++)
. 机型标准版
. 网络加强必定要选择开启 (千万链接是网络IO密集型,网络固然要强大型)
. cpu 16核 内存64G 数据盘0
. 下一步中的网络类型选择基础网络便可,建立主机以后,须要购买弹性ip,而且绑定到主机
. 价格:小编实验时,上述的配置,一台仅需7.2元一小时,两台不到15元git

作实验的时候,你们记得要眼疾手快哦,一小时十几元,得到了本身想要的结果就赶忙释放主机哈github

调整系统参数ubuntu

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
sysctl -w net.ipv4.ip_local_port_range='1024 65535' #修改默认的本地端口范围
sysctl -w net.ipv4.tcp_tw_recycle=1 #快速回收time_wait的链接
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_timestamps=1
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

git checkout 97b5426f91d37

make -j4

运行测试程序

选取一台主机S做为服务器,运行服务器
10m/10m-svr 100 300 10 301 #启动10个子进程,每一个进程分别监听100-300的端口

选取另外一台主机C做为客户端,运行客户端,(须要填写S的内网ip)
10m/10m-cli 100 300 10000000 500 10 600 64 301 #启动10个客户端子进程,每600秒发送一个心跳

观察结果

而后,10m链接的创建就不须要更多的步骤啦,使用命令
watch ss -s
咱们就能够开始观察链接的建立进度啦,看着链接渐渐的往上走,超过10k,100k, 1m是否是颇有成就感。

说明

并发链接数到达千万时,有诸多方面的问题须要解决:

. 单进程最大文件数量限制:limit -n 最多能把这个数字修改到1048575,所以单个进程最多可以打开百万个文件,千万并发链接须要千万个文件描述符,因而咱们使用多进程来作到千万文件的支持

.多进程之间的负载均衡:nginx使用多进程来增长本身的吞吐量,采用共享锁的方式来平衡负载,对核数较多的服务器,较多的进程并无达到性能的线性提高。最新的linux内核引入了SO_REUSEPORT选项,该选项能够自动平衡监听同一端口的多进程,是内核级的解决方案。handy采用该方案,优于nginx的共享锁。

.测试中客户端本地端口不够:让服务器监听了200个端口,这样客户端链接服务器的每一个端口只有50k个链接,而后加大默认的本地端口范围就能够知足要求(见前面的服务器系统参数)

测试中若是一次性建立千万个链接,则绝大部分的链接建立都会失败,所以让客户端每100ms建立2000个链接,提升链接建立的成功率。

系统在运行中,并无多少的负载,固然啦,一部分负载跑到底层的hypervisor去了

小编实验的机器上内存占用大约40G,平均一个链接先后一共用了4k,很少很少

你们能够经过iptraf,nload等工具来查看系统的网络状况

写到这里,顺便给出我测是的ucloud主机的性能参数吧:网卡流量最多能够到1.2GBit/s,并不是全部时间都到了这么高,并不稳定,通常在800M-1.2G之间波动tcp收包发包的最高qps是12w/s,多了就上不去了

相关文章
相关标签/搜索