使用Linux tracepoints、perf 和 eBPF 跟踪包的旅程

原文: Tracing a packet journey using Linux tracepoints, perf and eBPF

很久以来我一直在寻找一个底层的Linux网络调试工具。
我一直在寻找一个低级的Linux网络调试工具已经有一段时间了。Linux 允许使用虚拟接口(virtual interface)和网络命名空间(network namespace)的组合来构建直接在主机上运行的复杂网络。当出现问题时,故障排除相当乏味。如果这是 L3 路由问题,mtr则很有可能会有所帮助。但是,如果这是一个较低层的问题,我通常会手动检查每个接口/网桥/网络命名空间/iptables并启动几个tcpdump,以尝试了解正在发生的事情。如果您事先不了解网络设置,这可能感觉像走迷宫。

阅读全文

mping: 使用新的icmp库实现探测和压测工具

项目地址: mping

最近在网络探测的分析中,需要做一个使用ICMP协议进行压测的工具, ping或者fping多多少少都不满足需求,所以需要自己写一个。

使用golang.org/x/net/icmp很容易的实现基于ICMP的工具, go-ping就算了,既缺乏维护性能也不佳。所以我最初使用Go官方扩展库实现了这个工具,不过这几天我看到Matt Layher刚推出一个新的ICMP库:mdlayher/icmpx, 我决定尝试一下。Matt Layher 是Go网络编程的专家,写了好几个网络相关的库,所以我对他的库还是蛮有信心的。

阅读全文

Go 1.21 中的泛型推断

原文: understanding Go 1.21 generics type inference

Go 1.21 已经发布了,带来了一系列的改进,例如更好的泛型类型推断(本文的内容);新的内置函数min`,maxclear`;以及标准库中的几个新软件包(maps`,slices`,cmp`,log/slogtesting/slogtest`)。在这里阅读完整的发行说明。

至少对我们Encore来说,特别感兴趣的是对泛型类型推断的改进,因为它会影响Encore的静态分析的工作方式。但是,我们认为发行说明很难理解,因此本文通过更多解释和示例介绍这次的变更。

我们也刚刚发布了支持 Go 1.21 的 Encore v1.24,所以这是尝试这些新变化的好方法。

阅读全文

真实世界的Go设计模式 - 对象池模式

对象池(object pool pattern)是一种设计模式。一个对象池包含一组已经初始化过且可以使用的对象,而可以在有需求时创建和销毁对象。池的用户可以从池子中取得对象,对其进行操作处理,并在不需要时归还给池子而非直接销毁它。这是一种特殊的工厂对象。

阅读全文

真实世界的Go设计模式 - 原型模式

*原型模式(Prototype Pattern)是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的“原型”,这个原型是可定制的。

如果你有一个对象,并希望生成与其完全相同或者类似的一个复制品,你该如何实现呢?首先你必须新建一个属于相同类的对象,或者类似的对象,然后你必须遍历原始对象的所有成员变量,并将成员变量值复制到新对象中。在Go生态圈中,我们常常使用下面的库来做这份工作。

阅读全文

真实世界的Go设计模式 - 工厂模式

工厂模式(Factory pattern)是一种创建型模式,就是用来创建新对象的一种设计模式,它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。

23种设计模式中包含抽象工厂模式,工厂方法模式,其他也有人总结出简单工厂模式。这个工厂大量的依赖接口、抽象类和具体的类实现。在Go中,才不会有这么复杂的工厂创建模式,Go中最常见的工厂模式类似简单工厂模式,而且一般都是通过New或者NewXXX来实现。

阅读全文