yedf2 / handy

🔥简洁易用的C++11网络库 / 支持单机千万并发连接 / a simple C++11 network server framework
BSD 2-Clause "Simplified" License
4.56k stars 1.33k forks source link

单机并发千万,个人觉得"并发"一词用法不当。 #29

Closed y123456yz closed 7 years ago

y123456yz commented 7 years ago

单机并发千万,个人觉得"并发"一词用法不当,千万这个我猜对应的应该是多网卡物理机的qps,这个不叫并发。

要真并发千万,你一台物理机瞬间就给你压挂了。

你的千万应该指的是QPS吧,而且是长连接的qps(长链接估计也到不了,网卡队列软中断会消耗大量CPU),短连接qps更不可能到千万。 每个连接都要耗几十K内存,千万qps你内存也早爆了,CPU也抗不住的。

京东这种电商双11规模估计也才千万并发,并发的意思楼主可能误解了。

restmad commented 7 years ago

可能说的是长连接吧

dtm-labs commented 7 years ago

qps指的是query per seconds,是每秒请求数量。 单机千万并发连接我指的是同时保持千万个长连接。 千万条连接,每条连接约4K的内存,总共下来大约40G,内存没有爆,使用的是epoll模型,CPU也不会爆,而且还不高。 我的文章里面有提到qps大约是几万,在极光推送这类的应用中,就会出现这类的场景,连接很多,但qps很少,此时一台机器可以扛住大量大量的连接。 题主再查一查这几个词语常见的含义?

y123456yz commented 7 years ago

互联网场景下,并发的意思不是同时保持的链接,并发的意思是客户端同时发起链接。

你找多台客户端压一下,客户端开一千万个线程同时发起链接试试。客户端大量报错,服务端根本就处理不过来。

内核协议栈会给每个链接分配一个读buf和写buf空间,有几个阈值,如果千万链接同事有数据首发,你内存早爆了,除非你每个链接完全是空链接,不发送数据。

多进程模型同时accept客户端链接(nginx网络模型),linux-3.9一下内核版本不支持Reuseport ,多线程条件下内核无法做到链接负载均衡,accept线程收到这个限制,并发合理的情况下单机短连接QPS也就十万级别。如果内核版本大于3.9,内核负载自动实现accept分发到不同的accept应用线程,这种情况并发不高的情况下短连接qps也不会超过百万级。

如果应用程序只有一个accept线程接收链接,然后分发到各个工作线程读写数据(memcached模型),并发会更低,因为同一时刻只会有一个线程处理客户端accept事件信息。

并发真要千万级别,就只能用机器来抗了。

restmad commented 7 years ago

个人理解,并发应该是同一时刻

wardenlym commented 7 years ago

保持千万个长连接 确实不等于 千万并发

保持长连接所需要的消耗并不高,如果没请求,调高内核参数,所耗费的只有内存而已。 能有几万的并发,已经是很高性能的服务器了。

skyformat99 commented 7 years ago

各位大佬,写个压测程序试试看啊。 不知道效果如何呢? 长连接,同时发送ping-pong数据才算 。单连接不算。

dtm-labs commented 7 years ago

其实我的这篇文章里面写得很清晰,并发的连接有千万,里面有详细的步骤 https://zhuanlan.zhihu.com/p/21378825 对于前面提出来的同时创建连接,实际应用不会大量大量的用户同时上线或退出的,可以看成是一段时间内上线退出,这就不存在楼上的情况了

y123456yz commented 7 years ago

你那个应该叫总的链接数,不应该叫并发的链接。 会有歧义,容易误导。 例如我前两天无意中看到你这个,第一感觉:这个项目可以支持单机千万并发。

gaigeshen commented 7 years ago

说的是千万同时在线吧