抢占抢占 # 从 Go 1.14 开始,通过使用信号,Go 语言实现了调度和 GC 过程中的真“抢占“。抢占流程由抢占的发起方向被抢占线程发送 SIGURG
信号。当被抢占线程收到信号后,进入 SIGURG 的处理流程,将 asyncPreempt
的调用强制插入到用户当前执行的代码位置。本节会对该过程进行详尽分析。抢占发起的时机 # 抢占会在下列时机发生: STW 期间 在 P 上执行 safe
point 函数期间
看了看日历,现在已经是 2021 年了,偶尔还是能看到有人在发诸如 《http body 未关闭导致线上事故》,或者 《sql.Rows
未关闭半夜惊魂》类的文章,令人有一种梦回 2015 的感觉。
在这个 Go
的静态分析工具已经强到烂大街的时代,写这些文章除了暴露这些人所在的公司基础设施比较差,代码质量低以外,并不能体现出什么其它的意思了。毕竟哪怕是不懂怎么读源码,这样的问题你
Google 搜一下也知道是怎么回事了。
特别是有些人还挂着大公司的 title,让人更加不能理解。下面是简单的静态分析工具的科普,希望给那些还在水深火热的 Gopher 们送点解药。
为了能和读者互动,之前 blog 一直是有 gitalk 的。
不过 gitalk 似乎是用了 github deprecated 的 API,现在频繁地往我邮箱发邮件,还是很烦的:
之前想换 gitalk 的时候发现并没有什么好的竞品,不过毕竟已经 2021 了,让我发现了这个东西:https://utteranc.es/,还有这个东西:
https://giscus.app/。
utterances 和 gitlak 差不多,
从毕业至今,已经待过四家公司,算上实习期间三月游的公司差不多已经快十家了,时常会碰到一些有意思的言论。
在某司的时候就经常听到人说,“我们在 T 姓巨头的时候”,“我们在 A 姓巨头的时候”,“我们在 B
姓巨头的时候”,以任意一家巨头公司作为观点的前缀,显得观点就特别有分量。仔细想想,实习期间我也是在这些所谓的巨头公司待过的,我怎么就没有想到可以在自己编的故事前面加上这是
X 家的事情,所以还是他们比较机智。
大公司里的平均水平高,牛人多,并不代表进去的就一定是牛人,还有不少认不清是自己强还是公司机制强的混子。
即使是在大公司,也会有很多垃圾系统,他们内部没有限流,没有熔断,没有降级,也没有过载保护。但是他们却不会崩溃,
这次去 Gopher China 和不少老朋友见了个面,还有不少在微信上认识已久,一直没见过面的网友。同时也和各个公司的一线开发们聊了聊,互相交流了彼此使用
Go 时的一些心得和痛点。
综合近期了解的一些相关分享,我把到目前为止见到的,不那么常见的,各方对 Go 的优化和 hack
集中在这篇文章里。因为考虑到一些公司情况比较特殊,所以本文中列出的点就不标记是哪个公司做的了。未来他们觉得时机成熟应该也会自己出来做一些分享。
网络方面
当前 Go 的网络抽象在效率上有些低,每一个连接至少要有一个 goroutine 来维护,有些协议实现可能有两个。因此 goroutine 总数 = 连接数