通用类
1. 代码实现类
1.1 内存管理
1.1.1【必须】切片长度校验
- 在对slice进行操作时,必须判断长度是否合法,防止程序panic
1 | // bad: 未判断data的长度,可导致 index out of range |
1 | // bad: 未判断data的长度,可导致 index out of range |
得益于了 Go 运行时高效的内置内存管理,我们通常能够在程序中优先考虑正确性和可维护性,而不需要过多考虑如何进行分配的细节。不过,有时我们可能会发现代码中的性能瓶颈,并希望进行更深入的研究。
任何使用 -benchmem
标志运行基准测试的人都会在输出中看到 allocs/op
的统计。在这篇文章中,我们将看看什么算作一个 alloc,以及我们可以做什么来影响这个数字。1
BenchmarkFunc-8 67836464 16.0 ns/op 8 B/op 1 allocs/op
Go 以其并发性著称,深受人们喜爱。go 运行时管理轻量级线程,称为 goroutines。goroutine 的编写非常快速简单。
你只需在你想异步执行的函数前输入 go
,程序就会在另一个线程中执行。
听起来很简单?
goroutines 是 Go 编写异步代码的方式。
重要的是要了解 goroutine 和并发的工作原理。Go 提供了管理 goroutine 的方法,使它们在复杂的程序中更容易管理和预测。
因为 goroutine 非常容易使用,所以它们很容易被滥用。
本文翻译自 2019 年 Daniel Borkmann 和 Martynas Pumputis 在 Linux Plumbers Conference 的一篇分享: Making the Kubernetes Service Abstraction Scale using eBPF 。 翻译时对大家耳熟能详或已显陈旧的内容(K8s 介绍、Cilium 1.6 之前的版本对 Service 实现等)略有删减,如有需要请查阅原 PDF。
实际上,一年之后 Daniel 和 Martynas 又在 LPC 做了一次分享,内容是本文的延续:Cilium:基于 BPF/XDP 实现 K8s Service 负载均衡
K8s 当前重度依赖 iptables 来实现 Service 的抽象。对于每个 Service 及其 backend pods,在 K8s 里会生成很多 iptables 规则。例如 5K 个 Service 时,iptables 规则将达到 25K 条,导致的后果:
本文将介绍如何基于 Cilium/BPF 来解决这些问题,实现 K8s Service 的大规模扩展。