百万并发
服务器百万并发是指能够承载的客户端的数量,也就是说可以承接100w个客户端的连接。通常来说服务器的并发量还与业务、与后台数据库的承载量有关,本文中只考虑做到百万连接建立,不做业务处理.。
测试准备
相应的服务器请参考前文:《用反应器模式和epoll构建百万并发服务器》。
所需的客户端请参考文章末尾。
需要的环境,1台8G8核的ubuntu(配置服务器),3台4G4核的ubuntu(配置客户端,每个客户端负责的连接数尽量平均,也就是33.33w)。如果电脑资源足够,性能够好,建议把配置做大些,问题会少不少。
解决连接上限问题
先用一台客户端尝试向服务器发起大量连接,发现报错。
再看看服务器的情况,同样是报错。
我们用ulimit -a查看服务器情况发现是一个进程最多能打开1024个文件,也就是建立1024个文件描述符。于是用ulimit -n解决,客户端和服务器都需要解决这些问题。
解决五元不组问题
服务器每建立一个连接,都会在内核中建立一个tcp控制块,简称tcb。tcb包含了以下元素:源ip,目的ip,源port,目的port,协议类型(tcp,udp等)。
通常协议类型和目的ip(服务器ip)是固定下来的。百万并发确保每个连接都对应剩下3个元素的不同的排列组合,若不能保证,产生的问题叫“五元不组”。
源port一般不被客户端指定,一台机子可用的port大概是(65535-1024)个,1024是因为部分非用户主动空控制的程序也在使用端口,在高并发下情况下1024-65535可能会无法用尽。
因此解决“五元不组”通常由以下几种解法:
-
源ip多样化:多准备几个不同ip的客户端。
-
目的port多样化:让服务器多开几个listen port并且负载均衡。
-
源port多样化,修改/etc/sysctl.conf文件,明确指定客户端在本地的端口的可用范围。
本文中两种方法都用,基于解法1配置了3台不同的ubuntu,每台上都有1个客户端。基于解法2服务器开了20个监听端口,并且客户端循环地进行connect。
基于解法3,则需要修改客户端所在的ubuntu的配置文件。
如图,在相关配置文件的末尾添加一条语句: