Random Thoughts
Recent content on Random Thoughts
马上订阅 Random Thoughts RSS 更新: https://blog.joway.io/index.xml
重新思考 Go:了解程序在线上是如何运行的
重新思考 Go 系列:这个系列希望结合工作中在 Go 编程与性能优化中遇到过的问题,探讨 Go 在语言哲学、底层实现和现实需求三者之间关系与矛盾。
前言
过去一段时间,在大量的线上服务 case study 过程中,逐步深入了解了如今的业务 Go 进程是如何在一系列繁杂的基础设施之上运行的。有些表现在意料之中,也有一些出乎意料的发现。
我很喜欢一个叫做「 机械同理心/Mechanical Sympathy 」的概念,大体的意思是你必须深刻了解你的程序/机械装置是在一种怎么样的环境下运行的,设身处地地在这个运行环境下去思考,才能帮助你写出更好的程序,或是解答一些奇怪现象的原因。
本文希望达到的目的,也是构建这份「机械同理心」。
程序能使用多少计算资源?
对于很多人来说,这个问题似乎非常简单,大多的计算平台都会要求你建立服务的时候就指定好「需要的计算资源」,但这与你的「能使用的计算资源」是两件事情。实际上这个问题的复杂性远远超出大部分人现象,甚至都不是一个常量,也无法使用公式简单计算。抽象地讲,这取决于天时地利人和。
- 「天时」指的是内核 Cgroups 以及容器调度平台的基本原理和参数设置。这是硬指标,大部分时候也是常量。
- 「地利」指的是部署的实际物理机的繁忙程度。
- 「人和」指的是写程序的人得在能够有更多计算资源可用的时候真的让自己程序用上这些计算资源。
接下来我们逐步分节来详细探究这个问题。
被封装的 CPU 谎言
在 Oncall 中常见的一个误解是,研发人员在容器平台上申请了 4 核 CPU 的容器,然后自然而然认为自己的程序最多只能使用 4 个 CPU,于是按照这个计算能力去估算需要的容器数量,以及对自己程序套上这个假设进行参数调优。
上线后,进到容器用 top 一看,各项指标确实是按照 4 核的标准在进行。甚至用 cat /proc/cpuinfo
一看,不多不少刚好看到有 4 个 CPU。。。
但实际上,这一切都只是容器平台为你封装出来的一个美好的假象。之所以要把这个假象做的这么逼真,只是为了让你摆脱编程时的心智负担,顺便再让那些传统的 Linux 观测工具在容器环境中也能正常运行。
但是假象终究不是真相,如果有一天你遇到一些疑难问题或是想要去编写极致性能的代码,你会发现这些封装出来的抽象把你的理解带的有多偏。
我到底能同时使用多少个 CPU ?
在 K8s 的环境里,CPU 是一个时间单位而非数量。正常情况下,一个拥有 64 核心的机器,你最多能同时使用的理论 CPU 个数是 64 ,即便你创建容器的时候申请的是 4 核。