单机如何实现百万并发TCP连接

单机如何实现百万并发TCP连接,第1张

一开始我无法理解,单机怎么可能实现百万并发连接,因为系统可用端口数只有:65535 - 1024 = 64511,每个TCP连接需要占用一个独立的端口,那最多也只能做到6W多并发连接。然而我忽视了一个很基本的问题,端口号在同一个IP下不能重复,但我们可以给一个网卡绑定多个IP地址,如果单机要主动发起100万并发连接,我们最少需要使用17个IP地址。

TCP服务器监听在指定端口接收客户端连接后,创建一个新的socket用于同客户端进行读写数据,但该socket并不需要也不会绑定一个新的端口,所以对于TCP服务器来说,不存在端口不够用的情况,TCP服务器能够保持多少个并发连接取决于服务器性能、内存大小、带宽大小以及服务器端设置(例如:进程能打开的文件数等)。以100W连接数为例,所需要总内存大小大约为:1,000,000 20K = 20G, 广播一个1KB的消息需要占用的带宽:1,000,000 1K = 1000M,所需打开文件描述符1,000,000个。

对于TCP服务器连接数压力测试来说,瓶颈在客户端,因为每个客户端要连接到TCP服务端需要使用一个本地端口,而对于一个IP地址来说,端口范围就是:0-65536,其中还要一些端口被系统或其他程序使用。所以从一台主机单个IP上发起同TCP服务器的连接数理论最大值为65535,当然我们可以给该主机绑定N个IP地址,同时从多个IP发起连接,所以理论上客户端可以发起的连接数为:IP数*65535,这时客户端的CPU、内存和带宽以及文件句柄资源就是限制。

100万并发连接服务器笔记之Java Netty处理1M连接的预测如下:

1、不说Netty会如何,服务器都有可能直接崩溃掉。

2、按平均每链接传输数据1K,100W链接大概数据量会在1G左右,G级服务器网卡也受不了的。

3、在网络编程中对单机来讲,成功解决了C10K的问题,这种M级别的链接,可能暂时解决不了。

4、对于如此大的并发,一般都是通过负载均衡的方式进行处理,如新浪微博,同时在线100W以上,通过约100多个节点处理,每个节点也就才10000并发左右。

总结如下:

1、JVM需要提前指定堆大小,相比Erlang/C,这可能是个麻烦。

2、GC(垃圾回收),需要持续不断的根据日志、JVM堆栈信息、运行时情况进行JVM参数微调。

3、设置一个最大连接目标,多次测试达到顶峰,然后释放所有连接,反复观察内存占用,获得一个较为合适的系统运行内存值。

4、Eclipse Memory Analyzer结合jmap导出堆栈DUMP文件,分析内存泄漏,还是很方便的。

5、想修改运行时内容,或者称之为热加载,默认不可能。

之前了解了一下国内某团购网站的架构,其中提到了服务器硬件和pv以及qps的一些关系。

百万级别的访问量,应该指的是PV吧。

并发数计算PV的粗算计算公式是

qps(或并发数)x86400(秒)÷2(分昼夜)

所以PV100万粗算来并发数只有23。

按照经验,剥离图片和js,css等静态页面,纯动态内容。一台4核4G内存的机器可以抗住100左右的并发数。

百万pv小网站的并发只有23.1000000÷86400x2=23

4核4G,能抗住100左右的并发,日五百万级别的pv了。

服务器资源的消耗主要是后端程序这一块,例如tomcat或php等其他需要链接数据库的程序,还有些需要编译的内容。所以这个公式只能是粗算,因为提供的服务大家各不相同。

概念:

QPS=req/sec=请求数/秒

qps是new的请求,叫每秒新建链接数,很多连接进来的链接,已经tcp三次握手的完成内容交互之后的,没有超过tcp的断开时间,虽然是活动状态,但是已经基本不消耗服务器资源了,这种是最大活动链接数,每台机器65535个链接数,这个链接数基本不考虑。

PV=PageView

pv是指页面被浏览的次数,比如你打开一网页,那么这个网站的pv就算加了一次。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/285913.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-22
下一篇2023-04-22

发表评论

登录后才能评论

评论列表(0条)

    保存