Golang适合高并发场景的原因分析
典型的两个现实案例:
我们先看两个用Go做消息推送的案例实际处理能力。
360消息推送的数据:
京东云消息推送系统
(团队人数:4)
单机并发tcp连接数峰值118w
内存占用23G(Res)
Load 0.7左右
心跳包 4k/s
gc时间2-3.x s
C10K问题
http://www.kegel.com/c10k.html (英文版)
Coroutine模型 和 非阻塞/异步IO(callback)
多进程
这种模型在linux下面的服务程序广泛采用,比如大名鼎鼎的apache。
下图说明了Apache的生命周期(prefork模式)。主进程负责监听和管理连接,而具体的业务处理都会交给子进程来处理。
2008年时的数据:http://www.blogjava.net/daniel-tu/archive/2008/12/29/248883.html
http://wenku.baidu.com/view/c527582a453610661ed9f40f.html
Apache的问题
参考:http://www.csdn.net/article/2013-05-16/2815317-The-Secret-to-10M-Concurrent-Connections
多线程
这种模型在windows下面比较常见。它使用一个线程来处理一个client。他的好处是编程简单,最重要的是你会有一个清晰连续顺序的work flow。简单意味着不容易出错。
这种模型的问题就是太多的线程会减低软件的运行效率。
线程和进程的成本
普通的线程,需要消耗1M的堆栈
http://www.cnblogs.com/PurpleTide/archive/2010/11/12/1875763.html
多进程和多线程的优缺点...
http://blog.163.com/ymguan@yeah/blog/static/140072872201147832740/
针对这个问题,有两类架构解决它:基于callback和coroutine的架构。
Callback- 非阻塞/异步IO
<pre class="csharpcode" name="code" style="white-space: pre-wrap; word-wrap: break-word;font-size:12px; font-family: consolas, 'Courier New', courier, monospace; line-height: 26px; background-color: rgb(255, 255, 255);"><span class="kwrd" style="color: rgb(0, 0, 255);">var</span> file = open(‘my.txt’);<span class="kwrd" style="color: rgb(0, 0, 255);">var</span> data = file.read(); <span class="rem" style="color: rgb(0, 128, 0);">//block</span>sleep(1);print(data); //block
<pre class="csharpcode" name="code" style="white-space: pre-wrap; word-wrap: break-word;font-size:12px; font-family: consolas, 'Courier New', courier, monospace; line-height: 26px; background-color: rgb(255, 255, 255);">fs.open(‘my.txt’,<span class="kwrd" style="color: rgb(0, 0, 255);">function</span>(err,data){setTimeout(1000,<span class="kwrd" style="color: rgb(0, 0, 255);">function</span>(){console.log(data);}}); //non-block
这种架构的好处是performance会比较好,缺点是编程复杂,把以前连续的流程切成了很多片段。另外也不能充分发挥多核的能力。
Coroutine-协程
非阻塞I/O模型协程(Coroutines)使得开发者可以采用阻塞式的开发风格,却能够实现非阻塞I/O的效果隐式事件调度,
简单来说:协程十分轻量,可以在一个进程中执行有数以十万计的协程,依旧保持高性能。
- 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。
- 线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。
- 协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里调度。
堆和栈的区别请参看:http://www.cnblogs.com/ghj1976/p/3623037.html
协程和线程的区别是:协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任。
执行协程只需要极少的栈内存(大概是4~5KB),默认情况下,线程栈的大小为1MB。
goroutine就是一段代码,一个函数入口,以及在堆上为其分配的一个堆栈。所以它非常廉价,我们可以很轻松的创建上万个goroutine,但它们并不是被操作系统所调度执行。
http://my.oschina.net/Obahua/blog/144549
通过这个过程,有效地实现了栈内存的无限使用。假设你并不是不断地在两个栈之间往返,通俗地讲叫栈分割,则代价是十分低廉的。
Coroutine模型 和 非阻塞/异步IO(callback)性能对比
从性能角度来说,callback的典型node.js和golang的性能测试结果,两者差不多,参考下面测试数据:
http://www.cnblogs.com/QLeelulu/archive/2012/08/12/2635261.html
风格之争:Coroutine模型 vs 非阻塞/异步IO(callback)
http://blog.csdn.net/kjfcpua/article/details/15809703
Goroutine(协程)为何能处理大并发?
http://www.cnblogs.com/ghj1976/p/3642513.html
python Eventlet
http://www.360doc.com/content/14/0522/00/8504707_379786818.shtml
Go-简洁的并发
http://www.yankay.com/go-clear-concurreny/
GOROUTINE性能测试
http://www.kankanews.com/ICkengine/archives/115285.shtml
Golang特性介绍
http://mryufeng.iteye.com/blog/576968/
并发编程
http://book.2cto.com/201301/14436.html
http://blog.csdn.net/ghj1976/article/details/27996095
Golang适合高并发场景的原因分析相关推荐
- Golang适合高并发场景的原理
典型的两个现实案例: 我们先看两个用Go做消息推送的案例实际处理能力 360消息推送的数据: 16台机器,标配:24个硬件线程,64GB内存 Linux Kernel 2.6.32 x86_64 ...
- <httpasyncclient>高并发场景报错分析与解决
本文总结讲解httpasyncclient使用过程中遇到的各种异常(java.net.ConnectException.java.net.SocketTimeoutException.java.uti ...
- 万字干货 | Python后台开发的高并发场景优化解决方案
嘉宾 | 黄思涵 来源 | AI科技大本营在线公开课 互联网发展到今天,规模变得越来越大,也对所有的后端服务提出了更高的要求.在平时的工作中,我们或多或少都遇到过服务器压力过大问题.针对该问题,本次公 ...
- 分布式锁和mysql事物扣库存_这个是真的厉害,高并发场景下的订单和库存处理方案,讲的很详细了!...
前言 之前一直有小伙伴私信我问我高并发场景下的订单和库存处理方案,我最近也是因为加班的原因比较忙,就一直没来得及回复.今天好不容易闲了下来想了想不如写篇文章把这些都列出来的,让大家都能学习到,说一千道 ...
- java分布式库存系统_这个是真的厉害,高并发场景下的订单和库存处理方案,讲的很详细了!...
前言 之前一直有小伙伴私信我问我高并发场景下的订单和库存处理方案,我最近也是因为加班的原因比较忙,就一直没来得及回复.今天好不容易闲了下来想了想不如写篇文章把这些都列出来的,让大家都能学习到,说一千道 ...
- 干货 | Python后台开发的高并发场景优化解决方案
嘉宾 | 黄思涵 来源 | AI科技大本营在线公开课 互联网发展到今天,规模变得越来越大,也对所有的后端服务提出了更高的要求.在平时的工作中,我们或多或少都遇到过服务器压力过大问题.针对该问题,本次公 ...
- 并发经验八年架构师:缓存在高并发场景下该如何问题
缓存一致性问题 当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象.这就比较依赖缓存的过期和更新策略.一般会在数据发生更改 ...
- 高并发场景下缓存的常见问题
作者介绍: 丁浪,非著名架构师.关注高并发.高可用的架构设计,对系统服务化.分库分表.性能调优等方面有深入研究和丰富实践经验.热衷于技术研究和分享. 声明:版权归丁浪作者本人所有,转载请联系作者本人 ...
- 本地缓存需要高时效性怎么办_缓存在高并发场景下的常见问题
缓存一致性问题 当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象.这就比较依赖缓存的过期和更新策略.一般会在数据发生更改 ...
最新文章
- 用python画出小人发射爱心_小人发射爱心biu简笔画表情-biu小人简笔画表情动态完整版-东坡下载...
- PHP 常用函数及其它功能
- 2015年10月13日
- JEECG(三) JEECG minidao如何封装自己的 多表联合查询 分页查询
- img 转esxi vmdk_KVM qcow2、raw、vmdk等镜像格式和转换
- 修改功能(Ajax版)
- 结构张量 matlab 图像,图像处理中 结构张量(structure tensor)
- graphpad做单因素方差分析_GraphPad中国官网 - Prism 8 统计指南 - 单因素方差分析
- 给视频局部添加马赛克,怎么调整马赛克位置
- 劫持 64 位静态程序 fini_array 进行 ROP 攻击
- NSA方程式泄漏工具包浅析
- 软件调试之查找、定位和解决问题
- 互联网产品运营必备工具大全
- Packet Tracer 5.0建构CCNA实验攻略(12)——PPP
- find_package()快速理解
- 网络安全乱流,超级保护才是根本
- 数据库到底是什么?举例MySQL给你讲明白
- 测序总结,高通量测序名词
- 【python】提高图像质量
- Maven知识点总结(初学者)
热门文章
- ipad怎么连接电脑_蓝牙的使用,蓝牙耳机怎么连接手机,怎么连接电脑
- Nginx重启时丢失nginx.pid文件解决方法nginx: [emerg] open() “/var/run/nginx/nginx.pid“ failed (2: No such fi
- 【自动驾驶/opencv】32.交通灯颜色提取的难点
- 【opencv】21.图像处理为什么要归一化
- Python-OpenCV 处理视频(一): 输入输出
- apache commons常用工具类
- 入门 Webpack,看这篇就够了
- 解密Redis持久化
- Spring - Java/J2EE Application Framework 应用框架 第 10 章 使用JDBC进行数据访问
- JVM 调优 —— GC 长时间停顿问题及解决方法