为什么要旗帜鲜明地反对 orm 和 sql builder

这个问题在五六年前和前同事讨论过,没想到这么多年过去了,又要跟其他工程师再讨论一遍,有点恍如隔世。 因为我比较懒,所以记录一篇文章,以后碰到类似的问题就不再掺和了。 toC 场景的系统大多要面对较高的 QPS,即使是小型/中型公司使用 MySQL,没有那么高的查询量,单表数据在百万量级也属常见。 无状态的服务当前用 k8s 的 HPA 能力能够做到很好的扩容,结合基本的优化知识,大多数问题能够较好地被初/中级工程师解决。但 DB 一直是非常脆弱的一环,只要一个工程师不慎将不带索引的查询代码带上线 ,就会导致线上事故。这样的事故在各家公司都不少。哦,当然,公司为了自己的形象考虑,这样的低级事故一般是不对外说的。

Go 语言的 GC 实现分析

注:本文只作了解,不建议作为面试题考察。 武林秘籍救不了段错误 包教包会包分配在各种流传甚广的 C 语言葵花宝典里,一般都有这么一条神秘的规则,不能返回局部变量: int * func(void) { int num = 1234; /* ... */ return # } duang!当函数返回后,函数的栈帧(stack frame)即被销毁,引用了被销毁位置的内存轻则数据错乱,重则 segmentation fault。 经过了八十一难,终于成为了 C 语言绝世高手,还是逃不过复杂的堆上对象引用关系导致的 dangling

自动调整 GOGC 优化 GO 的 GC CPU 占用

Uber 最近发了一篇文章,主要讲的是在核心服务上动态调整 GOGC 来降低 GC 的 mark 阶段 CPU 占用。基本可以做到有效果,低风险,可扩展,半自动化。 Uber 当前的服务规模大概是几千微服务,基于云上的调度基础设施来进行部署。大部分服务是 GO 写的,这篇文章的作者是做 Maps Production Engineering,这个组之前帮一些 Java 系统调整过 GC 参数(这应该就是他们帮 Go 做优化想的也是怎么调整参数的出发点吧)

为什么你不应该接受有 race 的代码

在任何语言的并发编程场景中,都有 race 问题,现代语言为了解决 race 问题有两种思路,一种是像 rust 那样的通过所有权+Sync/Send 限制用户尽量无法写出带 race 的代码;一种是像 Go 这样,通过 race detector 在测试期间检查数据竞争问题。 Go 的 race detector 设计决定了其无法在线上环境开启,而很多公司的项目上线前其实是没有 race test 的环节的,这就导致了一些 Gopher

是什么影响了我的接口延迟

之前在做性能优化分享的时候,经常会说接口延迟大幅上升时,应该先去看看 pprof 里的 goroutine 页面,看看 goroutine 是不是阻塞在什么地方了(比如锁),如果确实是这样,那就去解决这个阻塞问题,可以大幅度优化接口的延迟。 如果我们只是做工程,知道上面这个简单的结论就可以了,最近在一个中年人技术群里,一位前同事问了这么个问题,《Systems Performance》这本书里有一个 USE 方法论,其中提到了一个 Saturation (饱和度)的概念,这个和 Utilization 有啥区别?实际工作中有把 Saturation 监控起来的么?