前言: 我是一名golang后端开发工程师,不是Java,也不是拍黄片,对,就是那个号称原生支持高并发的“够浪!”。那为什么go能支持高并发?原生支持高并发又是何解?跟着我,一起探讨一下所谓的高并发是怎么回事…
阅读本文你将收获:
- 知道框架高性能的根本原因
- 了解进程,线程切换开销在哪里
- 熟悉阻塞与非阻塞IO,同步与异步调用的区别
大纲:
- 讨论一个高性能框架甚至语言的时候,我们在讨论什么?
- 三大网络模型
- 阻塞IO+多进程
- 阻塞IO+多线程
- 非阻塞IO+IO多路复用
- 五种网络IO简介
- 网络IO的本质
- 如何区分阻塞IO和非阻塞IO
- 如何区分同步和异步
- 个人整理的网络IO思维导图
1.讨论一个高性能框架甚至语言的时候,我们在讨论什么
我相信大家肯定听过什么阻塞/非阻塞IO,同步/异步调用,我也尝试过死记概念,结果大家应该都有体会,过一阵子就忘记了。知其然而不知其所以然~然并卵。
大家在选择一门语言或者一个框架的时候肯定优先看他的性能,也就是并发量,例如常用的测试手段,就是用该语言或者框架写个http server服务器,对于http请求返回一个“hello,world!”,利用wrk进行压测,看看每分钟请求量最高能到多少,在4核8G的Ubuntu服务器上跑该http服务,利用wrk压测,gin框架每分钟能处理的请求量接近300W!这是相当优秀的!
前一阵子在go meet up深圳讨论语言性能的时候,有位老哥说同等业务与机器,PHP每秒请求量大概在300多,处理三万并发量的服务程序,go需要一台服务器,而PHP需要一百台。我当时非常震惊,为什么语言之间的差别这么大,是什么原因造成这个巨大的差别呢?我问Boss Lee(meet up讲师,一位技术大佬),他跟我说因为PHP是一个请求开一个进程处理,注意是进程而不是线程!
那为什么用进程处理请求会造成性能差别这么大,甚至到了一百台服务器的差别呢?(一百台服务器一年得上百万吧~)
经过我查阅资料,得出了是网络IO模