0%

写在前面:

最近看到了一篇讲 Rust 如何对框架进行抽象的文章,写得非常好,这两天抽空翻译了一下。

原文:https://tokio.rs/blog/2021-05-14-inventing-the-service-trait

正文

Tower是一个模块化和可重复使用的用来构建 client 和 server 的组件库。其核心是Service特性。一个Service是一个异步函数,它接受一个请求并产生一个响应。然而,Tower设计的某些方面可能不是那么一目了然。

与其解释今天存在于Tower中的Service特性,不如来看看Service背后的设计考量。让我们试试看,如果今天重新设计实现它,我们会怎么做。

阅读全文 »

缘起

最近想尝试在 Golang 里面实现clock_gettimeCLOCK_REALTIME_COARSECLOCK_MONOTONIC_COARSE,正好深入研究了下 time.Now的实现,还机缘巧合下顺便优化了一把time.Now(虽然最终提交的是 Ian 大佬的版本)。

在这里记录下来整个过程,以供查阅。

阅读全文 »

Golang 的泛型实现已经正式合并到 master 分支上啦,之后也会在 master 分支上进行开发,那么作为期待这个 feature 许久的 gopher,也想第一时间看看到底是如何实现的。

阅读全文 »

有多少人工就有多少智能。 ——鲁迅

缘起

众所周知,字节跳动内部主要使用 Thrift,为了更好地掌控生成代码,我们用 Go 自己实现了 Thrift 代码生成工具。

而我们的故(shi)事(gu),正是由一次重构开始……

阅读全文 »

缘起

最近 Go 1.15 发布了,我也第一时间更新了这个版本,毕竟对 Go 的稳定性还是有一些信心的,于是直接在公司上了生产。

结果,上线几分钟,就出现了 OOM,于是 pprof 了一下 heap,然后赶紧回滚,发现某块本应该在一次请求结束时被释放的内存,被保留了下来而且一直在增长,如图(图中的 linkBufferNode):

火焰图

这次上线的变更只有 Go 版本的升级,没有任何其它变动,于是在本地开始测试,发现在本地也能百分百复现。

阅读全文 »

缘起

这几天在重构某段代码后,做了一次性能测试,火焰图中发现了一个十分奇怪的runtime.newobject的调用,大致占用2%,而找遍了整段代码都没有发现有新建对象相关的逻辑。于是迫不得已,祭出了汇编大法,终于定位到了问题所在。这篇文章会使用一段最小可复现的代码来分享这个问题以及背后的原因。

阅读全文 »

最近在研究性能优化的时候,看到了 golang runtime 包下的一个文档HACKING.md觉得颇有意思,读完之后觉得对于 runtime 的理解更上一层,于是想着翻译一下。

本章内容会有一定深度,需要有一定基础的读者,限于篇幅在这里不可能完全展开各个细节。

这一篇文档面向的读者是 runtime 的开发者,所以有很多内容在我们普通使用中是接触不到的。

阅读全文 »