文章来源:1. 开场白在开始今天的文章之前,先抛一个面试题出来:
https://mp.weixin.qq.com/s/ZynmF0GaplHsabIovopMSw
原文作者:程序员大白啊
你接触过的单机最大并发数是多少?思考几分钟,如果你可以有理有据地说出答案,那确实就不用再往下看了,关上手机去陪陪家人是个不错的选择 。
你认为当前正常配置的服务器物理机最大并发数可以到多少?
说说你的理解和分析 。
思考几分钟,如果你没有头绪或者对答案不确定,那么你先不用着急关闭页面去玩耍,你应该继续往下看,因为这个问题很不错 。
文章插图
对于后端开发人员来说,并发数往往和技术难度是呈正相关的,实际上也确实如此:体量决定架构 。
服务端根据不同业务场景会有不同的侧重点,单纯追求高并发其实并不是根本目的,高可用&稳定性更重要 。
所以最终我们的目的是:保证高可用高稳定的基础上追求高并发,降本增效 。
高可用&高并发是我们直观感受到的,本质上这是个复杂的系统工程,每个环节都会影响结果,每一块都值得研究和深入 。
文章插图
2. C10K问题和C10M问题在2000年初的时候,全球互联网的规模并不大,但是当时就已经提出了C10K问题,所谓C10K就是单机1w并发问题,虽然现在不觉得是个难题了,但是这在当初是很有远见和挑战的问题 。
文章插图
C10K问题最早由Dan Kegel发布于其个人站点,原文链接如下:
http://www.kegel.com/c10k.html相关资料显示Dan Kegel目前工作于google,从1978年起开始接触计算机编程,是Winetricks和Crosstool的作者,大佬年轻时的照片:
文章插图
Dan Kegel这篇文章阅读难度并不大,大白建议从事服务端开发或者对高性能网络开发有兴趣的读者尝试读一读 。
在APUE第三版都没有提到epoll,所以我们解决C10K问题的时间并不长,其中IO复用epoll/kqueue/iocp等技术对于C10k问题的解决起到了非常重要的作用 。
开源大神们基于epoll/kqueue等开发了诸如libevent/libuv等网络库,从而大幅提高了高并发网络的开发效率,对于C/C++程序员来说并不陌生 。
文章插图
这里简单提一下针对下一个10年的展望和挑战:C10M问题 。
站在浪尖的那一批人早就开始思考让单机达到1000w并发,现在听起来感觉不可思议,但是要达到这个目标,除了硬件上的提升,更重要的是对系统软件和协议栈的改造 。
文章插图
Errata Security的CEO Robert Graham在Shmoocon 2013大会上的演讲,大佬重要的观点是:
不要让OS内核执行所有繁重的任务:将数据包处理、内存管理、处理器调度等任务从内核转移到应用程序高效地完成,让诸如linux这样的OS只处理控制层,数据层完全交给应用程序来处理 。确实也是如此,难道你不觉得Linux内核做了太多不该自己做的事情了吗?
近几年出现的DPDK、PFRING、NETMAP等技术也是类似的思想,现在流行的协处理器+CPU的架构也是这样的:
文章插图
3. 服务器最大并发数分析前面提到的C10K和C10M问题都是围绕着提升服务器并发能力展开的,但是难免要问:服务器最大的并发上限是多少?
文章插图
3.1 五元组做过通信的盆友们一定听过五元组这个概念,一个五元组可以唯一标记一个网络连接,所以要理解和分析最大并发数,就必须理解五元组:
文章插图
这样的话,就可以基本认为:理论最大并发数 = 服务端唯一五元组数 。
3.2 端口&IP组合数
那么对于服务器来说,服务端唯一五元组数最大是多少呢?
有人说是65535,显然不是,但是之所以会有这类答案是因为当前Linux的端口号是2字节大小的short类型,总计2^16个端口,除去一些系统占用的端口,可用端口确实只剩下64000多了 。
推荐阅读
- 可算是有文章,把Linux零拷贝技术讲透彻了
- 服务器上网友上传重复图片太多,几步操作检测重复图片并删除
- Linux使用shell定时任务实现ffmpeg视频转码和截图
- 如何在各种Linux发行版中安装curl命令
- MySQL查看连接数
- 前端测试框架Jest——语法篇
- 利用shell脚本命令配置好完整的Samba共享服务器
- CentOS 7中常用的基础命令
- 一个因CA根证书过期引起的故障
- Linux下如何寻找相同文件?