高性能网络编程文章推荐
目录
- 单台服务器并发tcp连接数到底可以有多少?
- 上一个10年C10K并发连接问题
- 下一个10年C10M并发连接问题
- 从C10K到C10M高性能网络应用的理论探索
- 读懂网络编程中的I/O模型
- 读懂网络编程中的线程模型
- 到底什么是高并发?
- 当我们在谈论高并发的时候究竟在谈什么?
单台服务器并发tcp连接数到底可以有多少?
通过TCP连接4元组{local ip, local port,remote ip,remote port},我们知道server ip与port是绑定的,TCP连接数决定于remote ip与port,对于IPv4,不考虑私有地址等因素,有2的32次方的ip数,有2的16次方的port数,也就是说理论上单机的最大tcp数是2的(32+16)次方。
对于linux系统,一个tcp连接需要占用一个文件描述符,而系统一般默认最多可以打开1024个文件,可以通过ulimit -n查看,也就是说默认最多支持1000+个tcp连接并发,可以尝试调整到1000000,注意临时修改生效和永久生效。
系统tcp连接并发数,还会受到内存、cpu、带宽的限制。
上一个10年C10K并发连接问题
C10K,也就是单机1万个并发连接问题。
在过去10年里,互联网已经很好的解决了C10K问题。
对于im系统,比如QQ、微信已经无法满足C10K,也不仅仅是C10M,对他们来说是上亿的并发连接,当初通过UDP解决C10K问题,但现在也微信已经使用了TCP,关于udp和tcp协议选择问题,涉及到进程、线程模型的选择,epoll技术来晚了,但也不晚。
关于epoll模型:epoll模型
C10K本质:创建的进程线程多了,数据拷贝频繁(缓存I/O、内核将数据拷贝到用户进程空间、阻塞), 进程/线程上下文切换消耗大, 导致操作系统崩溃。
下一个10年C10M并发连接问题
C10M就是单机千万并发连接处理问题。
40gpbs、32-cores、256G RAM的X86服务器,以这样的硬件配置来看,完全可以处理1000万个以上的并发连接,如果它们不能,那是因为你选择了错误的软件,而不是底层硬件的问题。
解决的关键点在软件而不是在硬件,解决思想分而治之,术业有专攻,控制的专业处理控制,数据逻辑由专业的逻辑处理,类似于cpu还是做控制,GPU负责重复工作的渲染,让OS做OS应该做的控制,让应用处理应用逻辑。
从C10K到C10M高性能网络应用的理论探索
读懂网络编程中的I/O模型
阻塞与非阻塞
-
阻塞调用
是指调用结果返回之前,当前线程会被挂起,调用线程只有在得到结果之后才会返回;
-
非阻塞调用
指在不能立刻得到结果之前,该调用不会阻塞当前线程。
两者的最大区别在于被调用方在收到请求到返回结果之前的这段时间内,调用方是否一直在等待。
阻塞是指调用方一直在等待而且别的事情什么都不做;非阻塞是指调用方先去忙别的事情。
同步与异步
-
同步处理
同步处理是指被调用方得到最终结果之后才返回给调用方;
-
异步处理
是指被调用方先返回应答,然后再计算调用结果,计算完最终结果后再通知并返回给调用方。
阻塞、非阻塞和同步、异步的区别
阻塞、非阻塞和同步、异步主要区别在于针对的对象是不一样的:
- 阻塞、非阻塞的讨论对象是
调用者
; - 同步、异步的讨论对象是被
调用者
。
epoll模型
epoll不会让每个 socke t的等待队列都添加进程A引用,而是在等待队列,添加 eventPoll对象的引用。 当socket就绪时,中断程序会操作eventPoll,在eventPoll中的就绪列表(rdlist),添加scoket引用。 这样的话,进程A只需要不断循环遍历rdlist,从而获取就绪的socket。 从代码来看每次执行到epoll_wait,其实都是去遍历 rdlist。
如果rdlist为空,那么就阻塞进程。 当有socket处于就绪状态,也是发中断信号,再调用对应的中断程序。 此时中断程序,会把socket加到rdlist,然后唤醒进程。进程再去遍历rdlist,获取到就绪socket。
总之: poll是翻译轮询的意思,我们可以看到poll和epoll都有轮询的过程。 不同点在于: poll轮询的是所有的socket。 而epoll只轮询就绪的socket。
IO模型比较
读懂网络编程中的线程模型
在 Linux 下实现高并发网络编程都是以 Reactor 模型为主。
- 单 Reactor 单线程,接待员和侍应生是同一个人,全程为顾客服务;
- 单 Reactor 多线程,1 个接待员,多个侍应生,接待员只负责接待;
- 主从 Reactor 多线程,多个接待员,多个侍应生。