c10k,c100k,c1000k等问题大家都已经司空见惯,那么10m(千万)并发连接呢?今天就来一起挑战一下。
下面我们使用handy库自带的例子程序,来跑出一个单机千万并发连接的实例,先上操作步骤,后面解释。
准备机器
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
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,多了就上不去了
分享到:
相关推荐
### Java并发编程实战知识点概述 #### 一、Java并发特性详解 在《Java并发编程实战》这本书中,作者深入浅出地介绍了Java 5.0和Java 6中新增的并发特性。这些特性旨在帮助开发者更高效、安全地编写多线程程序。书中...
标题 "cpp-简洁易用的C11网络库支持单机千万并发连接" 提到的是一个基于C++11标准的网络库,该库旨在提供高效且易于使用的网络服务器框架,能够支持高并发连接,最高可达千万级别的并发连接。这在处理大量并发请求的...
《Java并发编程实战》这本书是关于Java语言中并发编程技术的经典著作。它详细介绍了如何在Java环境中有效地实现多线程程序和并发控制机制。在Java平台上,由于其本身提供了强大的并发编程支持,因此,掌握并发编程...
CPPC++_简洁易用的C11网络库 支持单机千万并发连接 a simple C11 network server
《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南。这本书旨在帮助开发者理解和掌握在Java环境中创建高效、可扩展且可靠的多线程应用程序的关键技术和实践。它涵盖了从基本概念到高级主题的广泛内容,...
《Java并发编程实战》是Java并发编程领域的一本经典著作,它深入浅出地介绍了如何在Java平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...
JAVA并发编程实践中文版 英文版 原书源码 带书签 java_concurrency_in_practice.pdf 英文版还是不错的,但是中文版的译者典型的没有技术功底,介绍上说什么专家, 翻译的非常差劲,有些句子都不通顺,都不知道自己去...
《Java 并发编程实战》是一本专注于Java并发编程的权威指南,对于任何希望深入了解Java多线程和并发控制机制的开发者来说,都是不可或缺的参考资料。这本书深入浅出地介绍了如何在Java环境中有效地管理和控制并发...
《C++并发编程实战》是一本深入探讨C++并发编程技术的书籍,其源码库名为Cpp-Concurrency-in-Action-master。并发编程是现代多核处理器环境下提高软件性能的关键技术,C++作为一门强大且灵活的编程语言,提供了丰富...
1.1 并发简史 1.2 线程的优势 1.2.1 发挥多处理器的强大能力 1.2.2 建模的简单性 1.2.3 异步事件的简化处理 1.2.4 响应更灵敏的用户界面 1.3 线程带来的风险 1.3.1 安全性问题 1.3.2 活跃性问题 1.3.3 ...
《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南,由Tim Peierls等人与Brian Goetz合著,旨在帮助Java开发者理解和掌握在多线程环境中编写高效、安全的代码。这本书由拥有丰富经验的JDK并发大师及...
62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java...
在某些情况下,特别是对于需要大量并发连接的应用,如服务器或者进行大数据传输的环境,系统默认的并发连接数可能无法满足需求。"SP3_TCPIP并发连接数修改"是指针对Windows XP Service Pack 3 (SP3) 版本的操作系统...
《Java并发编程实战》是Java开发者必读的经典书籍之一,它深入浅出地探讨了Java平台上的并发编程技术。这本书不仅提供了理论知识,还包含了大量实际应用案例和源码,帮助读者更好地理解和掌握多线程编程的核心概念。...
Java并发编程实战(中文版)
java 并 发 编 程 实 战 和 java 并 发 编 程 实 战 手 册, p d f 格 式 ,欢 迎 有 愿 学 习并 发 的 同 仁下 载
本书首先介绍了Go语言的优秀特性、安装设置方法、工程结构、标准命令和工具、语法基础、数据类型以及流程控制方法,接着阐述了与多进程编程和多线程编程有关的知识,然后重点介绍了goroutine、channel以及Go提供的...