Go进阶- Runtime

·  阅读 222

毛剑分享

1.毛剑的笔记结构

怎么找文档 怎么学新知识?

例如做一个存储、资源调度系统

  • 国内的一些infoQ arcsubmit 网站搜索大厂怎么做的? 将国内的资源积累一波
    • 各家公司的一些实践、经验、分享
      • 国外的方向基本是领先国内5-10年
    • 例如Taobao FileSystem ---OSS pangu、腾讯Sharp(h265)
  • 国外 Facebook (Haystack、Warm Blob Strogage)、Google (GFS、GFS v2)、Uber、Netflix、Amazon、Linkerin)
    • ppt上的讲的太少了 还是要参考他们的详细文档和相关论文
    • 关注这些科技公司的Blog(里面有太多的细节)
    • 关注相关的公众号 国内会有一些翻译
  • 由点到面 将上下游的资源关联起来 都会关注一下
    • 做存储要解决CDN 边缘的回源命中率
    • 上游的CDN 静态加速 图形图片的处理 裁剪缩略

Goroutine

goroutine 定义

Goroutine 是一个与其他 goroutines 并行运行在同一地址空间的 Go 函数或方法。

  • 不同的goroutines 共享内存地址
  • 一个运行的程序由一个或更多个 goroutine 组成。

  • 它与线程、协程、进程等不同。

    • goroutine 轻量级 速度快 开销低 用户态的
  • Goroutines 在同一个用户地址空间里并行独立执行 functions,channels 则用于 goroutines 间的通信和同步访问控制。

  • go的runtime托管的一块结构体(runtimed(go内核态)--->taskstruct(linux内核态))

进程中 有 多个线程 (共享内存空间)

goroutine 和 thread 的区别?

内存占用

  • 创建一个 goroutine 的栈内存消耗为 2 KB(Linux AMD64 Go v1.4后),运行过程中,如果栈空间不够用,会自动进行扩容。

    • stack存放 局部变量和函数的调用数据
    • guard page 避免连续内存空间, 避免爆栈的影响(thread1操作thread2的栈)
  • 创建一个 thread 为了尽量避免极端情况下操作系统线程栈的溢出,默认会为其分配一个较大的栈内存( 1 - 8 MB 栈内存,POSIX Thread),而且还需要一个被称为 “guard page” 的区域用于和其他 thread 的栈空间进行隔离。

  • 而栈内存空间一旦创建和初始化完成之后其大小就不能再有变化,这决定了在某些特殊场景下系统线程栈还是有溢出的风险。

创建/销毁

  • 线程创建和销毀都会有巨大的消耗,是内核级的交互(trap)。
  • 进入内核所消耗的性能代价比较高,开销较大。goroutine 是用户态线程,是由 go runtime 管理,创建和销毁的消耗非常小。

调度切换

  • 抛开陷入内核,线程切换会消耗 1000-1500 纳秒(上下文保存成本高,较多寄存器,公平性,复杂时间计算统计),一个纳秒平均可以执行 12-18 条指令。
  • 所以由于线程切换,执行指令的条数会减少 12000-18000。goroutine 的切换约为 200 ns(用户态、3个寄存器),相当于 2400-3600 条指令。因此,goroutines 切换成本比 threads 要小得多。

复杂性

  • 线程的创建和退出复杂,多个thread间通讯复杂(share memory)。
  • 不能大量创建线程(参考早期的 httpd),成本高,使用网络多路复用,存在大量callback(参考twemproxy、nginx 的代码)。对于应用服务线程门槛高,例如需要做第三方库隔离,需要考虑引入线程池等。

GMP 调度模型

Work-stealing 调度算法

References

https://medium.com/a-journey-with-go/go-goroutine-os-thread-and-cpu-management-2f5a5eaf518a
http://www.sizeofvoid.net/goroutine-under-the-hood/
https://zhuanlan.zhihu.com/p/84591715
https://rakyll.org/scheduler/
https://zhuanlan.zhihu.com/p/248697371
https://zhuanlan.zhihu.com/p/68299348
https://blog.csdn.net/qq_25504271/article/details/81000217
https://blog.csdn.net/ABo_Zhang/article/details/90106910
https://zhuanlan.zhihu.com/p/66090420
https://zhuanlan.zhihu.com/p/27056944
https://www.cnblogs.com/sunsky303/p/11058728.html
https://www.cnblogs.com/zkweb/p/7815600.html

https://morsmachine.dk/netpoller
https://segmentfault.com/a/1190000022030353?utm_source=sf-related
https://www.jianshu.com/p/0083a90a8f7e
https://www.jianshu.com/p/1ffde2de153f
https://www.jianshu.com/p/63404461e520
https://www.jianshu.com/p/7405b4e11ee2
https://www.jianshu.com/p/518466b4ee96
https://zhuanlan.zhihu.com/p/59125443
https://www.codercto.com/a/116486.html
https://www.jianshu.com/p/db0aea4d60ed
https://www.jianshu.com/p/ef654413f2c1

https://medium.com/a-journey-with-go/go-how-does-a-goroutine-start-and-exit-2b3303890452
https://medium.com/a-journey-with-go/go-g0-special-goroutine-8c778c6704d8
https://medium.com/a-journey-with-go/go-how-does-go-recycle-goroutines-f047a79ab352
https://medium.com/a-journey-with-go/go-what-does-a-goroutine-switch-actually-involve-394c202dddb7
http://xiaorui.cc/archives/6535
http://xiaorui.cc/archives/category/golang
https://docs.google.com/document/d/1lyPIbmsYbXnpNj57a261hgOYVpNRcgydurVQIyZOz_o/pub

https://medium.com/a-journey-with-go/go-asynchronous-preemption-b5194227371c
https://medium.com/a-journey-with-go/go-goroutine-and-preemption-d6bc2aa2f4b7
http://xiaorui.cc/archives/6535
https://medium.com/a-journey-with-go/go-gsignal-master-of-signals-329f7ff39391
https://www.jianshu.com/p/1ffde2de153f
https://kirk91.github.io/posts/2d571d09/
http://yangxikun.github.io/golang/2019/11/12/go-goroutine-stack.html
https://www.ardanlabs.com/blog/2017/05/language-mechanics-on-stacks-and-pointers.html
https://www.ardanlabs.com/blog/2017/05/language-mechanics-on-escape-analysis.html
https://zhuanlan.zhihu.com/p/237870981

https://www.ardanlabs.com/blog/2017/05/language-mechanics-on-stacks-and-pointers.html
https://blog.csdn.net/qq_35587463/article/details/104221280
https://www.jianshu.com/p/63404461e520
https://www.do1618.com/archives/1328/go-%E5%86%85%E5%AD%98%E9%80%83%E9%80%B8%E8%AF%A6%E7%BB%86%E5%88%86%E6%9E%90/
https://www.jianshu.com/p/518466b4ee96
https://zhuanlan.zhihu.com/p/28484133
http://yangxikun.github.io/golang/2019/11/12/go-goroutine-stack.html
https://kirk91.github.io/posts/2d571d09/
https://zhuanlan.zhihu.com/p/237870981
https://agis.io/post/contiguous-stacks-golang/

https://docs.google.com/document/d/13v_u3UrN2pgUtPnH4y-qfmlXwEEryikFu0SQiwk35SA/pub
https://docs.google.com/document/d/1lyPIbmsYbXnpNj57a261hgOYVpNRcgydurVQIyZOz_o/pub
https://zhuanlan.zhihu.com/p/266496735
http://dmitrysoshnikov.com/compilers/writing-a-memory-allocator/
https://studygolang.com/articles/22652?fr=sidebar
https://studygolang.com/articles/22500?fr=sidebar
https://www.cnblogs.com/unqiang/p/12052308.html
https://blog.csdn.net/weixin_33869377/article/details/89801587?utm_medium=distribute.pc_relevant.none-task-blog-title-7&spm=1001.2101.3001.4242

https://www.cnblogs.com/smallJunJun/p/11913750.html
https://zhuanlan.zhihu.com/p/53581298
https://zhuanlan.zhihu.com/p/141908054
https://zhuanlan.zhihu.com/p/143573649
https://zhuanlan.zhihu.com/p/145205154
https://www.jianshu.com/p/47735dfb0b81
https://zhuanlan.zhihu.com/p/266496735
https://dave.cheney.net/high-performance-go-workshop/dotgo-paris.html#memory-and-gc
https://juejin.cn/post/6844903917650722829

https://spin.atomicobject.com/2014/09/03/visualizing-garbage-collection-algorithms/
https://zhuanlan.zhihu.com/p/245214547
https://www.jianshu.com/p/2f94e9364ec4
https://www.jianshu.com/p/ebd8b012572e
https://www.ardanlabs.com/blog/2018/12/garbage-collection-in-go-part1-semantics.html
https://segmentfault.com/a/1190000012597428
https://www.jianshu.com/p/bfc3c65c05d1
https://golang.design/under-the-hood/zh-cn/part2runtime/ch08gc/sweep/
https://zhuanlan.zhihu.com/p/74853110
https://www.jianshu.com/p/2f94e9364ec4
https://juejin.cn/post/6844903917650722829
https://zhuanlan.zhihu.com/p/74853110

https://www.jianshu.com/p/ebd8b012572e
https://www.jianshu.com/p/2f94e9364ec4
https://www.jianshu.com/p/bfc3c65c05d1
https://zhuanlan.zhihu.com/p/92210761
https://blog.csdn.net/u010853261/article/details/102945046
https://blog.csdn.net/hello_bravo_/article/details/103840054
https://segmentfault.com/a/1190000020086769
https://blog.csdn.net/cyq6239075/article/details/106412038
https://zhuanlan.zhihu.com/p/77943973
https://www.ardanlabs.com/blog/2018/12/garbage-collection-in-go-part1-semantics.html
https://www.ardanlabs.com/blog/2019/05/garbage-collection-in-go-part2-gctraces.html

https://www.ardanlabs.com/blog/2019/07/garbage-collection-in-go-part3-gcpacing.html
https://github.com/dgraph-io/badger/tree/master/skl
https://dgraph.io/blog/post/manual-memory-management-golang-jemalloc/


复制代码
分类:
阅读
标签: