thread-per-core

前面看了一篇文章讲io_uring的,里面提到了seastar,一个基于future和promise的C++高性能服务端应用框架。与之前看过的rust async-std是类似的,可以让并发代码更容易编写。

不仅如此,seastar为了追求极致性能,使用了thread-per-core模型,基于消息传递,避免加锁以及线程切换带来的损耗。这个就比Go先进了。在Go里因为gorouting创建得太容易,常常让人忘记了对共享对象的访问还是会产生竞争的。gorouting之间最好通过channel来传递数据,但是常常会忘记。相较于传递数据,seastar则采用了传递操作的方式,让拥有数据的一方完成数据的处理,只返回结果即可。

因为C++底层库的不完备性,seastar作为应用框架自行发明了很多轮子,使用者必须按照这个框架,并使用这些轮子才行。所以使用者必须改造现有代码以及所有依赖的模块,以适应这个框架。除非需要极致性能,否则这个代价有点高。

目前C++已经不太流行了,Rust正当其道。seastar的前开发人员把thead-per-core的理念带到了rust,开发了Glommio。因为基于现有的rust async/wait机制,更容易跟其它模块整合。

为了避免资源竞争而在线程之间传递操作,其实很常见。比如很早以前研究过Chrome的代码,其中的task系统就是这样的。浏览器内部各种交互很复杂,Rust就是为了写firfox而诞生的。如果没有task调度这样的机制,chrome也是玩不转的。