TGViewer
Laisky's Notes Laisky's Notes @laiskynotes · 3.34K subscribers
Post #376 3.51K
「Here's how CockroachDB keeps your database from collapsing under load」

其实是一篇关于 Golang Goroutine Scheduler 的文章。众所周知,Go 的 Goroutines 并没有优先级,对于类似于数据库这样的应用,如何在高并发的情况下保证重要任务的执行就会面临挑战。这篇文章就是介绍了 CockroachDB 的做法,通过在原生的 Go Scheduler 外增加一层名为 Admission Control 的调度层,来实现了 Goroutines 的优先级调度。

核心思想就是不要再将大量的 Goroutines 直接交给 Go Scheduler 去排队。而是先在应用层的 Admission Control 内的优先级队列里排队,只将当前系统能够负载的高优先级任务交给 Go Scheduler 去执行,这样就可以保证在高负载下系统仍然能保证重要任务的可用性。

具体的优先级实现有很多很巧妙的设计。比如优先级系统区分为 Token Based 和 Slot Based。对于 CPU 型任务,采用令牌桶算法,根据可用资源的情况来生成令牌,并且分发给任务使用,如果有任务超额使用了令牌,则扣减总的令牌数。而对于 I/O 型任务,因为 I/O 操作会阻塞 Goroutine,所以采用了 Slot Based 的方式,根据当前系统的 I/O 负载情况来动态调整 slot 的数量。而且动态调整的时间间隔也是动态变化的,尽量减少 CPU 消耗。

还观察到,即使使用这个优先级系统提交任务,偶尔也还是会导致 Go Scheduler 过载。而优化方法是将调度下一个任务的逻辑放到 task 的执行逻辑中,这样就只有在 task 被 Go Scheduler 实际交给 P & M 运行时,才会进行调度下一个任务的逻辑,从而确保了 task 不会在 Go Scheduler 堆积。

Refs:

* Source Code: cockroach Admit
* Go scheduler: Ms, Ps & Gs
  • ❤ 12
  • 🥰 1
  • 🤯 1
More from @laiskynotes
  1. Oct 6, 2026https://x.com/LaiskyCai/status/2107307813727060123?s=20 codex 最近有三个完全免费的工具,结合之后可以发挥非常强大能力:…
  2. Sep 15, 2026学习了一下 OpenAI 推出的 Agents API https://openai.com/index/introducing-the-agents-api/ 众所周知 Agen…
  3. Aug 28, 2026前阵子读了本很有趣的书,侯杨方的《这才是丝绸之路》。作者抛开抽象的文本溯源,而是采用实地考察的方式,重走了真实的丝绸之路。此书给我最大的感触就是:真实而且符合常理。 在我以前的想象…
  4. Jun 5, 2026读完 Mario Puzo 的《教父 The Godfather》三部曲小说,才意识到自己当年年轻时根本完全就没看懂电影《教父》。然后又去把电影重温了一遍,才发现原来电影里有很多细…
  5. May 22, 2026记录一下最近遇到的一个糟心事儿。 最近两个月开始又开始找工作机会,总的来说很不顺利,托朋友联系了两个内推也是石沉大海。(各位要是有远程工作的机会也请联系 job@laisky.co…
  6. May 14, 2026作为一个从业十多年的程序员,我已经半年没手写过一行代码了。上个月大概提交了 20 万行,这个月大概 4 万行。 昨天认真考虑了一下这个现象,我个人认为,虽然 AI 仍然存在显然的不…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →